これはいくつかの方法で行うことができます。
最善の方法は、スクリプトを「ディレクトリ スキャン」部分に分割することです。これは、ソースのタイムスタンプと存在のタイムスタンプ、および宛先のタイムスタンプを比較することで、どの画像をサムネイル化する必要があるかを判断します。
2 番目の部分では、一度に 1 つの画像のみがサムネイル表示されます。
次に、スクリプトの 2 番目の部分を実行し、サムネイルが要求されたときにのみ画像をサムネイル表示できます。
<?php
...
$run = true;
if (file_exists($thumbnail))
if (filemtime($thumbnail) > filemtime($source))
$run = false;
if ($run)
{
// run, say, ImageMagick and convert $source to $thumbnail
if (!$success)
$thumbnail = './images/sorry-error-in-thumbnailing.jpg';
}
Header("Content-Type: image/jpeg");
Header("Content-Length: " . filesize($thumbnail));
readfile($thumbnail);
?>
もちろん、一度に大量のサムネイルを生成しなければならない場合は、サムネイル作成ツールのコピーを多数実行してサーバーの CPU を占有する可能性があるため、これは危険です。
Let me clarify: you put the above script in place of IMG SRC="thumbnail1234.jpg"
request. Then the user viewing the page with the thumbnails will start several
requests for thumbnail.php?source=image123, ...?source=image235 and so on. They
will run in parallel, and most of them (if the thumb is there) can read the thumbnail
or issue a 302 Redirect to it, both very fast and with little server load.
ONLY IF the thumbnail isn't there, THAT image will appear after a delay because it
is generated and served directly. The user will see most, maybe all, images loading
instantly, and some of them lag behind a little (ideally).
その場合、開く前にシステム負荷チェックを実行するか、実行中のプロセスの実行中のアカウントを保持できます。
「tempthumbnail.jpg」が存在し、$SECONDS 秒以内であるかどうかを確認し、$source を tempthumbnail.jpg にサムしてから、tempthumbnail を $thumbnail に名前変更することで、一度に 1 つのサムマーを実行するように制限できます。および/またはシステムで確実に許可されている場合は flock() を使用します。または、データベースで実行されているプロセスの数を保存することもできます。
query("UPDATE sysvars SET runner = runner + 1;");
shell_exec("...");
query("UPDATE sysvars SET runner = runner - 1;");
それ以外の場合は、前回の実行が $TIME 秒以上前であることがわかったときに、cron を介して、またはスクリプトの最初にスクリプトを実行することができます。または、サムネイルする画像をアップロードするときに、フラグ (またはソース ディレクトリの filemtime()) を確認できます。
後者の場合、アップロードを管理している場合は、アップロードが完了した直後にサムマーを実行してください。ユーザーのアップロードは、あなたのサミング プロセスをシリアル化します。新しい画像を「表示」するために行われる操作が、アップロード後すぐに有効になる可能性はほとんどありません。したがって、逆に、ユーザーが「OK、画像 12345 をアクティブにします」と言った場合、12345 のサムネイルは既に作成されており、「すぐに」表示する準備ができている可能性が高くなります。
サミング スクリプトの実行方法に大きく依存します。常にすべてのサムネイルを再生成する場合は、非効率です。チェックした場合、「予行演習」はディレクトリ全体の読み取りと一連の stat() 呼び出しであり、非常に高速です。何千もの画像を処理しない限り、ほとんど心配する必要はありません。