2013-12-18 64 views
0

我有一个30MB的XML文件,我想使用Google App Engine(PHP)进行处理。由于该文件非常大,所以建议的存储空间是Google云端存储,因此我将它放在了那里。由于内存限制,我无法一次解析整个文件,但它包含5000个非常合理的节点,因此我试图使用XML Reader一次拉入一个节点。将XMLReader与Google App Engine云存储结合使用

该流程在本地完美运行,但是我遇到的问题是XMLReader一直无法从我的云存储中读取“无法打开源数据”的消息。

这里是我的代码的例子:“内部”和公众的URL失败,相同的错误

$path = "gs://my_bucket/my_file.xml"; 
require_once 'google/appengine/api/cloud_storage/CloudStorageTools.php'; 
use google\appengine\api\cloud_storage\CloudStorageTools; 
$public_url = CloudStorageTools::getPublicUrl($path, true); 

$reader = new XMLReader; 
$reader->open($path); // fails 
$reader->open($public_url); // fails 

XMLReader::open(): Unable to open source data in /[gaepath]/myapp.php on line X

看了周围,大约有权限的建议,但文件不受限制,以下确实工作:

$xml = file_get_contents($path); // $xml contains the file contents as a string 

两个解决方案将帮助我:

  1. 有些方法有XMLReader的打开谷歌云存储URL
  2. 一些方式来传递一个字符串的XMLReader,这似乎并不可能(和写入临时本地文件也似乎被禁止GAE)
+0

是否确定的XMLReader可以从流读取不是本地文件? –

+0

@StuartLangley(不是特别详细)文档建议如此(http://www.php.net/manual/en/xmlreader.open.php),它似乎与本地URL一起工作... – Johno

+0

我看着代码,它似乎表明它只适用于本地文件.... https://github.com/php/php-src/blob/master/ext/xmlreader/php_xmlreader.c#L241 –

回答

0

我有这个相同的问题。看起来我们需要通过在应用的根目录下创建一个php.ini文件来手动启用“Disabled Function”。

的php.ini:

google_app_engine.enable_functions = "libxml_disable_entity_loader" 

然后,在代码中,我们需要加载该文件之前,使实体装载机:

libxml_disable_entity_loader(false); 
$xml = new XMLReader(); 
$res = $xml->open($file); 
相关问题