我正在寻找将 PHP 输入流的内容写入磁盘的最有效方法,而不使用授予 PHP 脚本的大量内存。例如,如果可以上传的最大文件大小为 1 GB,但 PHP 只有 32 MB 内存。
define('MAX_FILE_LEN', 1073741824); // 1 GB in bytes
$hSource = fopen('php://input', 'r');
$hDest = fopen(UPLOADS_DIR.'/'.$MyTempName.'.tmp', 'w');
fwrite($hDest, fread($hSource, MAX_FILE_LEN));
fclose($hDest);
fclose($hSource);
像上面的代码所示的 fwrite 中的 fread 是否意味着整个文件将被加载到内存中?
为了做相反的事情(写一个文件to输出流),PHP 提供了一个名为直通 http://php.net/manual/en/function.fpassthru.php我相信 PHP 脚本的内存中没有保存文件的内容。
我正在寻找类似但相反的东西(写from输入流到文件)。感谢您提供的任何帮助。
Yep - fread
以这种方式使用会首先将最多 1 GB 读入字符串,然后通过fwrite
。 PHP 只是不够智能,无法为您创建内存高效的管道。
我会尝试类似以下内容:
$hSource = fopen('php://input', 'r');
$hDest = fopen(UPLOADS_DIR . '/' . $MyTempName . '.tmp', 'w');
while (!feof($hSource)) {
/*
* I'm going to read in 1K chunks. You could make this
* larger, but as a rule of thumb I'd keep it to 1/4 of
* your php memory_limit.
*/
$chunk = fread($hSource, 1024);
fwrite($hDest, $chunk);
}
fclose($hSource);
fclose($hDest);
如果你想非常挑剔,你也可以unset($chunk);
之后的循环内fwrite
绝对确保 PHP 释放内存 - 但这不是必需的,因为下一个循环将覆盖正在使用的任何内存$chunk
当时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)