For While循环脚本暂停/重启以在max_execution_time下运行

时间:2012-07-27 22:12:54

标签: php

我是以手动的方式做到这一点,但我认为可能有更自动的方式来做到这一点。以下脚本必须在每个文件夹中共同调整1000个文件夹,其中包含超过100K的图像(每个文件夹中不是100K)。我只有两分钟的max_execution_time才能运行。它可以在两分钟内完成大约10个文件夹。但是,实际上我只是希望脚本在两分钟之前暂停...然后再从它停止的地方再次开始......希望重新启动它的max_execution_time。我不知道sleep()是否可以这样做 - 睡眠可能会计入执行时间,不确定。

手动方式是将$ count变量增加10,然后将while循环中的i $增加10。因此它会从它停止的地方开始,一次做10个文件夹。刷新以运行它。目前我也没有cron访问权限。

这是脚本......

class DevTestHelper {


//This will Go through all full size images and resize images into requested folder
function resizeGalleryImages($destFolder, $width, $height, $isCrop = false) {

$count = 1000;

$source = JPATH_SITE."/images/gallery/full";
$dest = JPATH_SITE."/images/gallery/".$destFolder;

echo 'Processing Images<br>';

//Loop through all 1000 folders 0 to 999 in the /full dir
for($i=0; $i < $count;$i++) {
    $iPath = $source.'/'.$i;
    if(is_dir($iPath)) {

            $h = opendir($iPath);
            //Loop through all the files in numbered folder
            while ($entry = readdir($h)) {

         //only read files
                if ($entry != "." && $entry != ".." &&        !is_dir($entry)) {
          $img = new GImage($source.'/'.$i.'/'.$entry);

                    $tmp = $img->resize($width, $height, true, 3);

                    if($isCrop) {
                        $tmpWidth = $tmp->getWidth();
                        $tmpHeight = $tmp->getHeight();

                        $xOffset = ($tmpWidth - $width) / 2;
                        $yOffset = ($tmpHeight - $height) / 2;

                        $tmp->crop($width, $height, $xOffset, $yOffset, false, 3);
                    }

                    $destination = $dest.'/'.$i.'/'.$entry;

                    if(!$tmp->toFile($destination)) {
                        echo 'error in creating resized image at: '.$destination.'<br>';
                  }

                 //echo $entry.'<br>';
        }

            }

        echo 'Processed: '.$i.' Folder<br>';

    }
}

1 个答案:

答案 0 :(得分:0)

您有几种不同的选择:

  1. 有一个填充队列的脚本和另一个处理队列的脚本。
  2. 产生多个工作脚本以并行处理
  3. 每次调整大小后,使用循环内的set_time_limit(x)扩展脚本超时,这样只要数据处理成功,它就会继续运行