Contents

centos安装配置Zend Optimizer详解

Contents

最近在折腾lamp的时候发现一些程序需要Zend Optimizer支持,于是进一步的去折腾,其中不少乐趣只可意会不可言传……

centos安装Zend Optimizer很简单,首先确定自己的PHP版本(必须版本是小于5.3的)
PS: 查看系统PHP版本可以运行 php -v

一、下载安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11


  
wget http://downloads.zend.com/optimizer/3.3.3/ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz  
  
tar -xzvf ZendOptimizer-3.3.3-linux-glibc23-i386.tar.gz  
  
./ZendOptimizer-3.3.3-linux-glibc23-i386/install.sh

  

基本上一路回车就可以了,安装会自动检测php.ini和apache的路径。

二、配置

1
2
3
4
5
6
7


  
#php -v  //查看安装成功与否

  

问题:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19


  
Failed loading /usr/local/Zend/lib/Optimizer-3.3.0/php-5.1.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer-3.3.0/php-5.1.x/ZendOptimizer.so: cannot restore segment protafter reloc: Permission denied   
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer-3.3.0/php-5.1.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer-3.3.0/php-5.1.x/ZendOptimizer.so: cannot restore segment protafter reloc: Permission denied

  

说明没有加载zend optimizer模块。

大概可能有三种情况:

  1. 对于 php.ini文件路径问题(使用apache的 phpinfo()显示php.ini路径正确与否,一般不会有错 )

解决方法:

1
2
3
4
5
6
7


  
php -i | grep php.ini

  

就可以找到当前php使用的php.ini文件。
比如, 编译安装时没有指定php.ini存放路径, 那么默认php.ini会放在/usr/local/lib下面。最好是在编译PHP时指定PHP配置文件的路径

如:

1
2
3
4
5
6
7


  
-with-config-file-path=/usr/local/etc

  

而一般zend默认安装 php.ini在/etc/目录下面或/usr/local/Zend/etc 所以需要在安装的时候手工指定我们php.ini文件存放的位置。

如果不知道现在的PHP的配置文件具体位置的话 可以查看一下:

1
2
3
4
5
6
7


  
php -i | grep php.ini

  

如果php optimizer安装好了,却发现不能加载的话可以手工指定读取php.ini文件的位置。

然后

1
2
3
4
5
6
7


  
php -c /etc/ -v 

  

如果可以看到zend opt正确加载,那么做个连接就好了,连接到php默认读取的php.ini路径下面。
比如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21


  
ln -sf /etc/php.ini /usr/local/lib  
  
  
  
[root@localhost /]# php -v  
  
PHP 5.1.6 (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

  

正常了,phpinfo()看到的当然也是一样的。

  1. 调用库文件的问题(一般是apache调用问题)

有的时候还有一些情况下 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加载模块部分。

  1. 最恶心的SElinux问题(最常出现的权限问题)

SElinux导致PHP不能使用zend/lib下的库文件。所以,即便是做了link也不行。只能够拷贝库文件到有权限的目录,或者直接关掉SElinux。

但我已 在 /etc/selinux/config 的 SELINUX=disabled 关掉SElinux 还是不行, 再网络查询发现在你保证SElinux 被disable后,还执行下chcon -t texrel_shlib_t 命令:

如:

1
2
3
4
5
6
7


  
chcon -t texrel_shlib_t /usr/local/Zend/lib/Optimizer-3.3.0/php-5.2.x/ZendOptimizer.so

  

(这个文件视具体执行文件)就可以了。

我的解决的情况是:

  1. 关闭SElinux
  2. 运行
1
2
3
4
5
6
7


  
chcon -t texrel_shlib_t /usr/local/Zend/lib/Optimizer-3.3.0/php-5.2.x/ZendOptimizer.so

  

就可以了。

4.更悲剧的问题

Apache2+PHP5不能加载Zend Optimizer的问题

安装没有问题,但是不能加载。到Apache的日志目录,查看error日志。可以看到一些报错信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77


  
PHP Warning: Zend Optimizer does not support this version of PHP - please upgrade to the  
  
  
  
latest version of Zend Optimizer in Unknown on line 0  
  
[Sat Apr 28 17:56:47 2007] [notice] Apache configured -- resuming normal operations  
  
[Sat Apr 28 18:00:01 2007] [notice] SIGUSR1 received. Doing graceful restart  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
[Sat Apr 28 18:00:01 2007] [notice] Digest: generating secret for digest authentication ...  
  
[Sat Apr 28 18:00:01 2007] [notice] Digest: done  
  
[Sat Apr 28 18:00:01 2007] [notice] Apache configured -- resuming normal operations  
  
[Sat Apr 28 18:04:15 2007] [notice] SIGUSR1 received. Doing graceful restart  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:  
  
  
  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
[Sat Apr 28 18:04:16 2007] [notice] Digest: generating secret for digest authentication ...  
  
[Sat Apr 28 18:04:16 2007] [notice] Digest: done  
  
[Sat Apr 28 18:04:16 2007] [notice] Apache configured -- resuming normal operations

  

其中最突出的一条记录是:

1
2
3
4
5
6
7


  
PHP Warning: Zend Optimizer does not support this version of PHP - please upgrade to the latest version of Zend Optimizer in Unknown on line 0

  

还有一条突出的是:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11


  
/usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so: undefined symbol:compiler_globals  
  
  
  
Failed loading /usr/local/Zend/lib/Optimizer_TS-3.2.6/php-5.2.x/ZendOptimizer.so:

  

原因分析

老实说,这个问题以前也没有遇到过。安装配置过不少Apache2+PHP5+ZendOptimizer,但是没有遇到这个情况。于是以compiler_globals作为关键字,在google上搜索,找答案。后来找到一个来自Zend.com上的链接,进去后,得到了解答。

原文连接:

http://www.zend.com/forums/index.php?t=msg&goto=9604&S=
其中有一位朋友的留言,说明了问题:

i just notice that Zend Optimizer only support prefork mode.

Supported Web Servers:

Apache 1.3.x
Apache 2.0.x (Prefork mode only)
Apache 2.2.x (Prefork mode only)
IIS 5, 6

if you want to install Zend Optimizer ,hope this help you.
也就是说,导致加载ZendOptimizer失败的原因,是因为编译安装Apache2的时候,指定了worker模式 –with-mpm=worker ,Apache2运行在线程模式下。而ZendOptimizer只支持进程模式。也就是Apache2的prefork模式 –with-mpm=prefork 。

于是查看当前的Apache2是否支持了worker模式:

httpd -l

Compiled in modules:
core.c
worker.c
http_core.c
mod_so.c
果然,是支持worker模式。

解决办法

其实解决的办法很简单,只需要按照下面三个步骤进行,就可以了:

以 –with-mpm=prefork 参数重新编译安装Apache2
重新编译安装PHP
重新安装ZendOptimizer

在程序都重新编译安装完后,重启Apache,就可以了。

一些思考

所谓"鱼肉与熊掌,两者不可兼得",目前Apache2+PHP,ZendOptimizer就只支持prefork模式。两者之间只能由使用者自己根据自己的实际需求来抉择了。

希望zend尽快开发出支持Apache worker模式的ZendOptimizer吧。

原文:http://blog.csdn.net/mal327/article/details/6452865