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 array操作10个小技巧分享
Jun 23 PHP
PHP使用Mysql事务实例解析
Sep 08 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP通过API获取手机号码归属地
May 28 PHP
日常整理PHP中简单的图形处理(经典)
Oct 26 PHP
php生成Android客户端扫描可登录的二维码
May 13 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
Jul 31 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
PHP排序二叉树基本功能实现方法示例
May 26 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
PHP配置文件中最常用四个ini函数
2007/03/19 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP模板引擎smarty详细介绍
2015/05/26 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
php无限级分类实现方法分析
2016/10/19 PHP
解决 FireFox 下[使用event很麻烦] 的问题.
2006/08/22 Javascript
IE和Firefox下javascript的兼容写法小结
2008/12/10 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
微信小程序使用progress组件实现显示进度功能【附源码下载】
2017/12/12 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
node省市区三级数据性能测评实例分析
2019/11/06 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
2020/03/10 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
python 字符串split的用法分享
2013/03/23 Python
跟老齐学Python之list和str比较
2014/09/20 Python
深入学习Python中的装饰器使用
2016/06/20 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
pyinstaller打包程序exe踩过的坑
2019/11/19 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
django项目中新增app的2种实现方法
2020/04/01 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
CSS3的column-fill属性对齐列内容高度的用法详解
2016/07/01 HTML / CSS
18-35岁旅游团的全球领导者:Contiki
2017/02/08 全球购物
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
应用化学专业职业生涯规划书
2014/01/22 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
Python之matplotlib绘制饼图
2022/04/13 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis