5

ページの読み込み時に PHP 関数を呼び出すという問題があります。関数は、ファイルが存在するかどうかを確認し、ファイル名を返します。存在しない場合は、かなりリソースが多く、時間がかかるスクリプトを実行します - 波形画像の変換オーディオファイルから。問題は、音声ファイルが大きいため、ファイルの作成に時間がかかることです。そのため、音声ファイルにこの画像ファイルが関連付けられていない場合、プロセスと同じくらいページの読み込みに時間がかかります。

私が求めているのは、この関数が存在しない場合はプレースホルダー画像を返すことですが、ページが読み込まれた後、またはバックグラウンドでプロセスを続行することです。したがって、理論的には、後日ページをリロードすると、正しい画像がそこに表示されます。

現在、プレースホルダー画像を取得できますが、プロセスが停止し、画像が生成されません。これが私がこれまでに持っているものです:

function example($file_path, $file_name) {if ($file_path) {

if (file_exists("/path/to/folder/{$file_name}.png")) {
  return "/path/to/folder/{$file_name}.png";
}
if (!file_exists("/path/to/folder/{$audio_file_name}.png")) {

  return "/path/to/folder/processing.png";      

Some stuff in here

 return $new image

} return FALSE

ご覧のとおり、ファイルが存在しないと停止しますが、ここにあるものをバックグラウンドで続行したいと考えています。それは可能ですか、それとも別のアプローチが必要ですか? cronジョブか何かのように?どんな助けでも感謝します。

4

5 に答える 5

2

FastCGI / FPM で実行している場合は、次のことを検討できます。

  1. スクリプトを指す属性を持つ通常の<img>タグを配置します。src

  2. スクリプトを再生成する必要がある場合は、ブラウザを処理中の画像にリダイレクトさせます。

  3. 画像の準備ができたら、作成した画像にリダイレクトします (ページで AJAX ポーリングを行うこともできます)。

ステップ2をどうするか?

通常、ブラウザーはレンダリングまたはリダイレクトを実行する前に、スクリプトが終了するまで待機する必要があります。しかし、FastCGI (PHP-FPM) にはこのための特別な機能があります: fastcgi_finish_request. ほとんど文書化されていませんが、使い方は簡単です:

if ($need_to_process) {
    header('Location: /path/to/processing.png');
    fastcgi_finish_request();
    // do processing here
} else {
    header('Location: /path/to/final_image.png');
}

実行する直前にすぐにレンダリングできるテンプレートがある場合は、既存のプロセスにも適用できますfastcgi_finish_request()

さらに別の選択肢

Gearman などのタスク スケジューラを使用します。

于 2013-02-14T23:58:44.617 に答える
1

私はAJAXでそれをします。画像が見つかったら、そこに置いてください。

それ以外の場合は、プレースホルダーを配置し、データを含むJSフラグを追加して、波形画像をロードします。

HTMLドキュメントを生成するPHPコードでは、変換は行われません。また、JSからのリクエストを処理する別のリクエストハンドラーがあり、提供されたデータを使用して変換を行います。

HTMLドキュメント生成コードで最初に作成されたデータはJSに渡され、JSはそれを使用して変換のリクエストを送信します。JSが応答を待つ間、読み込み時間に対応し、応答が来たらプレースホルダーに配置します。

于 2013-02-15T00:07:02.943 に答える