php loop 502 Bad Gateway

时间:2013-08-08 15:59:36

标签: php mysql loops memory-limit

下午好。

我遇到了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

我该如何解决这个问题。 谢谢和最好的问候。

2 个答案:

答案 0 :(得分:1)

我认为问题在于您的脚本超时,您可以通过在脚本中使用set_time_limit(0)或更改max_execution_time中的php.ini来解决此问题:

while(1) {
  set_time_limit(0);
  // do something
}

您还需要通过修改memory_limit来增加php.ini并重新启动您的网络服务器。

阅读set_time_limit()

的文档

答案 1 :(得分:0)

你能将一个大的xml拆分成几个较小的文件吗?

我将37000个项目分成几个批次并一个接一个地处理它们或异步处理它们。我在PHP中已经完成了几次。像这样的工作的更好的语言是Phyton或RoR。

但是,请尝试创建批次的商品。

关于存储数据,我使用带有MySQL的CSV批量插入。

我使用此功能将字符串转换为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';  

了解更多信息:

快乐的编码!