2016-05-30 30 views
1

当我在循环中使用SoapClient类的call()方法时,它似乎在建立内存。使用call()方法使用PHP SoapClient进行内存堆积

我试图搜索互联网上的解决方案,一些答案是禁用WSDL缓存,但它没有为我工作。 我曾尝试使用ini_set("soap.wsdl_cache_enabled", 0)禁用缓存,并将其作为SoapClient类实例的参数。我试过ini_set("soap.wsdl_cache_ttl", 0)。我也试过unset($this->_client)并取消设置($ 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 29年3月5日)

$ PHP -f datasync.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  
+0

什么是你对结果做此方法返回:

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); } 

我更换吗? –

回答

0

问题是别的东西。对不起。 我试图隔离一切,找出代码在哪里消耗内存,但我忘了一个递归执行的函数。

解决方案是用do-while替换递归方法。

参见:PHP: Memory leak in recursive function

我用的是这样的:

$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']);