PHP循环 - 表达/功能导致严重延迟

Dan*_*nny 9 php performance loops

我想知道是否有人可以解决这个问题.. PHP 5.3.0 :)

我有一个循环,它抓取CSV文件的内容(大,200mb),处理数据,为mysql插入构建一堆变量,一旦循环完成并创建变量,我就插入信息.

首先,mysql插件运行完美,没有延迟,一切都很好,但是LOOP本身有延迟,我最初使用fgetcsv()读取CSV文件,但与file_get_contents()相比,这有严重的延迟 - 所以我切换到file_get_contents().循环将在几秒钟内执行,直到我尝试添加一个函数(我还在循环内添加了表达式而没有函数来查看它是否有帮助)来创建一个包含每行的CSV数据的数组,这个是什么导致解析时间严重延迟!(基于这个200mb文件的差异大约是30秒,但是根据我猜的csv文件的文件大小)

这是一些代码,所以你可以看到我在做什么:

$filename = "file.csv";
$content = file_get_contents($filename);    
$rows = explode("\n", $content);    
foreach ($rows as $data) {    
    $data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data))); //THIS IS THE CULPRIT CAUSING SLOW LOADING?!?
}
Run Code Online (Sandbox Code Playgroud)

运行上面的循环,几乎可以在没有线的情况下立即执行:

$data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data)));
Run Code Online (Sandbox Code Playgroud)

我也试过创建一个函数如下(循环外):

function csv_string_to_array($str) {
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$results=preg_split($expr,trim($str));
return preg_replace("/^\"(.*)\"$/","$1",$results);
}
Run Code Online (Sandbox Code Playgroud)

并调用函数而不是一个衬垫:

$data = csv_string_to_array($data);
Run Code Online (Sandbox Code Playgroud)

再次没有运气:(

任何帮助都会受到赞赏,我猜测fgetcsv函数基于它引起的延迟以非常类似的方式执行,循环并从数据行创建数组.

丹尼

小智 0

我部分找到了一个解决方案,我发送一个批处理,一次仅循环 1000 行(php 循环 1000 行,直到到达文件末尾)。

然后我只设置:

$data = preg_replace("/^\"(.*)\"$/","$1",preg_split("/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/", trim($data)));
Run Code Online (Sandbox Code Playgroud)

在 1000 行上,这样就不会为导致问题的整个文件设置它。

现在它正在循环并在 1-2 秒内将 1000 行插入到 mysql 数据库中,我对此感到满意。我已经将脚本设置为循环 1000 行,记住它的最后位置,然后循环到下 1000 行,直到到达末尾,它似乎工作正常!