0

大きな画像のサムネイルを作成するスクリプトがあり、問題なく動作します。問題は、両方の画像が表示されるページの先頭に配置され、誰かがページにアクセスするたびに実行されることです。これはあまりパフォーマンスが良くないようです。

むしろ、スクリプトに独自のページがあり、スキャンするディレクトリにさらに大きな画像が追加されたときに何らかの方法で検出し、それから動作するようにしたいと考えています。

これを設定したり、何らかの方法で改善したりするにはどうすればよいですか?

これを見つけましたが、それがどのように機能するかわかりません。$cmd とは:

  /*I combined several efforts in this topic into one function: 
This will execute $cmd in the background (no cmd window) 
without PHP waiting for it to finish, on both Windows and Unix.*/
    function execInBackground($cmd) { 
        if (substr(php_uname(), 0, 7) == "Windows"){ 
            pclose(popen("start /B ". $cmd, "r"));  
        } 
        else { 
            exec($cmd . " > /dev/null &");   
        } 
    } 
4

3 に答える 3

4

時間ベースの作成:おそらく (シェル アクセス権がある場合)、「Cron ジョブ」を作成できます。

「/etc/crond.d/」で、次のようなファイルを作成します。

0 6-18 * * *    root    /path/to/your/script.php >> /dev/null 2>&1

6.00 から 18.00 まで毎時実行されます。

詳細については、http: //en.wikipedia.org/wiki/Cronを参照してください。

自動作成 : 「アップロード手順」がある場合は、アップロード後に「サムネイルジェネレーター」を入れるだけです。

フックの作成: 実際、ディレクトリに新しい画像を追加するために使用する手順によって異なります。

おそらく、ディレクトリを更新した後にスクリプトを実行するためのフックを作成することもできます。

しかし、時間に基づく最初のソリューション (cron) が最も実装しやすいと思います。

于 2012-06-05T10:41:56.420 に答える
1

別の回答で述べられているように、cronが最善の策ですが、Linuxでのみ使用できます(おそらくWindowsには別の選択肢があります)。ただし、プラットフォームに依存しないソリューションが必要な場合、またはサーバーの構成にアクセスできない場合は、元のソリューションに固執することができます(ページの読み込みごとにサムネイルを生成します)が、CronExpressionクラスを使用して効率を上げるために変更します:https:// github.com/mtdowling/cron-expression

このクラスを使用すると、次のようなcron実行式を定義するだけです。

0 6-18 * * *

次に、サムネイル再生タスクを実行する必要があるかどうかを確認します。

$cron_expression = Cron\CronExpression::factory($cron_schedule);
$next_run_date = $cron_expression->getNextRunDate();
if ($next_run_date <= new DateTime()) {
    //execute task
}
于 2012-06-28T12:28:48.077 に答える
1

これはいくつかの方法で行うことができます。

最善の方法は、スクリプトを「ディレクトリ スキャン」部分に分割することです。これは、ソースのタイムスタンプと存在のタイムスタンプ、および宛先のタイムスタンプを比較することで、どの画像をサムネイル化する必要があるかを判断します。

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() 呼び出しであり、非常に高速です。何千もの画像を処理しない限り、ほとんど心配する必要はありません。

于 2012-07-01T12:19:24.567 に答える