CentOS 6.5 x64 上 PHP 升级后 Apache 无法启动

CentOS 6.5 x64 上 PHP 升级后 Apache 无法启动

我有一台安装了 CentOS 6.5 和 PHP 5.5.11(来自 REMI repos 的最新版本)的开发服务器。今天我做了:

yum --enablerepo=remi,remi-php55 update

这更新了 Apache 和其他一些库,如 PHP 的 Mongo(我认为是 PECL)。更新后,我重新启动了服务httpd,发现无法关闭 Apache。“显然”重新启动它解决了这个问题,但现在我发现服务器无法正常工作 - 无法提供网页。

检查 Apache 日志显示以下行:

PHP 致命错误:PHP 启动:为防止数据损坏,您不得在 32 位平台上打开 mongo.native_long 设置,位于第 0 行的未知位置

也许我可以通过禁用或卸载该扩展来解决这个问题,但由于我在某些地方使用该扩展,所以这不是一个真正的选择。

除了禁用扩展之外,还有什么关于如何解决此问题的建议吗?

编辑:为什么如果系统是 i686 并且库是 i686 我会收到这个错误

我对 YUM 日志进行了一些研究并看到了结果:

tail /var/log/yum.log
Apr 03 01:25:45 Updated: php-recode-5.5.11-1.el6.remi.i686
Apr 03 01:25:45 Updated: php-mbstring-5.5.11-1.el6.remi.i686
Apr 03 01:25:46 Updated: php-intl-5.5.11-1.el6.remi.i686
Apr 03 01:25:47 Updated: php-xml-5.5.11-1.el6.remi.i686
Apr 04 09:09:59 Updated: krb5-libs-1.10.3-15.el6_5.1.i686
Apr 04 09:10:00 Updated: httpd-tools-2.2.15-30.el6.centos.i686
Apr 04 09:10:07 Updated: php-pecl-mongo-1.5.0-1.el6.remi.5.5.i686
Apr 04 09:10:15 Updated: httpd-2.2.15-30.el6.centos.i686
Apr 04 09:10:16 Updated: krb5-workstation-1.10.3-15.el6_5.1.i686
Apr 04 09:10:21 Updated: krb5-devel-1.10.3-15.el6_5.1.i686

为什么php-pecl-mongo-1.5.0-1.el6.remi.5.5.i686我收到这个错误?出了什么问题?

编辑 2:降级有问题的扩展

由于之前的测试没有成功,我现在尝试按照如下方式降级该库:

yum downgrade php-pecl-mongo-1.5.0-1.el6.remi.5.5.i686 --enablerepo=remi,remi-php55
Loaded plugins: fastestmirror, security
Setting up Downgrade Process
Loading mirror speeds from cached hostfile
 * base: centos.secrel.com.br
 * epel: mirror.cedia.org.ec
 * extras: centos.secrel.com.br
 * remi: mirror.1000mbps.com
 * remi-php55: mirror.1000mbps.com
 * updates: mirrors.ucr.ac.cr
Only Upgrade available on package: php-pecl-mongo-1.5.0-1.el6.remi.5.5.i686
Nothing to do

但我不能,所以对此有什么帮助吗?

EDIT3:寻找 php.ini 位置

因此,由于 Ubuntu 和 CentOS 具有不同的配置,我认为 Apache 可能使用另一个php.ini文件,但它使用了我所做的更改,如下所示:

locate php.ini
/etc/php.ini
/etc/php.ini.rpmnew
/usr/share/doc/php-common-5.5.11/php.ini-development
/usr/share/doc/php-common-5.5.11/php.ini-production
/var/www/html/apps/portal_de_logistica/vendor/doctrine/cache/tests/travis/php.ini
/var/www/html/apps/portal_ingenieros/vendor/doctrine/cache/tests/travis/php.ini
/var/www/html/imaginamos/vendor/doctrine/cache/tests/travis/php.ini
/var/www/html/kraken/vendor/doctrine/cache/tests/travis/php.ini

/etc/php.ini文件末尾我有这个:

;Mongo
[mongodb]
mongo.native_long = 0
mongo.long_as_object = 1

另外,我还通过执行 a 找到了任何可能导致问题的文件ini_set(),但没有找到任何内容,如下所示:

grep -R "mongo.native_long" /var/www/html/
grep: /var/www/html/apps/portal_de_logistica/web/bundles/acmedemo: No such file or directory

解决方案

因此,经过一番头痛之后,我找到了解决方案:

yum remove php-pecl-mongo-1.5.0-1.el6.remi.5.5.i686
yum --enablerepo=remi,remi-php55 install php-devel.i686
pecl install mongo

添加“extension=mongo.so”之后php.ini我的Apache又可以工作了

答案1

您的错误如下:

PHP 致命错误:PHP 启动:为防止数据损坏,您不得在 32 位平台上打开 mongo.native_long 设置,位于第 0 行的未知位置

这里的关键是mongo.native_long设置。看起来你的操作系统是 32 位的,但这个特定的设置需要 64 位操作系统。如果这是一台开发服务器,对你来说最好的长期解决方案是将其重建为 64 位操作系统。

更直接的选择是进入您的php.ini文件并禁用(不是全部的 MongoDB),方法是像这样mongo.native_long放置此配置参数:php.ini

mongo.native_long = 0

现在重新启动 Apache。一切应该可以正常工作。假设mongo.native_long您的代码库中不需要特定的功能。有关 MongoDB 配置的更多详细信息,请查看官方文档在这里。有关 的更多详细信息mongo.native_long这篇博文似乎很有帮助:

在 64 位平台上,mongo.native_long 设置允许将 64 位整数存储在 MongoDB 中。在这种情况下使用的 MongoDB 数据类型是 BSON LONG,而不是关闭此设置时使用的 BSON INT。此设置还会改变从 MongoDB 读回 BSON LONG 时的行为方式。如果不启用 mongo.native_long,驱动程序会将每个 BSON LONG 转换为 PHP double,从而导致精度损失。

答案2

您的错误似乎与 mongo php 驱动程序的此更新有关:https://jira.mongodb.org/browse/PHP-971(如果你查看 git commit 中的错误,它就是这样)。

如果您已设置mongo.native_long为 0,但仍然收到错误,请查看任何 php 脚本或 php 页面,并查看它们是否位于ini_set('mongo.native_long', 1);顶部(考虑到它抱怨第 0 行)。

相关内容