Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php并行进程或一个接一个的文件写入进程_Php - Fatal编程技术网

php并行进程或一个接一个的文件写入进程

php并行进程或一个接一个的文件写入进程,php,Php,我正在将数据导出到csv。25000条记录之后,内存耗尽。 内存限制增加是可以的 如果我有100000行,我可以把它写成4进程吗。 写前25000行,然后写下25000行,然后写下一行 这在csv导出中可能吗? 这有什么好处吗?或者这和导出整个数据是一样的 任何多处理或并行处理都有一些优势?问题是,如果您分叉处理,您必须担心清理其子进程,并且仍然使用相同的内存量。最终,您会受到机器内存的限制,但是如果您不想根据迭代次数有条件地增加php的内存限制,那么分叉可能是一种方法 如果您使用--enabl

我正在将数据导出到csv。25000条记录之后,内存耗尽。 内存限制增加是可以的

如果我有100000行,我可以把它写成4进程吗。 写前25000行,然后写下25000行,然后写下一行

这在csv导出中可能吗? 这有什么好处吗?或者这和导出整个数据是一样的


任何多处理或并行处理都有一些优势?

问题是,如果您分叉处理,您必须担心清理其子进程,并且仍然使用相同的内存量。最终,您会受到机器内存的限制,但是如果您不想根据迭代次数有条件地增加php的
内存限制,那么分叉可能是一种方法


如果您使用
--enable pcntl
--enable sigchild
编译PHP,您就可以开始了,否则,您将无法完成这个过程。一种解决方法是使用一个主脚本来委托其他脚本的执行,但是如果您使用backticks或
shell()
exec()
(或任何类似的工具),它开始变得松散,您必须采取许多步骤来确保您的命令不会被污染/利用,这取决于您如何生成CSV

假设您是作为数据库查询(或其他导入)的结果进行的,您可以尝试流式处理,而不是构建然后返回

基本上,首先要关闭输出缓冲:

while(ob_get_level() > 0) {
    ob_end_flush();
}
然后,当您构建它时,一行一行地回显它:

foreach ($rows as $row) {
    echo '"'.$row[0].'","'.$row[1].'"'."\n";
}
这样,您就不会在PHP中使用太多内存

您还可以将数据写入临时文件,然后将该文件流式传输回:

$file = tmpfile();
foreach ($rows as $row) {
    fputcsv($file, $row);
}
rewind($file);
fpassthru($file);  // Sends the file to the client
fclose($file);

但是,这一切都取决于你在做什么。对我来说,这听起来像是在一个字符串中构建CSV(这消耗了你所有的内存)。这就是我建议这两个选项的原因…

也许代码中有可以改进的效率。我们可以看看相关的代码吗?只需在foreach looppcntl中用制表符分隔字段就可以了。那孩子是什么?我找不到。我将查找当您使用信号处理程序时,
--enable sigchild
允许父进程接收SIGCHLD信号,例如,告诉它子进程已退出,以便您的进程不会变成僵尸。