2011-09-09 46 views
4

我有一個在共享主機環境中運行的腳本,我無法更改PHP內存的可用量。該腳本正在使用soap消耗Web服務。我無法一次獲得所有數據,否則它的內存不足,所以我在本地緩存mysql數據庫方面取得了一些成功,以便後續查詢更快。如何「釋放」循環中的內存?

基本上,而不是查詢5個月的數據的Web服務,我一次查詢1個月,並將其存儲在MySQL表中,並檢索下個月等。這通常工作,但我有時仍然用盡內存。

我的基本代碼的邏輯是這樣的:

  1. 用肥皂連接到Web服務;
  2. 連接到MySQL數據庫
  3. 查詢的Web服務,結果存儲在變量$結果;
  4. 轉儲$結果到MySQL表
  5. 重複數據

相同的變量每月步驟3和4在每個迭代中使用,所以我會假設,結果每一批從Web服務會覆蓋以前的內存?我嘗試在迭代之間使用unset($ results),但是沒有做任何事情。我每次輸出與memory_get_usage(true)一起使用的內存,每次迭代時使用的內存都會增加。

任何想法如何解決這個內存泄漏?如果我不清楚,留下評論,我可以提供更多的細節。謝謝!

***編輯

下面是一些代碼(我用的NuSOAP不是PHP5本地SOAP客戶端,如果有差別):

$startingDate = strtotime("3/1/2011"); 
$endingDate = strtotime("7/31/2011"); 
// connect to database 
mysql_connect("dbhost.com", "dbusername" "dbpassword"); 
mysql_select_db("dbname"); 
// configure nusoap 
$serverpath ='http://path.to/wsdl'; 
$client = new nusoap_client($serverpath); 
// cache soap results locally 
while($startingDate<=$endingDate) { 
    $sql = "SELECT * FROM table WHERE date >= ".date('Y-m-d', $startingDate)." AND date <= ".date('Y-m-d', strtotime($startingDate.' +1 month')); 
    $soapResult = $client->call('SelectData', $sql); 
    foreach($soapResult['SelectDateResult']['Result']['Row'] as $row) { 
     foreach($row as &$data) { 
      $data = mysql_real_escape_string($data); 
     } 
     $sql = "INSERT INTO table VALUES('".$row['dataOne']."', '".$row['dataTwo']."', '".$row['dataThree'].")"; 
     $mysqlResults = mysql_query($sql); 
    } 
    $startingDate = strtotime($startingDate." +1 month"); 
    echo memory_get_usage(true); // MEMORY INCREASES EACH ITERATION 
} 
+0

目前還沒有任何想法。嘗試粘貼一些代碼,也許我們看到一些奇怪的東西。 – fiunchinho

回答

5

解決了它。至少部分。使用nusoap存在內存泄漏。 Nusoap將調試日誌寫入$ GLOBALS變量。在nusoap.php中改變這行,釋放了大量內存。

變化

$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 9; 

$GLOBALS['_transient']['static']['nusoap_base']->globalDebugLevel = 0; 

我寧願只使用PHP5的本機SOAP客戶端,但我得到了奇怪的結果,我認爲是特定的web服務我想消耗。如果有人熟悉使用php5的soap客戶端和www.mindbodyonline.com的SOAP API,請告訴我。

+0

你可以在將來使用xhprof來解決這些類型的問題。 – chelmertz

+0

呵呵。很有意思。很好找!我希望人們交叉引用這個答案,因爲我找不到這樣的東西。我應該知道檢查全局變量。 –

+0

非常感謝你。這是我的救世主花了近3天的時間來確定爲什麼我的一個php腳本使用了500MB以上的內存。這是確切的問題。在PHP5中,我也遇到了本地SOAP客戶端的問題,因爲它不斷給我提供錯誤,說我沒有提供基於WSDL明確提供的字段。 – Ricky

-1

有你在$ STARTINGDATE和mysql_free_result()試圖unset()爲$ mysqlResults?

而且SELECT *是在即使在這裏不是問題皺起了眉頭。

編輯:也可以自由的SOAP結果也說不定。一些簡單的東西開始,看看是否有幫助。

+0

mysql_free_result()不適用於INSERT查詢,我試圖取消設置每個變量$ startingDate,$ sql,$ mysqlResults,$ row,$ data,$ soapResult並且內存使用不會改變 –

+0

呵呵。看起來別人也可能有你的問題。 http://www.php.net/manual/en/ref.soap.php#52758看起來像一個真正的記憶豬。我從來沒有使用過SOAP,大多數服務於JSON的RESTful服務。沒有其他的選擇,是嗎? –

+0

但我會嘗試不首先從SOAP服務器中選擇*。這可能無助於此。 –