怎样安装Zend Guard Loader

2013年3月24日 | 分类: 【技术】

由于zend optimizer不支持php5.3,使用php5.3以上版本就要安装zend guard loader。

参考:http://amon.org/zend-optimizer

PHP 5.5:Zend Guard Loader for PHP 5.5
PHP 5.6:Zend Guard Loader for PHP 5.6
PHP 5.2 files encoded with Zend Guard 5.0 or Zend Guard 5.5 require Zend Optimizer as the runtime decoder.

【Atomic库安装】

参考:http://www.laozuo.org/1940.html

Atomic源支持Fedora,RHEL和CentOS的YUM包管理。

清单:http://www.atomicorp.com/channels/atomic/

需要先安装Atomic库,然后安装zend-guard-loader:

wget -q -O - http://www.atomicorp.com/installers/atomic | sh
yum install php-zend-guard-loader

安装完后在 /etc/yum.repos.d/ 目录会有一个 atomic.repo 文件。

【源码安装】

下载:http://www.zend.com/en/products/loader/downloads

参考:http://files.zend.com/help/Zend-Guard/content/installing_zend_guard_loader.htm
参考:http://www.cnblogs.com/qiandu/p/4201456
参考:https://serverpilot.io/community/articles/how-to-install-zend-guard-loader
参考:http://blog.chinaunix.net/uid-14735472-id-3764932
参考:http://jingyan.baidu.com/article/ceb9fb10dae0d98cad2ba005
参考:http://dedecms.com/knowledge/servers/linux-bsd/2012/0819/8491

wget http://downloads.zend.com/guard/7.0.0/zend-loader-php5.5-linux-x86_64_update1.tar.gz && tar zxvf zend-loader-php5.5-linux-x86_64_update1.tar.gz
cp -R zend-loader-php5.5-linux-x86_64/ /usr/local/zend/

编辑 php.ini ,在最后位置添加:

[Zend Guard]
zend_extension=/usr/local/zend/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
zend_loader.license_path=

查证:

php -i | grep "Zend Guard Loader"

报错:

Failed loading /usr/local/php/lib/php/extensions/zend-loader-php5.5-linux-x86_64/ZendGuardLoader.so:  /usr/local/php/lib/php/extensions/zend-loader-php5.5-linux-x86_64/ZendGuardLoader.so: undefined symbol: executor_globals

参考:http://www.verydemo.com/demo_c101_i53243
参考:http://forums.zend.com/viewtopic.php?t=22958

参考:http://smilejay.com/2013/05/apache-mpm/
参考:http://www.aichengxu.com/view/934944

apache有两种运行模式:prefork模式;worker模式。区别请看:http://bbs.ywlm.net/thread-919-1-1
–with-mpm=worker 即worker模式,很多第三方模块不支持的
–with-mpm=prefork 重新编译apache就OK了。
如果用yum安装的,默认用的是prefork模式,这是为了兼容性。

参考:http://files.zend.com/help/Zend-Guard/content/installing_zend_guard_loader.htm
参考:http://www.phpfans.net/ask/question2/2455115949

参考:http://forums.zend.com/viewtopic.php?t=126063

Zend Guard Loader requires PHP NTS (non-thread-safe) and when loaded under Apache, use Prefork MPM.

参考:http://stackoverflow.com/questions/22201013/error-failed-loading-opcache-so-opcache-so-undefined-symbol-compiler-globals
参考:http://stackoverflow.com/questions/13883646/apache-prefork-vs-worker-mpm

You’re using Apache2 MPM. So PHP builds an ZTS (Zend Threaded System) build. See Apache Prefork vs Worker MPM for a discussion on this. With MPM PHP stores its compiler globals in a thread array. However, OPcache is looking for the non-threaded version of this structure compiler_globals.

IMO, if you are using a PHP, then using MPM is a mistake as (i) the PHP runs ~25-50% slower, (ii) many extension don’t work; (iii) OPcache isn’t properly tested with ZTS builds. Stick to a Prefork worker configuration, and rebuild.

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

./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --with-mpm=prefork --with-crypto --enable-rewrite --enable-headers --enable-deflate --enable-socache-shmcb --enable-negotiation --enable-ssl --with-ssl=/usr/lib --enable-http2 --with-nghttp2=/usr/local/lib

查看当前apache中已经编译了的模块:

service httpd  -l

输出:

Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  prefork.c

由于MPM只能在编译时指定其中一种,所以列出的静态模块中MPM只有1个:

查看httpd加载的所有模块(包括静态编译的和动态共享的模块):

service httpd -t -D DUMP_MODULES

输出:

Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 mpm_prefork_module (static)
 authn_file_module (shared)
 authn_core_module (shared)
 authz_host_module (shared)
 authz_groupfile_module (shared)
 authz_user_module (shared)
 authz_core_module (shared)
 access_compat_module (shared)
 auth_basic_module (shared)
 reqtimeout_module (shared)
 filter_module (shared)
 mime_module (shared)
 log_config_module (shared)
 env_module (shared)
 headers_module (shared)
 setenvif_module (shared)
 version_module (shared)
 unixd_module (shared)
 status_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 dir_module (shared)
 alias_module (shared)
 cgid_module (shared)
 php5_module (shared)

查看 httpd.conf,有关于 mpm 模式的设置:

# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf

conf/extra/httpd-mpm.conf 的对应设置:

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of connections a server process serves
#                         before terminating
<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

参考:https://smyl.es/how-to-fix-ioncubezendguard-undefined-symbol-executor_globals-after-upgrading-apache-and-php/
参考:http://stackoverflow.com/questions/17272439/how-to-enable-zts-on-php
参考:https://github.com/krakjoe/pthreads/issues/436

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

输出:

with Zend Guard Loader v3.3, Copyright (c) 1998-2014, by Zend Technologies
Zend Guard Loader
Zend Guard Loader => enabled

部署zend guard

实证未遂。

参考:http://files.zend.com/help/Zend-Guard/content/install.htm
参考:http://static.zend.com/topics/Zend-Guard-Release-Notes-v5-5.txt

下载:http://www.zend.com/en/products/guard/downloads

http://downloads.zend.com/guard/7.0.0/ZendGuard-7.0.0-linux.gtk.x86_64.tar.gz
http://downloads.zend.com/guard/6.0.0/ZendGuard-6_0_0-linux.tar.gz
http://downloads.zend.com/guard/5.5.0/ZendGuard-5_5_0.tar.gz

wget http://downloads.zend.com/guard/5.5.0/ZendGuard-5_5_0.tar.gz && tar zxvf ZendGuard-5_5_0.tar.gz && ./ZendGuard-5_5_0.bin