[英]Memory accumulation with PHP SoapClient using call() method
當我在循環中使用 SoapClient 類的 call() 方法時,它似乎正在建立內存。
我試圖在互聯網上搜索解決方案,其中一些答案是禁用 WSDL 緩存,但它對我不起作用。 我曾嘗試使用ini_set("soap.wsdl_cache_enabled", 0)
並作為 SoapClient 類實例的參數禁用緩存。 我試過ini_set("soap.wsdl_cache_ttl", 0)
。 我也試過unset($this->_client)
和 unset($this->_session)。 沒有什么對我有用。
ini_set("soap.wsdl_cache_enabled", WSDL_CACHE_NONE);
private function _call($method, $params = null)
{
if (is_null($this->_client)) {
$soapParams = array(
'cache_wsdl' => WSDL_CACHE_NONE
);
$this->_client = new SoapClient($this->_getConfig('api/url'), $soapParams);
$this->_session = $this->_client->login($this->_getConfig('api/user'), $this->_getConfig('api/key'));
}
$memoryBefore = memory_get_usage();
echo "\n" . 'Memory Usage Before: ' . number_format($memoryBefore, null, '', '.');
$result = $this->_client->call($this->_session, $method, $params);
$memoryAfter = memory_get_usage();
echo "\n" . 'Memory Usage After: ' . number_format($memoryAfter, null, '', '.');
echo "\n" . 'Memory Usage Difference: ' . number_format($memoryAfter - $memoryBefore, null, '', '.') . "\n";
return $result;
}
有什么辦法可以解決嗎? 難道我做錯了什么?
我正在通過命令行運行以下方法(使用 PHP 5.3.29)
$ php -f 數據同步.php
Memory Usage Before: 13.244.400
Memory Usage After: 20.239.488
Memory Usage Difference: 6.995.088
Importing Orders...
1% [100/6055] - Page number (pagenum): 1 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 22.402.792
Memory Usage After: 29.519.432
Memory Usage Difference: 7.116.640
3% [200/6055] - Page number (pagenum): 2 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 29.519.984
Memory Usage After: 36.515.112
Memory Usage Difference: 6.995.128
4% [300/6055] - Page number (pagenum): 3 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 36.515.680
Memory Usage After: 43.723.440
Memory Usage Difference: 7.207.760
6% [400/6055] - Page number (pagenum): 4 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 43.724.056
Memory Usage After: 50.879.592
Memory Usage Difference: 7.155.536
8% [500/6055] - Page number (pagenum): 5 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 50.880.096
Memory Usage After: 58.083.616
Memory Usage Difference: 7.203.520
9% [600/6055] - Page number (pagenum): 6 Page size (pagesize): 100 Total pages: 61
Memory Usage Before: 58.084.232
Memory Usage After: 65.167.136
Memory Usage Difference: 7.082.904
11% [700/6055] - Page number (pagenum): 7 Page size (pagesize): 100 Total pages: 61
問題是別的東西。 抱歉。 我試圖隔離所有內容以找出代碼消耗內存的位置,但我忘記了遞歸執行的函數。
解決方案是用 do-while 替換遞歸方法。
請參閱: PHP:遞歸函數中的內存泄漏
我正在使用這個:
foreach ($result['items'] as $data) {
$datasyncOrder->saveOrder($data, $this->_useOriginalIds);
$this->_clv->printProgress($pageNumber, $result['pagesize'], $result['pages'], $result['page'], $result['total'], $index);
$index++;
}
if ($result['page'] < $result['pages']) {
$newResult = $this->_call('datasync.orders_export', array($result['page'] + 1, $result['pagesize']));
$this->_importOrders($newResult, $pageNumber, $index);
}
我替換為:
$originalPageNumber = $pageNumber;
do {
try {
if ($originalPageNumber == $pageNumber) {
$this->_clv->printString(Mage::helper('datasync')->__('Loading Orders...') . "\n");
}
$result = $this->_call('datasync.orders_export', array($pageNumber, $pageSize));
if ($originalPageNumber == $pageNumber) {
$this->_clv->printString(Mage::helper('datasync')->__('Importing Orders...') . "\n");
}
$index = 1;
foreach ($result['items'] as $data) {
$datasyncOrder->saveOrder($data, $this->_useOriginalIds);
$this->_clv->printProgress($pageNumber, $result['pagesize'], $result['pages'], $result['page'], $result['total'], $index);
$index++;
}
$pageNumber++;
} catch (Exception $e) {
$this->_setOriginalEntityIncrementInfo('order', Mage::getModel('eav/config')->getEntityType('order')->getEntityTypeId(), $this->_storeId);
}
} while ($result['page'] < $result['pages']);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.