Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php中的simplexml_加载_文件_Php_Xml_Simplexml - Fatal编程技术网

php中的simplexml_加载_文件

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

我一直在使用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("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循环?您想做什么