使用分块文件上传和WebWorkers实现上传带有(可能)无限文件大小的文件的功能,我偶然发现了一个非常奇怪的问题:
每当我尝试使用128 MB - 134 MB
写入大于fwrite()
的文件时,都会引发内部服务器错误,从而停止执行脚本。问题可以简化为这个(希望是不言自明的)测试用例:
$readHandle = fopen("smallFile", "r"); // ~ 2 MB
$writeHandle = fopen("bigFile", "a"); // ~ 134 MB
// First possible way of writing data to the file:
// If the file size of bigFile is at approx. 134 MB, this
// will result in an HTTP 500 Error.
while (!feof($readHandle)){
fwrite($writeHandle, fread($readHandle, 1024 * 1024));
}
// Second way of reproducing the problem:
// Here, the data is just NOT written to the destination
// file, but the script itself doesn't crash.
// stream_copy_to_stream($readHandle, $writeHandle);
fclose($readHandle);
fclose($writeHandle);
使用stream_copy_to_stream
时,脚本不会崩溃,但数据不会写入目标文件。
在联系了我的(共享)服务器主机的支持团队之后,我得到了这个限制与php配置变量post_max_size
和upload_max_size
有关的答案。但是,设置值(两者的96MB
)都不对应于文件可写的测量的最大文件大小(134MB
),当我将相同的值应用于本地时,问题也不存在测试服务器。
此外,我找不到有关PHP_MEMORY_LIMIT
(我使用状态512MB
的优惠)与128 - 134MB
的最大可写文件大小(其中{的{}}之间潜在相关性的任何信息{1}}是一个倍数。
有人知道是否
上述配置值真的对应于问题吗?
还有其他方法可以继续将数据附加到此类文件吗?
PS:This SO thread可能基于同样的问题,但这里的问题不同。