php 根据url自动生成缩略图并处理高并发问题


Posted in PHP onJanuary 23, 2014

服务器生成缩略图的时机一般分为两种:

1.上传文件时生成

优点:上传时就已经生成需要的缩略图,读取时不需要再判断,减少cpu运算。

缺点:当缩略图尺寸变化时或新增尺寸时,需要重新生成所有的缩略图。

2.访问时生成

优点:1.当有用户访问时才需要生成,没有访问的不用生成,节省空间。

2.当修改缩略图尺寸时,只需要修改设置,无需重新生成所有缩略图。

缺点:当缩略图不存在需要生成时,高并发访问会非常耗服务器资源。

虽然访问时生成会有高并发问题,但其他优点都比第一种方法好,因此只要解决高并发问题就可以。

关于如何根据url自动生成缩略图的原理及实现,可以参考我之前写的《php 根据url自动生成缩略图》。

高并发处理原理:

1.当判断需要生成图片时,在tmp/目录创建一个临时标记文件,文件名用md5(需要生成的文件名)来命名,处理结束后再将临时文件删除。

2.当判断要生成的文件在tmp/目录有临时标记文件,表示文件正在处理中,则不调用生成缩略图方法,而等待,直到临时标记文件被删除,生成成功输出。

修改的文件如下,其他与之前一样。

createthumb.php

<?php 
define('WWW_PATH', dirname(dirname(__FILE__))); // 站点www目录 require(WWW_PATH.'/PicThumb.class.php'); // include PicThumb.class.php 
require(WWW_PATH.'/ThumbConfig.php'); // include ThumbConfig.php 
$logfile = WWW_PATH.'/createthumb.log'; // 日志文件 
$source_path = WWW_PATH.'/upload/'; // 原路径 
$dest_path = WWW_PATH.'/supload/'; // 目标路径 
$path = isset($_GET['path'])? $_GET['path'] : ''; // 访问的图片URL 
// 检查path 
if(!$path){ 
exit(); 
} 
// 获取图片URI 
$relative_url = str_replace($dest_path, '', WWW_PATH.$path); 
// 获取type 
$type = substr($relative_url, 0, strpos($relative_url, '/')); 
// 获取config 
$config = isset($thumb_config[$type])? $thumb_config[$type] : ''; 
// 检查config 
if(!$config || !isset($config['fromdir'])){ 
exit(); 
} 
// 原图文件 
$source = str_replace('/'.$type.'/', '/'.$config['fromdir'].'/', $source_path.$relative_url); 
// 目标文件 
$dest = $dest_path.$relative_url; 
if(!file_exists($source)){ // 原图不存在 
exit(); 
} 
// 高并发处理 
$processing_flag = '/tmp/thumb_'.md5($dest); // 用于判断文件是否处理中 
$is_wait = 0; // 是否需要等待 
$wait_timeout = 5; // 等待超时时间 
if(!file_exists($processing_flag)){ 
file_put_contents($processing_flag, 1, true); 
}else{ 
$is_wait = 1; 
} 
if($is_wait){ // 需要等待生成 
while(file_exists($processing_flag)){ 
if(time()-$starttime>$wait_timeout){ // 超时 
exit(); 
} 
usleep(300000); // sleep 300 ms 
} 
if(file_exists($dest)){ // 图片生成成功 
ob_clean(); 
header('content-type:'.mime_content_type($dest)); 
exit(file_get_contents($dest)); 
}else{ 
exit(); // 生成失败退出 
} 
} 
// 创建缩略图 
$obj = new PicThumb($logfile); 
$obj->set_config($config); 
$create_flag = $obj->create_thumb($source, $dest); 
unlink($processing_flag); // 删除处理中标记文件 
if($create_flag){ // 判断是否生成成功 
ob_clean(); 
header('content-type:'.mime_content_type($dest)); 
exit(file_get_contents($dest)); 
} 
?>

源码下载地址:点击查看
PHP 相关文章推荐
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
Laravel框架表单验证详解
Sep 04 PHP
PHP中使用curl入门教程
Jul 02 PHP
WordPress后台中实现图片上传功能的实例讲解
Jan 11 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
Feb 15 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
PHP中使用mpdf 导出PDF文件的实现方法
Oct 22 PHP
laravel框架实现去掉URL中index.php的方法
Oct 12 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 PHP
php 字符串压缩方法比较示例
Jan 23 #PHP
php 生成短网址原理及代码
Jan 23 #PHP
解决php接收shell返回的结果中文乱码问题
Jan 23 #PHP
php弹出对话框实现重定向代码
Jan 23 #PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
Jan 22 #PHP
简单的php缓存类分享     php缓存机制
Jan 22 #PHP
一组PHP可逆加密解密算法实例代码
Jan 21 #PHP
You might like
php生成随机数或者字符串的代码
2008/09/05 PHP
PHP中的替代语法介绍
2015/01/09 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
php文件系统处理方法小结
2016/05/23 PHP
你需要知道的JavsScript可以做什么?
2007/06/29 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
你未必知道的JavaScript和CSS交互的5种方法
2014/04/02 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
极力推荐一款小巧玲珑的可视化编辑器bootstrap-wysiwyg
2016/05/27 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
javascript json对象小技巧之键名作为变量用法分析
2019/11/11 Javascript
[02:57]DOTA2亚洲邀请赛小组赛第四日 赛事回顾
2015/02/02 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python作用域用法实例详解
2016/03/15 Python
浅谈function(函数)中的动态参数
2017/04/30 Python
python清理子进程机制剖析
2017/11/23 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Python帮你识破双11的套路
2019/11/11 Python
Python Selenium参数配置方法解析
2020/01/19 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
团组织关系介绍信
2014/01/12 职场文书
文科生自我鉴定
2014/02/15 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
幼儿园国庆节活动总结
2015/03/23 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
解决pytorch-gpu 安装失败的记录
2021/05/24 Python
MySQL快速插入一亿测试数据
2021/06/23 MySQL