Ali*_*xel 5 php file-io fopen 32-bit fwrite
我有一组我要连接的文件(每个文件代表多部分下载的一部分).
每个拆分文件大小约为250MiB,我有可变数量.
我的连接逻辑是直截了当的:
if (is_resource($handle = fopen($output, 'xb')) === true)
{
foreach ($parts as $part)
{
if (is_resource($part = fopen($part, 'rb')) === true)
{
while (feof($part) !== true)
{
fwrite($handle, fread($part, 4096));
}
fclose($part);
}
}
fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)
我花了一段时间来追踪它,但显然,每当我有超过8个单独的部分(总共2GiB)时,我的输出文件被截断为2147483647字节(报告者sprintf('%u', $output)).
我想这是由于某种32位内部计数器的所使用fopen()或fwrite().
我该如何解决这个问题(最好只使用PHP)?
作为解决方法,您可以使用 shell。如果代码必须是可移植的,那么这只包括 Windows 和 Linux 的大约两个变体(也包括 MacOS)。
Linux
cat file1.txt file2.txt > file.txt
Run Code Online (Sandbox Code Playgroud)
视窗
copy file1.txt+file1.txt file.txt
Run Code Online (Sandbox Code Playgroud)
请注意,创建命令行时,转义变量参数非常重要。用于escapeshellarg()包装文件名(请参阅https://www.php.net/escapeshellarg)。
要检测您使用的是 Windows 还是 Linux,请查看常量PHP_OS. (最好的解释在这里:http://www.php.net/manual/en/function.php-uname.php)