この関数は結果セット(ファイル名)を返し、ユーザーがデスクトップに保存するためにそれらを圧縮します。千以上のファイルを解凍することができません
function getFiles() {
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set('zlib.output_compression', 'Off');
$result = null;
$ZIPresult = null;
$cleanup = null;
$output = null;
$fileName = 'SearchResult.zip';
//remove old zip if any
$cleanup = shell_exec("/bin/rm -f SearchResult.zip");
error_log("SHELL OUTPUT=>" . $cleanup, 0);
//test
if (empty($_POST['DBSite'])) { return null; }
$mydir = MYDIR; // set from the CONSTANT
$dir = opendir($mydir);
$DBSite = $_POST['DBSite'];
$getfilename = mysql_query("select /*! SQL_CACHE */ filename from automation_search where site='" . $DBSite . "'") or die(mysql_error());
while ($row = mysql_fetch_array($getfilename)) {
$filename = $row['filename'];
$result .= '<tr><td><a href="' . basename($mydir) . '/' . $filename . '" target="_blank">' . $filename . '</a></td></tr>';
$ZIPresult .= basename($mydir) . '/' . escapeshellarg($filename).' ';
}
if ($result) {
$result = "<table><tbody><tr><td>Search Results.</td></tr> $result</table>";
$output = shell_exec("/usr/bin/zip -R SearchResult.zip ". $ZIPresult ." 2>&1 ");
error_log("SHELL OUTPUT=>" . $output, 0);
error_log("ZIP FILENAME=>" . $fileName, 0);
if (file_exists($fileName)) {
//header for forced download
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($fileName));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($fileName));
ob_clean();
flush();
readfile($fileName);
exit;
}
}
return $result;
}
これは、1,000ファイル(約)未満でのみ動作します。あたかもメモリの限界に達していて、ファイルのリストがスクリーンに出力されているかのようです。
エラーがError.log
です。 ZIPファイルには、私が
shell_exec("/usr/bin/zip -R SearchResult.zip ". $ZIPresult ." 2>&1 ");
ませ差に
shell_exec("/usr/bin/zip SearchResult.zip ". $ZIPresult ." ");
から私のZIPのコマンドラインを変更してみました作成されていません。私は何が欠けていますか?
SQL引数もエスケープするように注意してください。 '$ _POST ['DBSite']'。 – hakre
zipの 'shell_exec'が機能しない場合(戻り値を厳密にチェックし、関数のマニュアルページと比較してください)、引数が多すぎる問題に遭遇するかもしれません。引数にファイルのリストを渡す代わりに ' - @'を使い、1行に1ファイルずつSTDINでファイルを渡すことができます。 – hakre