我的一位客户在他们的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可能会这样做。触发错误的行(callstack中的#4,Observer.php
中的第191行附近)应为
if(defined("Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS"))
{
$path = Mage_Core_Block_Template::XML_PATH_DEBUG_TEMPLATE_HINTS;
}
这些行似乎没有提及名为O1ucm02owqn3iwwcx5osz2m2
的任何PHP类(我说"应该是"因为客户自己部署了代码,我'与他们合作获取副本以寻找潜在的问题)。
有没有人知道可能会发生什么?这是一个已知的PHP错误/某个版本的问题和/或有没有人在PHP自动加载器/ defined
/类常量中看到这样的问题?
(我和我的客户合作确定他们正在运行的PHP版本,以及获取他们已部署的文件的副本,以确保它们符合我的假设。)
答案 0 :(得分:1)
defined()函数用作命名常量的define()函数的补充。也就是说,使用define可以很好地检查使用defined声明的常量。
但是,该代码正在检查class constant,虽然可能,但不太常见。我怀疑检查是触发自动加载(just as the use of class_exists can trigger autoloading。)但是,通过使用定义传递给自动加载器的值被破坏(可能会移交hash of the z-val for the string。)
我想知道以下改变是否可以解决问题:
// 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;
}
艾伦在评论中指出,Zend Guard也可能引发一个问题。