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 相关文章推荐
关于BIG5-HKSCS的解决方法
Mar 20 PHP
PHP 身份证号验证函数
May 07 PHP
php生成略缩图代码
Jul 16 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
Jun 05 PHP
解析PHP汉字转换拼音的类
Jun 18 PHP
php session劫持和防范的方法
Nov 12 PHP
smarty获得当前url的方法分享
Feb 14 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
php防止用户重复提交表单
Nov 02 PHP
PHP中for循环与foreach的区别
Mar 06 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
PHP文件打开关闭及读写操作示例解析
Aug 06 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/12/03 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
如何快速的呈现我们的网页的技巧整理
2007/07/01 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
判断用户是否在线的代码
2011/03/05 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
javascript实现的多个层切换效果通用函数实例
2015/07/06 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
jQuery中绑定事件bind() on() live() one()的异同
2017/02/23 Javascript
AngularJS基于factory创建自定义服务的方法详解
2017/05/25 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
基于JavaScript实现贪吃蛇游戏
2020/03/16 Javascript
微信小程序实现抖音播放效果的实例代码
2020/04/11 Javascript
20招让你的Python飞起来!
2016/09/27 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python(TensorFlow框架)实现手写数字识别系统的方法
2018/05/29 Python
python中redis查看剩余过期时间及用正则通配符批量删除key的方法
2018/07/30 Python
python抓取搜狗微信公众号文章
2019/04/01 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
Python配置文件处理的方法教程
2019/08/29 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
django的autoreload机制实现
2020/06/03 Python
python 如何将office文件转换为PDF
2020/09/22 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
浅析CSS3 中的 transition,transform,translate之间区别和作用
2020/03/26 HTML / CSS
一站式跨境收款解决方案:Payoneer(派安盈)
2018/09/06 全球购物
组工干部演讲稿
2014/09/02 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
2014年圣诞节寄语
2014/12/08 职场文书
《童年的发现》教学反思
2016/02/18 职场文书
高中班主任工作总结(范文)
2019/08/20 职场文书