如何“释放”?内存循环


How to "release" memory in loop?

我有一个脚本,它运行在一个共享的主机环境中,我不能改变可用的PHP内存量。该脚本通过soap使用web服务。我不能一次获得所有的数据,否则它会耗尽内存,所以我在mysql数据库本地缓存数据取得了一些成功,以便随后的查询更快。

基本上,而不是查询web服务的5个月的数据,我查询它1个月的时间和存储在mysql表和检索下一个月等。这通常是有效的,但有时我仍然用完内存。

我的基本代码逻辑是这样的:
  1. 使用soap连接web服务;连接mysql数据库
  2. 查询web服务并将结果存储在变量$results中;
  3. dump $results到mysql表
  4. 每个月的数据重复步骤3和4

在每次迭代中使用相同的变量,所以我假设来自web服务的每批结果将覆盖内存中的前一批?我尝试在迭代之间使用unset($results),但没有做任何事情。我每次使用memory_get_usage(true)输出所使用的内存,并且每次迭代所使用的内存都会增加。

任何想法我可以如何修复这个内存泄漏?如果我说得不够清楚,请留下评论,我可以提供更多细节。谢谢!

* * *编辑

下面是一些代码(我使用的是nussoap,而不是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
}

解决了。至少部分是这样。使用nussoap存在内存泄漏。nussoap将调试日志写入$GLOBALS变量。修改nussoap .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,请告诉我。

您是否尝试过$startingDate上的unset()和$mysqlResults上的mysql_free_result() ?

另外SELECT *是不赞成的,即使这不是这里的问题。

编辑:也许还可以释放SOAP结果。从一些简单的东西开始,看看是否有帮助。