php中的simplexml_加载_文件
我一直在使用simplexml\u load\u文件解析包含15000条记录的xml文件,它工作正常,但当我尝试处理许多文件时,每个文件都是15000条,它给了我这个错误php中的simplexml_加载_文件,php,xml,simplexml,Php,Xml,Simplexml,我一直在使用simplexml\u load\u文件解析包含15000条记录的xml文件,它工作正常,但当我尝试处理许多文件时,每个文件都是15000条,它给了我这个错误 Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 64 bytes) 不知道该做什么,下面是我正在做的示例 $xml = simplexml_load_file($file) or die("Err
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 64 bytes)
不知道该做什么,下面是我正在做的示例
$xml = simplexml_load_file($file)
or die("Error: Cannot create object");
foreach($xml->children() as $events){
foreach($events->load as $load){
$record = $load->loadrecord['record']." ";
if ($load->loadrecord['record'] == "test"){
foreach($events->receiveds as $received){
$release = $received->received['release'];
}
foreach($events->sender as $sender){
$test1 = $sender['test1'];
$test2 = $sender['test2'];
$test3 = $sender['test3'];
$test4 = $sender['test4'];
}
foreach($events->screens as $filter){
$record = $filter->filter['record'];
}
}
}
在解析完成后,我需要释放一些内容,请注意,当有很多文件时,我尝试了两个文件,并且没有问题:
可以考虑使用CRON作业逐个处理这些文件,然后将它们的输出存储在某处,并在完成时检索输出。 这当然取决于你不需要立即得到结果。如果您这样做了,您可以开始这个过程,并使用AJAX请求检查何时完成并获取最终输出 显然,需求和要求可能意味着这是不可行的。提高内存限制是一种选择,但如果您在共享主机平台上,通常不会。它还意味着您绕过了问题,而不是解决它(即,如果记录数量再次增加,问题将再次出现)<>编辑:误读问题,修改答案。 可以考虑使用CRON作业逐个处理这些文件,然后将它们的输出存储在某处,并在完成时检索输出。 这当然取决于你不需要立即得到结果。如果您这样做了,您可以开始这个过程,并使用AJAX请求检查何时完成并获取最终输出 显然,需求和要求可能意味着这是不可行的。提高内存限制是一种选择,但如果您在共享主机平台上,通常不会。它还意味着您绕过了问题,而不是解决它(即,如果记录数量再次增加,问题将再次出现)
编辑:误读问题,修改答案以适应。不要对大文件使用simplexml。。 使用XML DOM对象
您可以使用一些高级工具,如SAX或XMLReader或其他第三方来解析数据 不要对大文件使用simplexml。。 使用XML DOM对象
您可以使用一些高级工具,如SAX或XMLReader或其他第三方来解析数据 不幸的是,SimpleXML类将整个XML文件加载到内存中。如果给它一个大文件,这显然会导致问题 相反,您需要使用XMLReader类。这个类一次读取一个XML元素,并在读取后将其丢弃。这意味着您在任何时候都有最少的内存数据 使用此类的一种方便方法是将其包装在迭代器类中。这意味着您可以使用
foreach()
在元素之间循环,就像一次加载所有元素一样
这里有到的链接。当我遇到这个问题时,我发现这门课非常有帮助。我不得不做一些小的调整来满足我的需要,但第一次几乎奏效了。我希望它也适用于您。不幸的是,SimpleXML类将整个XML文件加载到内存中。如果给它一个大文件,这显然会导致问题 相反,您需要使用XMLReader类。这个类一次读取一个XML元素,并在读取后将其丢弃。这意味着您在任何时候都有最少的内存数据 使用此类的一种方便方法是将其包装在迭代器类中。这意味着您可以使用
foreach()
在元素之间循环,就像一次加载所有元素一样
这里有到的链接。当我遇到这个问题时,我发现这门课非常有帮助。我不得不做一些小的调整来满足我的需要,但第一次几乎奏效了。我希望它也适用于您。最终发现了问题,您需要在每次迭代后取消设置,例如,您需要在此处取消设置$xml
$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
unset($xml);
}
我以前是这样的
$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
}
unset($xml);
如果没有您的指导,您不会真正找到它。最终找到了问题,您需要在每次迭代后取消设置,例如,您需要在此处取消设置$xml
$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
unset($xml);
}
我以前是这样的
$xml = simplexml_load_file(file_name )
foreach($xml->children() as $logs){
do_stuff
}
unset($xml);
如果没有您的指导,我们不会真正发现它此代码的内容显然比您向我们展示的内容更多,而且您也没有给我们太多可以继续的内容。我能告诉你的最好的情况是,一旦你处理完这些变量,你就可以使用它们从内存中删除它们。在代码中,你从哪里得到内存错误?换句话说,你能在第一行加载文档吗,或者你能在看到错误之前执行部分脚本吗?你有没有浏览过谷歌?如果您不打算发布足够的代码,请至少将内存限制提高一倍<代码>ini设置(“内存限制”,“256M”)代码>这段代码显然比您向我们展示的内容还要多,而且您没有给我们提供太多可以继续的内容。我能告诉你的最好的情况是,一旦你处理完这些变量,你就可以使用它们从内存中删除它们。在代码中,你从哪里得到内存错误?换句话说,你能在第一行加载文档吗,或者你能在看到错误之前执行部分脚本吗?你有没有浏览过谷歌?如果您不打算发布足够的代码,请至少将内存限制提高一倍<代码>ini设置(“内存限制”,“256M”)代码>实际上这就是代码,我所做的就是让for循环遍历一个dir,开始处理文件并将所有内容放入数据库,我没有把它放入数据库,因为它与问题无关如果这就是全部,那么我看没有理由不能为它们建立一个小队列,处理一个文件,将其添加到数据库,然后结束脚本,如果cron检测到有新文件要处理,则会自动启动另一个脚本。不要试图在一个脚本中同时执行所有操作。同样的问题再次出现,现在它在10个文件而不是5个文件之后抛出此错误。您是否仍在使用for循环?您想做什么