6

私の顧客は、Magentoシステムの一部のコードに奇妙な問題があると報告しています(MagentoはPHPで記述されたeコマースプラットフォームです)。私はシステムに直接アクセスして調べたりデバッグしたりすることができないので、このようなものを見たことがあれば、StackOverflowに聞いてみようと思いました。

彼らが時々見ているエラーは

Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 

を含むコールスタックを使用

#0 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): mageCoreErrorHandler(2, 'include(O1ucm02...', '/Users/theiruse...', 93, Array)
#1 /Users/theirusername/Sites/project/lib/Varien/Autoload.php(93): Varien_Autoload::autoload()
#2 [internal function]: Varien_Autoload->autoload('o1ucm02owqn3iww...')
#3 [internal function]: spl_autoload_call('o1ucm02owqn3iww...')
#4 /Users/theirusername/Sites/project/app/code/local/Theirname/Commercebug/Model/Observer.php(191): defined('Mage_Core_Block...')

このことから、PHPは。という名前のクラスをインスタンス化する必要があると考えていると推測できますO1ucm02owqn3iwwcx5osz2m2。しかし、なぜPHPがこれを行っているのか理解できません。エラーをトリガーする行(コールスタックの#4、の行191の前後Observer.php)は次のようになります。

if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}

これらの行には、名前の付いたPHPクラスが記載されていないようですO1ucm02owqn3iwwcx5osz2m2(お客様がコードを自分でデプロイしたため、「すべき」と言います。潜在的な問題を探すためにコピーを入手するために協力しています)。

誰かが何が起こっているのか考えていますか?これは、あるバージョンでの既知のPHPバグ/問題ですか、および/またはPHPオートローダー/ defined/クラス定数でこのような問題を見た人はいますか?

(私は顧客と協力して、実行しているPHPのバージョンを確認し、展開したファイルのコピーを取得して、私が想定しているものと一致するようにしています。)

4

1 に答える 1

1

defined()関数は、名前付き定数のdefine()関数を補完するものとして機能します。つまり、defineで宣言された定数は、 definedでうまくチェックできます。

ただし、そのコードはクラス定数をチェックしていますが、これは可能ではありますが、あまり一般的ではありません。チェックによってオートロードがトリガーされていると思われます(class_existsを使用するとオートロードがトリガーされるのと同じです)。ただし、definedを使用してオートローダーに渡される値はマングルされます(おそらく、文字列のz-valのハッシュが渡されます) 。 )。

次の変更で問題が解決するかどうか疑問に思っています。

// force PHP to load the class first, then let defined() check for the constant
if(class_exists("Mage_Core_Block_Template") && defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
    $path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}

アランがコメントで述べたように、ZendGuardも問題を引き起こしている可能性があります。

于 2012-11-17T02:52:15.263 に答える