2

当我运行以下 php 脚本在我的本地机器上做一些统计时,它适用于init_set('memory_limit', 100M)

但是,当我在另一个 Web 服务器中执行相同的 php 脚本,处理相同的文件时(我确信这一点),它不起作用。

我将 memory_limit 更改为 1000M,它仍然不起作用,给出异常:“致命错误:允许的内存大小为 1048576000 字节已用尽(试图分配 32 个字节)”。最后我改为init_set('memory_limit', 1300M),它的工作原理!

两台机器的php版本相同:

PHP 5.3.6 (cli) (built: Mar 28 2012 02:18:34) 
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
    with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

以下是主要脚本:

     protected function _insertTable($logType, $conf, $logFileName) {


        $logPath = $this->_getLogDirPath($logType, $conf) . DIRECTORY_SEPARATOR . $logFileName;
        $fileContent = file_get_contents($logPath);
        if ( !fileContent ) return;

        $fields = array_keys($conf['fields']);

        $dao = new dao\StatLogDao($this->_entities[$logType]);

        $lines = explode("\n", $fileContent);
$fileContent = null;
        unset($fileContent);
        foreach ( $lines as $line ) {
            $line = trim($line);
            if ( !$line ) continue;

            $lineData = explode($conf['glue'], $line);
            if ( !$lineData[0] ) continue;

            $entity = $this->_getEntity($logType);
            foreach ($fields as $k => $f) {
                $entity->$f = $lineData[$k];
            }

            try {
              $dao->replace($entity, $fields);
            } catch (Exception $e) {
                echo $e->getMessage() . "\n";
            }
$entity = null;
            unset($entity);
$line = null;

            unset($line);
        }
$lines = null;
        unset($lines);
$dao = null;
        unset($dao);
    }

我很困惑,似乎“未设置”不会释放足够的内存,请帮帮我。非常感谢!!

4

1 回答 1

2

您可能安装了不同的模块...

还有很多事情会导致您的脚本崩溃(似乎是一个无限循环):

  • 执行脚本的网络服务器的不同用户权限
  • 用于访问远程服务器的不同 PHP.ini 设置(安全模式...)
  • 您要访问的文件具有不同的读取权限
  • 不同的 MySQL 服务器版本
  • 不同的 MySQL 用户/表/...权限

我很确定您收到的错误是因为您的脚本出错而不是因为不同的内存使用情况。您还应该检查允许的内存大小memory_limit是否真的可以通过ini_set(). echo ini_get('memory_limit');尝试设置后在两台机器上检查它。

要真正确保两台服务器“相同”,将输出转储phpinfo();到两个文件中并diff对其执行操作!只有服务器名称、唯一 ID 和某些日期应该不同......

于 2012-05-31T10:07:37.643 回答