【发布时间】:2021-11-06 22:25:52
【问题描述】:
我有一个将 csv 文件写入磁盘的 php 脚本,函数如下:
function fputcsv_content($fp, $array, $delimiter=",", $eol="\n") {
$line = "";
foreach($array as $value) {
$value = trim($value);
$value = str_replace("\r\n", "\n", $value);
if(preg_match("/[$delimiter\"\n\r]/", $value)) {
$value = '"'.str_replace('"', '""', $value).'"';
}
$line .= $value.$delimiter;
}
$eol = str_replace("\\r", "\r", $eol);
$eol = str_replace("\\n", "\n", $eol);
$line = substr($line, 0, (strlen($delimiter) * -1));
$line .= $eol;
return fputs($fp, $line);
}
服务器为AWS实例,CentOS 7,PHP版本为7.2
服务器规格: 4GB 内存 32GB 交换 2核,2.5GHZ
当文件很大时,(3GB、4GB)写入过程很慢,(每 2 或 3 秒 1MB)。
php.ini 或 apache 配置中是否有任何设置可以控制这个 fputs/fwrite 函数?
我在 php.ini 中看到了 output_buffer 设置(当前设置为 4096),但我怀疑它有什么关系。
谢谢!
【问题讨论】:
-
可能与问题无关,但您应该首先在这里使用php.net/manual/en/function.fputcsv.php,而不是编写自己的转义逻辑...
-
(或者它甚至可能是相关的,如果你正在做的正则表达式和替换的东西实际上是大部分时间消耗的东西。你有没有以某种方式验证它实际上是写入速度本身,这么慢?)
-
是的,因为我可以监控文件写入过程,而且速度很慢,我假设一旦文件出现在我放置它的文件夹中,它就已经在 fputs 行并且已经通过了所有前面的逻辑在函数中
标签: php performance fwrite fputs