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防攻击代码升级版
Dec 29 PHP
php实现无限级分类实现代码(递归方法)
Jan 01 PHP
php 数组的一个悲剧?
May 11 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
Aug 18 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
PHP获取网站中各文章的第一张图片的代码示例
May 20 PHP
php中替换字符串函数strtr()和str_repalce()的用法与区别
Nov 25 PHP
PHP耦合设计模式实例分析
Aug 08 PHP
Laravel 创建可以传递参数 Console服务的例子
Oct 14 PHP
PhpSpreadsheet设置单元格常用操作汇总
Nov 13 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
正则表达式语法
2006/10/09 Javascript
一个php作的文本留言本的例子(四)
2006/10/09 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php生成图片缩略图的方法
2015/04/07 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
List the UTC Time on a Computer
2007/06/11 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
js特效,页面下雪的小例子
2013/06/17 Javascript
[JSF]使用DataModel处理表行事件的实例代码
2013/08/05 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
js控制iframe的高度/宽度让其自适应内容
2014/04/09 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
angularjs项目的页面跳转如何实现(5种方法)
2017/05/25 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
python分布式环境下的限流器的示例
2017/10/26 Python
python如何生成网页验证码
2018/07/28 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
酒店led欢迎词
2014/01/09 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
仓库管理计划书
2014/05/04 职场文书
会员活动策划方案
2014/08/19 职场文书
2014年学生会干事工作总结
2014/11/07 职场文书
三八妇女节慰问信
2015/02/14 职场文书
创业计划书之农家乐
2019/10/09 职场文书
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL