簡體   English   中英

如何使用PHP和ZipArchive創建ZIP文件而不將其發送到瀏覽器?

[英]How to create a ZIP file using PHP and ZipArchive without sending it to the browser?

我的PHP / MySQL Web應用程序具有使用ImageMagick將每個用戶的一組圖像組合到單個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);

IMO,您應該運行一些后台任務來完成這項工作。 例如,后台工作人員可以在完成后將URL保存到數據庫中的結果文件中(還可以保存一些其他信息,例如當前狀態和作業進度),與此同時,網頁可以定期使用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);

這樣可以防止父腳本完成工作后停止腳本。

第二個想法比較復雜-您可以編寫一個守護程序,該守護程序將在后台運行以等待作業。 要與之通信,您可以使用隊列(例如AMQP)或僅使用數據庫。 使用守護程序,您可以更好地控制發生的時間和時間-在第一種方法中,您的應用程序可能會觸發過多的進程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM