1

私は手動でこれを行っていましたが、これを行うためのより自動的な方法があるかもしれないと考えていました。以下のスクリプトは、各フォルダーにまとめて 100K を超える画像を含む 1000 個のフォルダーのサイズを変更する必要があります (各フォルダーに 100K ではありません)。実行するための max_execution_time は 2 分しかありません。2分間で約10個のフォルダを作成できます。しかし、実際には、2分が経過する前にスクリプトを一時停止して、中断したところから再開したいだけです..うまくいけば、max_execution_timeです。sleep() がそれを実行できるかどうかはわかりません.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>';

    }
}
4

1 に答える 1

0

いくつかのオプションがあります。

  1. キューにデータを入力するスクリプトと、キューを処理する別のスクリプトを用意します。
  2. 複数のワーカー スクリプトを生成して、処理を並行して処理する
  3. サイズを変更するたびに、ループ内で set_time_limit(x) を使用してスクリプトのタイムアウトを延長し、データが正常に処理されている限り実行し続けるようにします。
于 2012-07-27T22:20:42.300 に答える