写入更大的文件会导致内部服务器错误

时间:2016-03-16 16:00:10

标签: php file upload internal-server-error

使用分块文件上传和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_sizeupload_max_size有关的答案。但是,设置值(两者的96MB)都不对应于文件可写的测量的最大文件大小(134MB),当我将相同的值应用于本地时,问题也不存在测试服务器。

此外,我找不到有关PHP_MEMORY_LIMIT(我使用状态512MB的优惠)与128 - 134MB的最大可写文件大小(其中{的{}}之间潜在相关性的任何信息{1}}是一个倍数。

有人知道是否

  1. 上述配置值真的对应于问题吗?

  2. 还有其他方法可以继续将数据附加到此类文件吗?

  3. PS:This SO thread可能基于同样的问题,但这里的问题不同。

0 个答案:

没有答案