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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
Jun 12 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
Sep 22 PHP
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
Nov 06 PHP
php自定文件保存session的方法
Dec 10 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
php简单截取字符串代码示例
Oct 19 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
PHP网页缓存技术优点及代码实例
Jul 29 PHP
Laravel相关的一些故障解决
Aug 19 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php过滤敏感词的示例
2014/03/31 PHP
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
JavaScript+CSS无限极分类效果完整实现方法
2015/12/22 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
详解Angular.js指令中scope类型的几种特殊情况
2017/02/21 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
js实现贪吃蛇游戏(简易版)
2020/09/29 Javascript
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python中requests和https使用简单示例
2018/01/18 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
python中pip的使用和修改下载源的方法
2019/07/08 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Python字符串及文本模式方法详解
2020/09/10 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
python des,aes,rsa加解密的实现
2021/01/16 Python
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
巴西服装和鞋子购物网站:Marisa
2018/10/25 全球购物
英语自荐信范文
2013/12/11 职场文书
部队领导证婚词
2014/01/12 职场文书
公司外出活动方案
2014/08/14 职场文书
行政二审代理词
2015/05/25 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
Tomcat用户管理的优化配置详解
2022/03/31 Servers
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server