我有一个脚本,可以在目录中显示图片的缩略图。但它的执行时间太长(目录中大约有170个图像)。
该脚本由ajax请求调用。完成70%后,我可能会因为超时而收到错误(大约需要3-4分钟)。
我该如何解决这个问题?
function createThumbs( $pathToImages, $pathToThumbs, $thumbWidth )
{
// open the directory
$dir = opendir( $pathToImages );
// loop through it, looking for any/all JPG files:
while (false !== ($fname = readdir( $dir ))) {
// parse path for the extension
$info = pathinfo($pathToImages . $fname);
// continue only if this is a JPEG image
if ( strtolower($info['extension']) == 'jpg' )
{
// load image and get image size
$img = imagecreatefromjpeg( "{$pathToImages}{$fname}" );
$width = imagesx( $img );
$height = imagesy( $img );
// calculate thumbnail size
$new_width = $thumbWidth;
$new_height = floor( $height * ( $thumbWidth / $width ) );
// create a new temporary image
$tmp_img = imagecreatetruecolor( $new_width, $new_height );
// copy and resize old image into new image
imagecopyresampled( $tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
// save thumbnail into a file
imagejpeg( $tmp_img, "{$pathToThumbs}thumb_{$fname}" );
}
}
// close the directory
closedir( $dir );
}
createThumbs($directory,$directory."/thumbs/",150);
ajax call;
var ajaxr=$.ajax({
type: "POST",
url: "after_upload.php",
timeout:600,
beforeSend: function() {
$("#result").html('<div align="center"><h2>מבצע עיבוד נתונים יקח זמן ,חכה..תכין קפה בנתיים ותעשן סיגריה</h2><div><img src="loader.gif"/><div dir="rtl" style="margin:15px;">טוען מידע וממיר תמונות... <button id="cancel" style="padding:5px;">בטל פעולה ותחזור חזרה [X]</button></div></div> </div>');
},
success: function(data){
$("#result").html(data);
},
error: function(xhr, textStatus, errorThrown) {
$("#result").html(textStatus);
}
});
现在,在ajax调用中将时间增加到3000并立即,由于某种原因返回超时错误。如果我从调用中删除超时属性..执行调用和脚本执行..但只有70%的工作完成..完成返回空错误...
更新: ..我已经预先创建了所有内容以使脚本执行时间更好:控制台返回404 Not Found ..
答案 0 :(得分:5)
在循环中创建缩略图,并在每次循环后从服务器内存中删除以前的资源。
imagedestroy($thumb);
imagedestroy($source);
这会有很大的帮助,我刚刚完成了非常相似的事情。
答案 1 :(得分:0)
从编码的角度来看,你的脚本几乎无法加速,毕竟处理100多张图像并不是一项简单的任务。
但是,您可以非常轻松地设置脚本超时,以防止发生“超时”错误。你可以在php.ini中设置它,或者你也可以在PHP脚本中设置它,如下所示:
// Set the seconds (2 minutes)
$seconds = 120;
// Set the maximum execution time
set_time_limit($seconds);
有关set_time_limit()
的详细信息,请参阅here。
虽然以上内容可以解决您的问题,但通过Windows任务计划程序或Cron(取决于您的操作系统)运行此脚本会更好。使用此方法,您可以按特定时间间隔执行脚本。
如果您正在执行的“图像处理”不是基于事件的,则上述计划解决方案将只是一个合适的解决方案。我的意思是,当您的用户执行特定操作(例如单击按钮)时,不需要处理图像......
答案 2 :(得分:0)
发现问题..服务器空闲(apache)设置为2分钟...脚本循环播放170张图片并创建大拇指3分钟...贝克服务器不会返回答案连接被丢弃。解决方案是詹姆斯·奥克·乔治的建议这减少了每个图像的半秒,接下来在我的情况下所有图像都是相同的大小所以使拇指仅基于目录中的第一个图像...每个图像减少半秒。之后我将整个过程分成2个[获取列表目录] =&gt;数组它..返回响应..第二次调用使拇指.. 1.2分钟为170 ...还不错。