当前位置: 代码迷 >> 综合 >> 安装zend 一切正常,zend装上后不起效!
  详细解决方案

安装zend 一切正常,zend装上后不起效!

热度:47   发布时间:2024-01-05 06:53:41.0

(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

  相关解决方案