0

私の PHP/MySQL Web アプリケーションには、ImageMagick を使用して各ユーザーの一連の画像を 1 つの PDF に結合する機能があります。その後、各 PDF は ZIP ファイルに配置されます。各画像のサイズは最大 5 MB です。私の問題は、ユーザーがドキュメントをダウンロードする前にブラウザがタイムアウトすることです。

これを行う最善の方法についてのアイデアはありますか?

ブラウザーに送信せずに ZIP ファイルを作成し (つまり、コードの末尾にある "ヘッダー" を削除)、ファイルへのリンクを電子メールで送信できると考えていました。ただし、ユーザーは ZIP ファイルが作成されるまで長時間待つ必要があります (ブラウザーがハングしているように見えます)。これは、AJAX を使用して舞台裏で、またはサーバー上で何らかの方法で直接行うことができますか?

$tmp_path = sys_get_temp_dir().'/';
$archive_name = "myarchive.zip";

$zip = new ZipArchive();

if($zip->open($archive_name,1 ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
    return false;
}

foreach ($rows AS $row) {

    $irows = get_images($row['user_id']);

    $images = array();

    foreach($irows AS $irow){
        $doc = fetch_document_path($irow['id']);
        $output_file_name = $tmp_path.$irow['id'].'.jpg';  
        exec ('convert '.$doc.' '.$output_file_name);
        $images[] = $irow['id'].'.jpg'; 
    }    

    $images = implode(' ', $images);   
    $output_file_name = $tmp_path.$row['name'].'.pdf';  
    exec ('convert '.$images.' "'.$output_file_name.'"');       
    $zip->addFile($output_file_name,basename($output_file_name));

}

$zip->close();

header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="output.zip"');
readfile($archive_name);
4

1 に答える 1

0

IMOは、その仕事をするバックグラウンドタスクを実行する必要があります。バックグラウンドワーカーは、たとえば、終了後にURLを結果ファイルにDBに保存できます(現在のステータスやジョブの進行状況などの情報を保存することもできます)。その間、WebページはAJAXを使用してサーバーにジョブがすでに完了しているかどうかを定期的に尋ね、最終的に表示できます。利用可能になるときにリンクします。

これを実現する最も簡単な方法は、スクリプトをバックグラウンドプロセスとして実行することです。

  $arg1 = escapeshellarg($somearg1);
  $arg2 = escapeshellarg($somearg1);
  exec(sprintf('/usr/bin/php archiver.php %s %s > /dev/null 2>&1 & echo $!', $arg1, $arg2));

archiver.php次の行で始める必要があります。

 <?php
 ignore_user_abort(true);
 set_time_limit(0);

親スクリプトの動作が終了したときにスクリプトが停止するのを防ぎます。

私が持っている2番目のアイデアはもっと複雑です-ジョブを待っているバックグラウンドで実行されるデーモンを書くことができます。それと通信するには、キュー(AMQPなど)またはデータベースのみを使用できます。デーモンを使用すると、何が起こっているかをより詳細に制御できます。最初のアプローチでは、アプリケーションが非常に多くのプロセスを起動する可能性があります。

于 2012-11-30T15:56:58.933 に答える