少しエラーが発生し、どこから始めるべきかの手がかりが見つかりません...
[11-Oct-2012 22:01:45] PHP の致命的なエラー: 行 545 の /var/www/web1/html/inc/ProjectCache.php の非オブジェクトに対するメンバー関数 getVariableIndices() の呼び出し
非常に単純に聞こえますが、コードは次のとおりです(行番号付き)
525 $itemData = $queryItems->fetchRows();
525 foreach ($questionData as $qData) {
526 $qp = QuestionPack::createWithData($qData, $itemData);
<snip>
538 $question = $qp->createGenerator(null);
539 if (!is_object($question)) {
540 trigger_error('Could not initialize generator ...', E_USER_WARNING);
541 continue;
542 }
543
544 // Question variables
545 $vix = $question->getVariableIndices();
<snip>
597 $question->destroy();
598 }
メソッド createGenerator() は常にオブジェクトを返す必要があります。デバッグ上の理由から、後続の IF ステートメントを追加しました - 私の考えが完全に間違っているかどうかはわかりません...
destroy メソッドは、一部のインスタンス変数 (他のオブジェクトへの参照) を null に設定するため、ガベージ コレクターは循環参照に固執しません。
この問題は、生産システム (Debian、PHP 5.3.3-7+squeeze14) 上の約 10.000 プロジェクトのうちの 1 つだけで発生します。同じスクリプトとデータベースからの同じデータを使用して、Windows 開発者システム (PHP 5.3.1) に複製できませんでした。
スクリプトがこのステートメントに到達する前に、何百、何千ものメソッド呼び出しが行われることに注意してください (この実行中にキャッシュが初期化されるため、処理時間は約 14 秒です)。
現時点での私の最良の説明は、PHP スクリプトのメガバイトのどこかで、バッファ オーバーフローをトリガーするか、ガベージ コレクターを誤解させて、オブジェクトがまだ使用されているにもかかわらず解放されるということです。ただし、エラーは常に同じプロジェクトで、常に同じ行でトリガーされます (前に他のデバッグ コードを配置すると、このステートメントで移動します)。これは、私の考えでは非常に珍しいように思えます。
Web サーバーを再起動しても (もちろん) 役に立ちませんでした。以前のキャッシュ ファイルを削除しても、問題は解決しませんでした。これは私が立ち往生しているところです。他の誰かがこれがおかしいと思いますか? どこから始めればよいか考えている人はいますか??
ありがとう
バーニンレオ