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 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
php 之 没有mysql支持时的替代方案
Oct 09 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
Jun 19 PHP
为PHP安装imagick时出现Cannot locate header file MagickWand.h错误的解决方法
Nov 03 PHP
php调用shell的方法
Nov 05 PHP
如何利用http协议发布博客园博文评论
Aug 03 PHP
PHP操作FTP类 (上传、下载、移动、创建等)
Mar 31 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
Jul 03 PHP
详解laravel安装使用Passport(Api认证)
Jul 27 PHP
PHP Primary script unknown 解决方法总结
Aug 22 PHP
基于PHP+mysql实现新闻发布系统的开发
Aug 06 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
晶体管单管来复再生式收音机
2021/03/02 无线电
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
2017/11/28 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
在javascript中实现函数数组的方法
2013/12/25 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
JavaScript模块规范之AMD规范和CMD规范
2015/10/27 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
Three.js利用orbit controls插件(轨道控制)控制模型交互动作详解
2017/09/25 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
基于redis的小程序登录实现方法流程分析
2020/05/25 Javascript
python对json的相关操作实例详解
2017/01/04 Python
Django 使用logging打印日志的实例
2018/04/28 Python
pandas带有重复索引操作方法
2018/06/08 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
python 错误处理 assert详解
2020/04/20 Python
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
请介绍一下WSDL的文档结构
2013/03/17 面试题
员工自我鉴定范文
2013/10/06 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
成绩单公证书
2014/04/10 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
软件测试专业推荐信
2014/09/18 职场文书
小学体育教学随笔
2015/08/14 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
浅谈如何提高PHP代码的质量
2021/05/28 PHP