我有一個在共享主機環境中運行的腳本,我無法更改PHP內存的可用量。該腳本正在使用soap消耗Web服務。我無法一次獲得所有數據,否則它的內存不足,所以我在本地緩存mysql數據庫方面取得了一些成功,以便後續查詢更快。如何「釋放」循環中的內存?
基本上,而不是查詢5個月的數據的Web服務,我一次查詢1個月,並將其存儲在MySQL表中,並檢索下個月等。這通常工作,但我有時仍然用盡內存。
我的基本代碼的邏輯是這樣的:
- 用肥皂連接到Web服務;
- 連接到MySQL數據庫
- 查詢的Web服務,結果存儲在變量$結果;
- 轉儲$結果到MySQL表
- 重複數據
相同的變量每月步驟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
}
目前還沒有任何想法。嘗試粘貼一些代碼,也許我們看到一些奇怪的東西。 – fiunchinho