(1)、
php -v 查
httpd的error_log里出现:
Failed loading /usr/local/Zend/lib/ZendExtensionManager.so: filed to map segment from shared object: Permission denide
原因:
就是无法加载zend模块,因为是selinux对系统进行了保护。
解决方法:
1) Disable SELinux by editing /etc/selinux/config and setting SELINUX=disabled' there.
2) If you want SELinux enabled, you can remove SELinux protection from httpd by using system-config-securitylevel tool
3) If you want SELinux protection on httpd, use this to enable loading Zend modules: chcon -t httpd_modules_t `find /usr/local/Zend/lib -name /*.so`
说一下。这里zend提供了三种方案,
一种是直接禁用selinux: 修改 /etc/selinux/config 中 SELINUX=disabled
第二种是停止对http服务的保护:root命令行输入system-config-securitylevel进行设置
第三种是,继续对http服务保护,使用"chcon -t httpd_modules_t `find /usr/local/Zend/lib -name /*.so`"(引号内)命令允许加载zend模块
参考文档:
http://www.zend.com/support/know ... 123&view_only=1
执行
chcon -t httpd_modules_t `find /usr/local/Zend/lib -name /*.so`
后,重启httpd 服务,log中虽找不到错误,但zend仍不起效。偶然执行 php –v 命令
shell>php -v
Failed loading /usr/local/Zend/lib/Optimizer-3.0.1/php-5.1.x/ZendOptimizer.so: /usr/local/Zend/lib/Optimizer-3.0.1/php-5.1.x/ZendOptimizer.so: cannot restore segment prot after reloc: Permission denied
PHP 5.1.4 (cli) (built: May 8 2006 08:41:41)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with Zend Extension Manager v1.0.10, Copyright (c) 2003-2006, by Zend Technologies
看来还是Selinux的原因
执行
chcon -t httpd_modules_t `find /usr/local/Zend/lib/Optimizer-3.0.1/php-5.1.x -name /*.so`
重启httpd
很失望,Zend仍不起效
后禁止掉Selinux ,重启后再打开zend 经成功了,真是奇怪,不懂selinux 不知为什么。
(2)、
Redhat类的系统装完php后经常出现 Zend Optimizer安装不上的问题, 下面是解决办法
安装好PHP后 下载zend optimizer安装3.3版本, 安装zend提示成功后
php -v 却看不到zend版本,phpinfo()也是一样的
1. 原因:php.ini文件路径问题
解决方法
php -i | grep php.ini 就可以找到当前php使用的php.ini文件
比如, 编译安装时没有指定php.ini存放路径, 那么默认php.ini会放在/usr/local/lib下面
最好是在编译PHP时指定PHP配置文件的路径 如: --with-config-file-path=/usr/local/etc
而一般zend默认安装 php.ini在/etc/目录下面或/usr/local/Zend/etc 所以需要在安装的时候手工指定我们php.ini文件存放的位置
如果, 不知道现在的PHP 的配置文件具体位置的话 可以查看一下:
php -i | grep php.ini
如果php optimizer安装好了 却发现不能加载的话可以 手工指定读取php.ini文件的位置
php -c /etc/ -v 如果可以看到zend opt正确加载
那么做个连接就好了 连接到php默认读取的php.ini路径下面
比如
ln -sf /etc/php.ini /usr/local/lib
[root@localhost /]# php -v
PHP 5.2.5 (cli) (built: Jan 22 2006 12:59:19)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
with Zend Extension Manager v1.0.9, Copyright (c) 2003-2006, by Zend Technologies
with Zend Optimizer v3.3.2, Copyright (c) 1998-2006, by Zend Technologies
Ok 正常了 phpinfo()看到的当然也是一样的
2. 调用库文件的问题
有的时候还有一些情况下 php -i 或php -v 在控制台下可以看到zend opt,
但是 apache 执行phpinfo的输出里面却看不到
一般是因为 调用php的时候zend模块不能加载, 比如AS4里面 就是这样的
如as4下面默认的php安装后读取库文件的路径 是在/usr/lib下面 ,
而php.ini文件中加载zend模块是在zend安装路径的lib目录中
比如/usr/local/Zend/lib 这时apache在执行php时 不能加载zend模块 所以 在控制台里php -v 可以正常
但是apache 却没有加载zend。
解决办法
先把zend模块copy到
/usr/lib里面 然后改一下php.ini里面zend加载模块部分
3. 最恶心的SElinux问题
SElinux导致PHP不能使用zend/lib下的库文件。所以,即便是做了link也不行。只能够拷贝库文件到有权限的目录。或者直接关掉SElinux
Redhat系统,修改/etc/sysconfig/selinux文件:
#SELINUX=enforcing
SELINUX=disabled
重启生效,如果不想重启,用命令
setenforce 0