1

下午好。

我有 phpforeach循环的问题。

我使用simplexml解析 xml 文件(~20mb),然后将数据插入到mysql

在 xml 中有超过 37000 个项目,我必须循环 37000 次,才能从 xml 读取数据

每 100 次迭代我创建这样的字符串: insert into my_table values (...)

但我在 10500-st 迭代中得到 502 错误。

我尝试在循环后发送字符串,但再次出现错误:

memory_limit=240 
max_execution_time 500

我怎么解决这个问题。谢谢和最好的问候。

4

2 回答 2

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()的文档

于 2013-08-08T16:03:59.343 回答
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';  

 

阅读有关此的更多信息:

快乐编码!

于 2013-08-08T16:17:20.313 回答