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 相关文章推荐
在PHP3中实现SESSION的功能(三)
Oct 09 PHP
PHP 小心urldecode引发的SQL注入漏洞
Oct 27 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
jQuery+php实现ajax文件即时上传的详解
Jun 17 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
php实现encode64编码类实例
Mar 24 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
PHP引用返回用法示例
May 28 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
PHP7 echo和print语句实例用法
Feb 15 PHP
PHP架构及原理知识点详解
Dec 22 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常量的详解
2013/06/09 PHP
解析argc argv在php中的应用
2013/06/24 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
tp5(thinkPHP5框架)时间查询操作实例分析
2019/05/29 PHP
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
prototype Element学习笔记(篇一)
2008/10/26 Javascript
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
JavaScript 三种创建对象的方法
2009/10/16 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
jQuery增加和删除表格项目及实现表格项目排序的方法
2016/05/30 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
详解Javascript获取缓存和清除缓存API
2017/05/25 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
微信小程序MUI导航栏透明渐变功能示例(通过改变opacity实现)
2019/01/24 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
python中字符串前面加r的作用
2015/06/04 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
python中的global关键字的使用方法
2019/08/20 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
购房意向书范本
2014/04/01 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
2015年党建工作总结
2015/03/30 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python