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 相关文章推荐
PHP5.3.1 不再支持ISAPI
Jan 08 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 PHP
PHP 获取远程文件大小的3种解决方法
Jul 11 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP实现的多文件上传类及用法示例
May 06 PHP
php+html5+ajax实现上传图片的方法
May 14 PHP
php利用递归实现删除文件目录的方法
Sep 23 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
基于PHP实现短信验证码发送次数限制
Jul 11 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 和 MySQL 基础教程(二)
2006/10/09 PHP
PHP 身份证号验证函数
2009/05/07 PHP
PHP函数in_array()使用详解
2014/08/20 PHP
php采集中国代理服务器网的方法
2015/06/16 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
PHP屏蔽关键字实现方法
2016/11/17 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
nodejs实现OAuth2.0授权服务认证
2017/12/27 NodeJs
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
如何利用ES6进行Promise封装总结
2019/02/11 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
简单介绍Python中的几种数据类型
2016/01/02 Python
python PyTorch预训练示例
2018/02/11 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
使用Keras中的ImageDataGenerator进行批次读图方式
2020/06/17 Python
Python pymysql模块安装并操作过程解析
2020/10/13 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
毕业生医学检验求职信
2013/10/16 职场文书
物理力学求职信
2014/02/18 职场文书
艺术教育实施方案
2014/05/03 职场文书
高中生学习计划书
2014/09/15 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
python 命令行传参方法总结
2021/05/25 Python
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS