简体   繁体   English

使用 call() 方法使用 PHP SoapClient 累积内存

[英]Memory accumulation with PHP SoapClient using call() method

When I use the call() method of the SoapClient class in loop it seems to be building up memory.当我在循环中使用 SoapClient 类的 call() 方法时,它似乎正在建立内存。

I have tried to search for solutions on the internet and some of the answers are to disable WSDL Cache, but it did not work for me.我试图在互联网上搜索解决方案,其中一些答案是禁用 WSDL 缓存,但它对我不起作用。 I have tried disabling cache with ini_set("soap.wsdl_cache_enabled", 0) and as a parameter of the SoapClient class instance.我曾尝试使用ini_set("soap.wsdl_cache_enabled", 0)并作为 SoapClient 类实例的参数禁用缓存。 I have tried ini_set("soap.wsdl_cache_ttl", 0) .我试过ini_set("soap.wsdl_cache_ttl", 0) I also have tried unset($this->_client) and unset($this->_session).我也试过unset($this->_client)和 unset($this->_session)。 Nothing worked for me.没有什么对我有用。

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

Is there any way to solve that?有什么办法可以解决吗? Am I doing something wrong?难道我做错了什么?

I'm running the following method via the command line (using PHP 5.3.29)我正在通过命令行运行以下方法(使用 PHP 5.3.29)

$ php -f datasync.php $ 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    

The problem was something else.问题是别的东西。 I'm sorry.抱歉。 I tried to isolate everything to find out where the code was consuming memory but I forgot a function executing recursively.我试图隔离所有内容以找出代码消耗内存的位置,但我忘记了递归执行的函数。

The solution was to replace recursively methods with do-while.解决方案是用 do-while 替换递归方法。

See: PHP: Memory leak in recursive function请参阅: PHP:递归函数中的内存泄漏

I was using this:我正在使用这个:

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

I replaced with:我替换为:

    $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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM