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 相关文章推荐
初学者入门:细述PHP4的核心Zend
Sep 05 PHP
PHP 写文本日志实现代码
May 18 PHP
注册页面之前先验证用户名是否存在的php代码
Jul 14 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
深入解析PHP 5.3.x 的strtotime() 时区设定 警告信息修复
Aug 05 PHP
php创建sprite
Feb 11 PHP
php自动加载autoload机制示例分享
Feb 20 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php安装swoole扩展的方法
Mar 19 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
Mar 16 PHP
php扩展开发入门demo示例
Sep 23 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
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
PHP 5.3新增魔术方法__invoke概述
2014/07/23 PHP
js或者jquery判断图片是否加载完成实现代码
2013/03/20 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
javascript与jquery动态创建html元素示例
2016/07/25 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
jquery实现数字输入框
2017/02/22 Javascript
JavaScript运动框架 解决防抖动问题、悬浮对联(二)
2017/05/17 Javascript
基于 webpack2 实现的多入口项目脚手架详解
2017/06/26 Javascript
JS验证码实现代码
2017/09/14 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
Python的SimpleHTTPServer模块用处及使用方法简介
2018/01/22 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python skimage 连通性区域检测方法
2018/06/21 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
python使用MQTT给硬件传输图片的实现方法
2019/05/05 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
通过实例简单了解Python sys.argv[]使用方法
2020/08/04 Python
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
莫斯科珠宝厂官方网站:Miuz
2020/09/19 全球购物
英语专业学子个人的自我评价
2013/10/02 职场文书
校园安全检查制度
2014/02/03 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript