我的php_zip.dll的ZipArchive类有问题。我通过php.net上建议的ZipArchiveImproved包装类使用它来避免最大文件句柄问题。
问题非常简单:正确添加700个文件(jpg图像文件),其余文件失败。 addFile方法返回false。
PHP版本为5.2.6。
奇怪的是,这实际上是用来工作的 可能是什么问题呢?你能给我任何线索吗?
非常感谢你!
编辑:抱歉,我没有收到任何错误消息(在php.ini中关闭了display_errors,我之前没有注意到)。从701.文件开始,我收到以下错误消息:
Warning: ZipArchive::addFile() [ziparchive.addfile]: Invalid or unitialized Zip object in /.../includes/ZipArchiveImproved.class.php on line 104
看起来close()调用返回false,但没有发出错误。有什么想法吗?
编辑2:相关来源:
include_once DIR_INCLUDES . 'ZipArchiveImproved.class.php';
ini_set('max_execution_time', 0);
$filePath = $_SESSION['fqm_archivePath'];
$zip = new ZipArchiveImproved();
if(! $zip->open($filePath, ZipArchive::CREATE))
{
echo '<div class="error">Hiba: a célfájl a(z) "' . $filePath . '" útvonalon nem hozható létre.</div>';
return;
}
echo('Starting (' . count($_POST['files']) . ' files)...<br>');
$addedDirs = array();
foreach($_POST['files'] as $i => $f)
{
$d = getUserNameByPicPath($f);
if(! isset($addedDirs[$d]))
{
$addedDirs[$d] = true;
$zip->addEmptyDir($d);
echo('Added dir "' . $d . '".<br>');
}
$addName = $d . '/' . basename($f);
$r = $zip->addFile($f, $addName);
if(! $r)
{
echo('<font color="Red">[' . ($i + 1) . '] Failed to add file "' . $f . '" as "' . $addName . '".</font><br>');
}
}
$a = $zip->addFromString('test.txt', 'Moooo');
if($a)
{
echo 'Added string successfully.<br>';
}
else
{
echo 'Failed to add string.<br>';
}
$zip->close();
答案 0 :(得分:1)
这可能是因为您的操作系统中打开文件的最大数量(有关详细信息,请参阅http://www.cyberciti.biz/faq/linux-increase-the-maximum-number-of-open-files/;可以在系统范围内或仅限用户限制)。
Zip会保持每个添加的文件都处于打开状态,直到调用Zip :: close。
解决方案是关闭并重新打开每个X文件的存档(256或512应该是安全值)。
答案 1 :(得分:0)
此处描述了问题:http://www.php.net/manual/en/function.ziparchive-open.php#88765
您是否尝试过指定两个标志?
答案 2 :(得分:0)
我通过增加ulimit解决了这个问题:ulimit -n 8192
。