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 相关文章推荐
附件名前加网站名
Mar 23 PHP
php 全文搜索和替换的实现代码
Jul 29 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
php 读取文件乱码问题
Feb 20 PHP
php数据库连接时容易出错的特殊符号问题
Sep 01 PHP
PHP 转义使用详解
Jul 15 PHP
PHP邮箱验证示例教程
Jun 01 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
php常用数组函数实例小结
Dec 29 PHP
PHP实现webshell扫描文件木马的方法
Jul 31 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP让网站移动访问更加友好方法
Feb 14 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 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
JavaScript CSS菜单功能 改进版
2008/12/20 Javascript
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
2009/01/30 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
jquery中插件实现自动添加用户的具体代码
2013/11/15 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
seajs中模块的解析规则详解和模块使用总结
2014/03/12 Javascript
jquery简单实现图片切换效果的方法
2015/05/12 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
基于BootStrap的前端分页带省略号和上下页效果
2017/05/18 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
Vue实现搜索结果高亮显示关键字
2019/05/28 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
基于javascript处理二进制图片流过程详解
2020/06/08 Javascript
Python实例一个类背后发生了什么
2016/02/09 Python
Python多线程爬虫简单示例
2016/03/04 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
详解django2中关于时间处理策略
2019/03/06 Python
python占位符输入方式实例
2019/05/27 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
利用Python实现最小二乘法与梯度下降算法
2021/02/21 Python
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
文艺晚会主持词
2014/03/24 职场文书
公司年底活动方案
2014/08/17 职场文书
公司授权委托书范本
2014/09/18 职场文书
用Python监控你的朋友都在浏览哪些网站?
2021/05/27 Python
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python