2

次のphpスクリプトを実行してローカルマシンで統計を実行すると、、でうまく機能しますinit_set('memory_limit', 100M)

ただし、同じphpスクリプトを別のWebサーバーで実行し、同じファイルを処理すると(これについては確信しています)、機能しません。

memory_limitを1000Mに変更しましたが、それでも機能せず、例外が発生します:「致命的なエラー:許可されたメモリサイズ1048576000バイトが使い果たされました(32バイトを割り当てようとしました)」。最後に私はに変更しますinit_set('memory_limit', 1300M)、それは動作します!

2つの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);
    }

私は完全に混乱しています。「unset」では十分なメモリが解放されないようです。plzが私を助けてくれます。どうもありがとう!!

4

1 に答える 1

2

おそらく別のモジュールがインストールされています...

さらに多くのことがスクリプトのクラッシュを引き起こす可能性があります(無限のループのようです)。

  • スクリプトを実行するWebサーバーのさまざまなユーザー権限
  • リモートサーバーにアクセスするためのさまざまなPHP.ini設定(safe_mode ...)
  • アクセスしたいファイルの読み取り権限が異なります
  • 異なるMySQLサーバーのバージョン
  • 別のMySQLユーザー/テーブル/...権限

あなたが受け取っているエラーは、スクリプトが間違っているためであり、メモリ使用量が異なるためではないと確信しています。また、許可されたメモリサイズmemory_limitが本当に編集可能かどうかを確認する必要がありini_set()ます。echo ini_get('memory_limit');設定してみたら、両方のマシンで確認してください。

両方のサーバーが「同じ」であることを本当に確認するには、の出力phpinfo();を2つのファイルにダンプし、diffそれらに対して実行します。サーバー名、一意のID、および一部の日付のみが異なる必要があります...

于 2012-05-31T10:07:37.643 に答える