GD缩略图创建-是否可以通过短阶段运行脚本


GD Thumbnail Creation - Is it possible tu run a script by short stages?

我正在使用这个修改后的脚本(http://webcheatsheet.com/php/create_thumbnail_images.php)用于一步创建所有图像的缩略图:

function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth, $imageQuality )
{
$dir = opendir( $pathToImages );
while (false !== ($fname = readdir( $dir ))) {
$info = pathinfo($pathToImages . $fname);
if ( strtolower($info['extension']) == 'jpg' ){
$img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
$width = imagesx( $img );
$height = imagesy( $img );
$new_width = $thumbWidth;
$new_height = floor( $height * ( $thumbWidth / $width ) );
$tmp_img = imagecreatetruecolor( $new_width, $new_height );
imagecopyresized( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
imagejpeg( $tmp_img, "{$pathToThumbs}{$fname}",$imageQuality )}}
closedir( $dir );}

我必须创建超过250个缩略图,但我不能,因为执行时间有限。如果可能,我使用set_time_limit()

if (function_exists('set_time_limit') == true AND @ini_get('safe_mode') == 0){
@set_time_limit(9000);
}

但是,如果不可能修改ini设置,有没有办法让脚本按照以下步骤转换图像:create 10 thumbs>header('Location:./?function=createThumbs')>创建下一个10 thumbs。。直到创建了所有拇指。提前感谢您的帮助!

为了更长时间地执行脚本,可以执行set_time_limit(0),这意味着脚本执行时间没有限制。但仅仅将其设置为零是行不通的,因为如果浏览器在特定的持续时间内看不到任何输出,它会超时。

避免这种情况的方法之一是在每次生成缩略图后输出一些内容,方法是使用PHP中的output Buffering函数,如obstart()和flush()。

另一种选择(对于如此耗时的工作,我强烈建议使用Gearman这样的过程控制工具)是允许您从脚本中退出并单独处理请求。这样做的好处是,在您创建缩略图时,最终用户可以自由移动到您网站的其他部分。Gearman为您提供了一种将作业放在后台的方法,这样控件将返回到您的PHP脚本,一旦作业完成,您可以在网站上使用AJAX拉机制向用户发送电子邮件或显示一些通知。

由于web是无状态的,您不能告诉PHP脚本在进程的中途停止执行,然后让它从停止的地方重新开始,至少不能明确地这样做。

然而,您可以编写一些利用setTimeout或setInterval的AJAX代码,或者您可以设置一个以设置的间隔重复运行的CRON作业。然后,您可以将来自数组或数据库的数据传递给脚本,在脚本移动时跟踪它使用的最后一个ID,然后继续,直到没有数据为止。

使用AJAX方法,浏览器必须在整个过程中保持打开,否则无法保证它会完成,而且它依赖于启用JavaScript。因此,如果你需要确保它完成,CRON可能是一个更好的选择。

相关文章: