下午好。
我遇到了php foreach
循环的问题。
我使用 simplexml 解析xml文件(~20mb),然后将数据插入 mysql
xml中的超过37000项,我必须循环37000次,才能从xml中读取数据
每100次迭代我创建如下字符串:
insert into my_table values (...)
但我在10500-st迭代中得到502错误。
我尝试在循环后发送字符串,但再次出错:
memory_limit=240
max_execution_time 500
我该如何解决这个问题。 谢谢和最好的问候。
答案 0 :(得分:1)
我认为问题在于您的脚本超时,您可以通过在脚本中使用set_time_limit(0)
或更改max_execution_time
中的php.ini
来解决此问题:
while(1) {
set_time_limit(0);
// do something
}
您还需要通过修改memory_limit
来增加php.ini
并重新启动您的网络服务器。
答案 1 :(得分:0)
我将37000个项目分成几个批次并一个接一个地处理它们或异步处理它们。我在PHP中已经完成了几次。像这样的工作的更好的语言是Phyton或RoR。
但是,请尝试创建批次的商品。
我使用此功能将字符串转换为CSV格式:
<?php
function convertStrToCsv($data, $delimiter = ';', $enclosure = '"')
{
ob_start();
$fp = fopen('php://output', 'w');
fputcsv($fp, $data, $delimiter, $enclosure);
fclose($fp);
return ob_get_clean();
}
...然后我将函数输出保存为文件,最后使用此查询将CSV数据保存在数据库中:
LOAD DATA LOW_PRIORITY LOCAL INFILE '$file' IGNORE INTO TABLE `$table` CHARACTER SET utf8 FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n';
快乐的编码!