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 相关文章推荐
PHP与已存在的Java应用程序集成
Oct 09 PHP
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
PHP 模拟登陆MSN并获得用户信息
May 16 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
PHP 验证登陆类分享
Mar 13 PHP
php上传图片客户端和服务器端实现方法
Mar 30 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 PHP
Yii2框架数据验证操作实例详解
May 02 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留言本实例代码
2010/05/09 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
JavaScript触发器详解
2007/03/10 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
心扬JS分页函数代码
2010/09/10 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
2016/01/08 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
基于JavaScript实现弹幕特效
2020/08/27 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
vue单文件组件无法获取$refs的问题
2020/06/24 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
python+rsync精确同步指定格式文件
2019/08/29 Python
pandas将多个dataframe以多个sheet的形式保存到一个excel文件中
2019/10/10 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
python 如何对logging日志封装
2020/12/02 Python
CSS3 真的会替代 SCSS 吗
2021/03/09 HTML / CSS
植村秀加拿大官网:Shu Uemura加拿大
2019/09/03 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
职业生涯规划设计步骤
2014/01/12 职场文书
年度考核自我鉴定
2014/02/02 职场文书
库房管理员岗位职责
2014/03/09 职场文书
会计专业求职信范文
2014/03/16 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python
配置Kubernetes外网访问集群
2022/03/31 Servers