我查了很多问题,但没有得到答案。
我有一个需要解析的大型XML文件。目前我正在使用 XMLReader 解析它。在我开始将其插入SQL db之前,它一直运行良好。如果我只回显解析xml它工作正常,如果我插入它我会得到 504网关超时 错误。以下是我的代码示例:
我在哪里解析xml:
$xml = new XMLReader();
$xml->open(APP_PATH_OWA."/trnUpload/TRNavteraData.xml");
while($xml->read()){
//get products
if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'table'){
$product = array();
}
if($xml->nodeType == XMLREADER::ELEMENT && $xml->localName == 'ident'){
$xml->read();
$product['id'] = $xml->value;
}
...
FOREACH:
foreach($products as $product){
...
$productTitle = $product['title'];
$productID = $product['id'];
$productImageUrl = "http://www.example.com/logo.png";
$productAttrHtml = $product['computed'];
// after that I'm inserting those data using ZEND framework.
XML文件大约是300k +行。
整个php函数:http://pastebin.com/S8A5Rdjw
答案 0 :(得分:1)
序列化进程将减少内存消耗,但会增加运行时。但我认为时间不是问题所在。
您可能只使用许多插入语句来阻止对数据库(表)的访问。
一些提示:
如果框架不支持这种操作,使用框架进行数据库导入可能会非常慢。尽量避免数据库抽象。
确保使用质量插入物。大多数数据库允许以这种或那种方式一次插入多个记录。这减少了数据库调用。 (当然,增加所需的记忆,所以你必须找到平衡。)
检查插入是否阻止选择。取决于数据库以及表处理程序上MySQL的情况。
插入单独的表格并在此之后重命名表格。
生成文件并使用databases命令行客户端导入它。