Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP尝试自动加载随机类名_Php_Magento_Autoload - Fatal编程技术网

PHP尝试自动加载随机类名

PHP尝试自动加载随机类名,php,magento,autoload,Php,Magento,Autoload,我的一位客户报告说,他们的Magento系统中的一些代码有一个奇怪的问题(Magento是一个用PHP编写的电子商务平台)。我没有直接访问系统的权限,因此我想我应该问问Stack Overflow,您是否见过类似的情况 他们偶尔看到的错误是 Warning: include(O1ucm02owqn3iwwcx5osz2m2.php): failed to open stream: 具有一个调用堆栈,其中包括 #0 /Users/theirusername/Sites/project/lib/

我的一位客户报告说,他们的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,在
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自动加载程序定义的类常量出现类似问题吗

(我正在与我的客户一起确定他们正在运行的PHP的版本,并获取他们部署的文件的副本,以确保它们与我假设的文件相匹配。)

defined()函数是对define()函数命名常量的补充。也就是说,可以很好地检查用声明的常量

但是,该代码正在检查一个,虽然可能,但不太典型。我怀疑该检查正在触发自动加载(。但是,通过使用defined传递给自动加载程序的值已损坏(可能是传递了。)

我想知道以下更改是否会使事情正常进行:

// 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也可能引起问题。

他们正在使用哪些其他第三方扩展?还有哪些其他PHP模块?感觉像是某种腐败。他们使用APC、XCache或eAccelerator吗?另外,它总是被请求的同一个类,还是总是一些随机的废话?碰巧正在使用Zend Guard Loader?似乎是过于热衷于不时更改名称,从而以您描述的方式破坏脚本。对我来说,这看起来像恶意软件+1,因为您所说的几乎所有内容都是准确的、好的建议,除了“通常类中的常量不会更改”。存在这些检查是因为随着时间的推移,常量已添加到Magento,并且我的产品需要支持以前可能没有这些常量的版本。(很确定这是Zend Guard的问题,在
定义的
中没有很好地处理类常量)有效点,Alan。我已经相应地更新了答案。我想强调的是,这些类型的检查并不频繁,这可能是这样一个bug能够潜入的原因,但事实上,我的语言最初太强了。