间歇性Magento错误


Intermittent Magento Errors

我们的暂存机器出现问题,该机器正在运行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