执行相同的PHP脚本,需要不同的内存

时间:2012-05-31 10:06:28

标签: php memory

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

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

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

两个mahchine中的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);
    }

我完全糊涂了,似乎'未设置'将无法释放足够的内存,PLZ帮助我。非常感谢!!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

要确定两个服务器“相同”,请将phpinfo();的输出转储到两个文件中并对它们执行diff!只有服务器名称,唯一ID和一些日期应该不同......