2013-12-18 63 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); 
相關問題