私は、ファイルを一緒に圧縮してユーザーがダウンロードできるようにするWebサイトのPHPページに取り組んでいます。zipのファイルサイズは、数MBから100MBの範囲です。私のPHPスクリプトは、一時ディレクトリにzipファイルを作成してから、ファイルの内容をブラウザに書き込みます。これが完了すると、スクリプトはMySQLデータベースのダウンロードカウンターを更新し、tempディレクトリからzipファイルを削除します。
30秒以上かかる大きなzipダウンロードに出くわすまで、これはすべて正常に機能します。 max_execution_time
php.iniファイルでは30に設定されているため、これは理にかなっていますが、使用set_time_limit(0)
または変更しようとするmax_execution_time
と、同じ結果が発生します。zipファイルは、すべての正しいファイルが含まれている状態でブラウザーから正常にダウンロードされますが、データベースが更新されておらず、サーバー上の一時zipファイルが削除されていないため、スクリプトは後で停止するようです。
これは、ApacheとPHP5.2を備えたLinux環境です。
このWebサイトはGoDaddyでホストされているため、スクリプトを実行できる制限時間の変更に制限があるかどうかはわかりませんが、基本的には、この特定のスクリプトを完了するまで無期限に実行したいと思います。
制限時間や回避策を設定できない理由について何か考えはありますか?
これが私のコードです:
<?php
// Don't stop the script if the user
// closes the browser
ignore_user_abort(true);
set_time_limit(0);
// Generate random name for ZIP file
$zip_file = "";
$characters = "0123456789abcdefghijklmnopqrstuvwxyz";
do
{
$zip_file = "tmp/";
for ($p = 0; $p < 10; $p++)
$zip_file .= $characters[mt_rand(0, strlen($characters))];
$zip_file .= ".zip";
} while (file_exists($zip_file));
// Prepare ZIP file
$zip = new ZipArchive();
/* Open and add files to ZIP (this part works fine)
.
.
.
*/
// Close and save ZIP
$zip->close();
// Check browser connection
if (connection_status() == 0)
{
// Send ZIP
header("Content-Type: application/zip");
header("Content-Length: " . filesize($zip_file));
header("Content-Disposition: attachment; filename=Download.zip");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// Save and then delete file
//readfile($zip_file);
if ($file = fopen($zip_file, "r"))
{
// Set buffer size
$buffer_size = 1024 * 8;
// While we're still transmitting
// send over bytes!
while(!feof($file) && (connection_status() == 0))
{
print(fread($file, $buffer_size));
flush();
usleep(10000); //<!-- Download speed cap
}
// Close file descriptor
fclose($file);
}
}
/* Update database download counter if connection_status() == 0
.
.
.
*/
// Delete the file
unlink($zip_file);
?>
更新:ローカルWebサーバーから別のダウンロードを実行しようとしましたがusleep
、ダウンロード時間を遅くするためにコマンドを10000に上げました。合計ダウンロード時間は1分強かかり、データベースが更新され、ファイルが/tmpから削除されます。私のローカル環境では、Windows7ボックスでApacheとPHP5.3を使用してEasyPHPを実行しています。これはGoDaddyと関係があるようです。
また、GoDaddyとローカルサイトの両方で、スクリプトから呼び出されるmax_execution_time
前後に印刷しましset_time_limit
たが、結果はそれぞれ30と0でした。そのため、GoDaddy側で何が起こっているのかわかりません。