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 base64+gzinflate压缩编码和解码代码
Oct 03 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
Jun 24 PHP
php中mkdir函数用法实例分析
Nov 15 PHP
PHP 实现代码复用的一个方法 traits新特性
Feb 22 PHP
php将字符串转换成16进制的方法
Mar 17 PHP
PHP中set error handler函数用法小结
Nov 11 PHP
php实现爬取和分析知乎用户数据
Jan 26 PHP
thinkphp框架实现删除和批量删除
Jun 29 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
关于php几种字符串连接的效率比较(详解)
Feb 22 PHP
完美解决thinkphp唯一索引重复时出错的问题
Mar 31 PHP
使用Laravel中的查询构造器实现增删改查功能
Sep 03 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
php反射应用示例
2014/02/25 PHP
php url路由入门实例
2014/04/23 PHP
php简单日历函数
2015/10/28 PHP
php实现购物车功能(以大苹果购物网为例)
2017/03/09 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
原生js 秒表实现代码
2012/07/24 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
js将字符串转成正则表达式的实现方法
2013/11/13 Javascript
javascript:json数据的页面绑定示例代码
2014/01/26 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
JS中递归函数
2016/06/17 Javascript
使用jquery datatable和bootsrap创建表格实例代码
2017/03/17 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
vuejs实现递归树型菜单组件
2018/01/13 Javascript
VUE兄弟组件传值操作实例分析
2019/10/26 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
MySQL最常见的操作语句小结
2015/05/07 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
python中添加模块导入路径的方法
2021/02/03 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
上海中网科技笔试题
2012/02/19 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
企业为何需要商业计划书
2013/12/26 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
技术负责人任命书
2014/06/05 职场文书
2014年后勤工作总结
2014/11/18 职场文书
2015年法务工作总结范文
2015/05/23 职场文书
新学期感想
2015/08/10 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python