まず、次のような状況が常に発生するわけではありませんが、1 日に 1 回か 2 回 (1 日 1 回ではない場合もあります) 発生する可能性があります。また、本番環境でのみ発生します。そのため、適切なデバッグを行うのは非常に難しく、バックトレースをキャプチャしてログに記録することしかできませんでした。
を拡張するORMモデルがあります\Orm\Model
。Model_X::find()
必要なオブジェクトを取得するために使用しています。しかし、そのモデルのコンストラクターでは、奇妙なことが起こり始めます。
コンストラクタの最初の行は
if( ! empty($this->_data))
これにより magic がトリガーされ、次の行から__isset('_data')
magic が呼び出されます。__get('_custom_data')
elseif (array_key_exists($property, $this->_custom_data))
これは、最終的に例外がスローされるまで続きます。
Undefined property: Model_X::$_view
この行から:
elseif ($this->_view and in_array($property, static::$_views_cached[get_class($this)][$this->_view]['columns']))
ここで奇妙なのは、これらすべてのプロパティ _data、_view、_custom_data が\Orm\Model
クラスで定義されていることです。そして、私の理解では、プロパティが定義されている場合、__get を呼び出す必要はありません。「オーバーロード メソッドは、宣言されていない、または現在のスコープで表示されていないプロパティまたはメソッドと対話するときに呼び出される」ためです。
私の質問は: 実際には、そのプロパティがこのクラスに対して定義されているのに、なぜ empty($this->_data) が __isset を呼び出す (そしてそれが後続のすべての呼び出しをトリガーする) のですか?
これは、バックトレースの関連部分です。
"file": "/fuel/packages/orm/classes/model.php",
"line": 1028,
"function": "{closure}",
"args": [8, "Undefined property: Model_Supplier::$_view", "/fuel/packages/orm/classes/model.php", 1028, {
"property": "_view",
"rel": false,
"this": {},
"value": false
"file": "/fuel/packages/orm/classes/model.php",
"line": 865,
"function": "get",
"class": "Orm\\Model",
"object": {},
"type": "->",
"args": ["_view"]
"file": "/fuel/packages/orm/classes/model.php",
"line": 1028,
"function": "__get",
"class": "Orm\\Model",
"object": {},
"type": "->",
"args": ["_view"]
"file": "/fuel/packages/orm/classes/model.php",
"line": 865,
"function": "get",
"class": "Orm\\Model",
"object": {},
"type": "->",
"args": ["_custom_data"]
"file": "/fuel/packages/orm/classes/model.php",
"line": 899,
"function": "__get",
"class": "Orm\\Model",
"object": {},
"type": "->",
"args": ["_custom_data"]
"file": "/fuel/packages/orm/classes/model.php",
"line": 730,
"function": "__isset",
"class": "Orm\\Model",
"object": {},
"type": "->",
"args": ["_data"]
"file": "/fuel/packages/orm/classes/model.php",
"line": 124,
"function": "__construct",
"class": "Orm\\Model",
"object": {},
"type": "->",
編集:私は実際にこれを解決しました(私は思う)。エラーはphp-fpmの再起動後に消えるので、私の考えはこれでした-再起動後に破損したキャッシュがクリーンアップされた後、キャッシュが破損します。進行中の唯一のキャッシュは APC であるため、行って無効にしました。