6

我的一个客户报告说他们的 Magento 系统中的一些代码存在一个奇怪的问题(Magento 是一个用 PHP 编写的电子商务平台)。我无法直接访问系统进行调试和调试,所以我想我会问 Stack Overflow,如果你见过这样的事情。

他们偶尔看到的错误是

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;
}

正如 Alan 在评论中指出的那样,Zend Guard 也可能导致问题。

于 2012-11-17T02:52:15.263 回答