php 根据url自动生成缩略图并处理高并发问题

2015-01-24信息快讯网

服务器生成缩略图的时机一般分为两种:上传文件时生成、访问时生成,下面为大家介绍下php根据url自动生成缩略图并处理高并发问题

服务器生成缩略图的时机一般分为两种:

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在网页中动态生成PDF文件详细教程
PHP curl实现抓取302跳转后页面的示例
PHP生成二维码的两个方法和实例
PHP中使用TCPDF生成PDF文档实例
PHP中使用CURL模拟登录并获取数据实例
PHP实现生成唯一编号(36进制的不重复编号)
PHP使用GIFEncoder类生成gif动态滚动字幕
php防止伪造的数据从URL提交方法
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
php采用curl访问域名返回405 method not allowed提示的解决方法
PHP生成等比缩略图类和自定义函数分享
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
Codeigniter实现多文件上传并创建多个缩略图
PHP图片等比例缩放生成缩略图函数分享
php按百分比生成缩略图的代码分享
php 获取页面中指定内容的实现类
php 字符串压缩方法比较示例
php 生成短网址原理及代码
php使用qr生成二维码的示例分享
php生成缩略图示例代码分享(使用gd库实现)
php解析url的三个示例
php递归函数中使用return的注意事项
修改apache配置文件去除thinkphp url中的index.php
php使用curl访问https示例分享
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
php生成txt文件标题及内容的方法
php生成数组的使用示例 php全组合算法
PHP curl 获取响应的状态码的方法
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
php生成缩略图填充白边(等比缩略图方案)
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
基于PHP服务端图片生成缩略图的方法详解
©2014-2024 dbsqp.com