我们的暂存机器出现问题,该机器正在运行Magento EE 1.13.1
这个问题从星期二下午开始出现。
当时我们更新了一个已安装的php/mysql应用程序。
在主magento网站上,浏览器被重定向到magento安装页面。
该问题只发生在Magento应用程序中,并且与会话有关——当错误发生时,Magento会抛出类似于以下的致命错误:
(我创建了一个小型测试应用程序,试图隔离问题)。
致命错误:在第71行上调用/var/www/html/app/code/core/Mage/Customer/Model/Session.php中非对象的成员函数getCode()
Call Stack: 0.0002 653728
1. {main}() /var/www/html/t.php:0 0.3013 8153600
2. Mage::getSingleton() /var/www/html/t.php:20 0.3013 8153912
3. Mage::getModel() /var/www/html/app/Mage.php:477 0.3013 8153912
4. Mage_Core_Model_Config->getModelInstance() /var/www/html/app/Mage.php:463 0.3016 8302032
5. Mage_Customer_Model_Session->__construct() /var/www/html/app/code/core/Mage/Core/Model/Config.php:1348
这个问题只是间歇性发生的,我们可以通过停止和启动httpd服务来暂时解决它。
我们正在运行magento ee 1.13.1、php 5.3.3和httpd 2.2.15
这发生在临时计算机上。我们的生产机器有相同的系统和代码,工作正常。
我们已经尝试打开/关闭magento编译、缓存、php-apc,将php会话更改为使用磁盘而不是/tmp/fs,并将magento更改为使用DB进行会话。
站点在几分钟后出现故障。
系统日志中没有错误。
有人能建议如何调试吗?
这是一个与libxml_disable_entity_loader()
函数有关的问题。
zend框架调用这个函数libxml_disable_entity_loader
(true),然后用(false)再次调用它。
在我们的代码中,有一条路径将此设置为true。
此设置的范围不限于当前的php脚本,而是当前的httpd进程。也就是说,它是粘性的,这会阻止php的simplexml_load_file
函数加载外部文件。
我偶然发现了这篇文章:
间歇性simplexml_load_file():本地Joomla站点上的I/O警告
这让我发现libxml_disable_entity_loader
不是线程安全的,而且在httpd进程中确实是"粘性的"。
禁用Magento编译:
$ php -f shell/compiler.php -- disable
Compiler include path disabled
有三种方法可以做到这一点:
- 来自Magento管理员
导航到系统&rar;工具&rar;编译页面,然后单击禁用按钮。导航到系统&rar;"缓存管理"屏幕,然后使用"刷新缓存"按钮 使用SFTP,通过在includes/config.php文件中编辑
要禁用Magento中的编译,请编辑includes/config.php。取消第一行的注释并注释掉第二行:define('COMPILER_INCLUDE_PATH', dirname(FILE).DIRECTORY_SEPARATOR.'src'); define('COMPILER_COLLECT_PATH', dirname(FILE).DIRECTORY_SEPARATOR.'stat');
使用SSH外壳程序:
php -f shell/compiler.php -- disable php -f shell/compiler.php -- clear