开发者社区> 问答> 正文

PHP加速 eAccelerator 配置和使用指南:配置报错 

前一段时间完成了服务器从FreeBSD4.10到6.1的升级,同时把PHP也升级到了最新的PHP5.1.4,Apache也升级到了最新的 Apache2.2,为了更好的提高系统的性能,考虑对PHP再进行一些优化,前两年接触过MMCache和eAccelerator,尤其对 eAccelerator非常喜欢,这次优化也选择了它,下面整理一些文档和大家分享。   目录: 一、eAccelerator介绍 1、背景 2、原理 二、安装和配置 1、支持平台 2、系统要求 3、安装 4、php.ini文件配置 5、验证安装 三、使用eAccelerator开发PHP代码 1、API文档和接口说明 2、开发范例 四、附录和参考资料 一、eAccelerator介绍 1、背景 eAccelerator 是一个免费开源的PHP加速、优化、编译和动态缓存的项目,它可以通过缓存PHP代码编译后的结果来提高PHP脚本的性能,使得一向很复杂和离我们很远的 PHP脚本编译问题完全得到解决。通过使用eAccelerator,可以优化你的PHP代码执行速度,降低服务器负载,可以提高PHP应用执行速度最高 达10倍。 eAccelerator 项目诞生于2004年,当时它是作为 Turck MMCache 项 目的一个分支提出并投入开发的。 Turck MMCache 由 Dmitry Stogov 开发,是个非常优秀的PHP内存缓存加速系统,如今仍然有很大部分 eAccelerator 的代码应用到该项目中,目前该项目有很长时间没有更新了,对于最新的PHP5.x的支持还未推出。 2、原理 eAccelerator 通过把经过编译后的PHP代码缓存到共享内存中,并在用户访问的时候直接调用从而起到高效的加速作用。它的效率非常高,从创建共享内存到查找编译后的代码 都在非常短的时间内完成,对于不能缓存到共享内存中的文件和代码,eAccelerator还可以把他们缓存到系统磁盘上。 eAccelerator 同样还支持PHP代码的编译和解释执行,你可以通过encoder.php脚本来对php代码进行编译达到保护代码的目的,经过编译后的代码必须运行在安 装了eAccelerator的环境下。eAccelerator编译后的代码不能被反编译,它不象其他一些编译工具那样可以进行反编译,这将使得代码更 加安全和高效。 二、eAccelerator安装配置 1、支持平台 由于aAccelerator提供了大部分基于共享内存的API,所以在nix的平台上将得到更好的支持,虽然也发布了基于windows平台的 binary版本,但我在这里就只提供基于nix平台的配置和说明,目前可以支持的平台包括Linux, FreeBSD, OpenBSD, Mac OS X, Solaris, AIX en HP-UX。 2、系统要求 php4 or php5 autoconf automake libtool m4 eAccelerator 只支持使用 mod_php 或者 fastcgi mode 安装的PHP 3、安装 先去eAccelerator官方下载最新版的源码包:eaccelerator-0.9.5-beta.tar.bz2

#tar -zxvf ./eaccelerator-0.9.5-beta2.tar.bz2

#cd eaccelerator-0.9.5-beta2

#export PHP_PREFIX="/usr/local" (把PHP安装目录导入到环境变量,FreeBSD默认是/usr/local)

#$PHP_PREFIX/bin/phpize

#./configure --enable-eaccelerator=shared --with-php-config=$PHP_PREFIX/bin/php-config

#make

#make install

4、ini文件配置 安装完成,下面开始配置php.ini文件,eAccelerator提供了两种配置和调用方式,分别如下。 安装为 Zend extension 模式:
zend_extension="/usr/local/lib/php/20050922/eaccelerator.so" eaccelerator.shm_size="16" eaccelerator.cache_dir="/tmp/eaccelerator" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.log_file = "/var/log/httpd/eaccelerator_log" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" 如果你使用了thread safe模式安装的PHP,你必须使用 “zend_extension_ts” 替换第一行的 “zend_extension”. 安装为 PHP extension 模式:(这是大部分采用的方式)
extension="eaccelerator.so" eaccelerator.shm_size="16" eaccelerator.cache_dir="/tmp/eaccelerator" eaccelerator.enable="1" eaccelerator.optimizer="1" eaccelerator.check_mtime="1" eaccelerator.debug="0" eaccelerator.log_file = "/var/log/httpd/eaccelerator_log" eaccelerator.filter="" eaccelerator.shm_max="0" eaccelerator.shm_ttl="0" eaccelerator.shm_prune_period="0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level="9" 有关php.ini文件的详细配置说明,请参照源码目录的README文档或者访问官方文档: ini setting 完成安装配置后,我们最后要创建缓存目录
#mkdir /tmp/eaccelerator #chmod 777 /tmp/eaccelerator 5、验证安装结果 通过浏览器访问您的phpinfo()页面或者运行 php -i 得到php配置信息,里面如果看到类似下面的信息就表示安装成功了。
This program makes use of the Zend Scripting Language Engine: Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies     with eAccelerator v0.9.5-beta2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator 我的机器上同时还安装了Zend Optimizer3.0.1,所以看到的信息如下:
This program makes use of the Zend Scripting Language Engine: Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies     with eAccelerator v0.9.5-beta2, Copyright (c) 2004-2006 eAccelerator, by eAccelerator     with Zend Extension Manager v1.0.10, Copyright (c) 2003-2006, by Zend Technologies     with Zend Optimizer v3.0.1, Copyright (c) 1998-2006, by Zend Technologies 如果你打开了eAccelerator的debug选项,可以从日志中看到类似下面的信息
#tail /var/log/httpd/eAccelerator_log EACCELERATOR hit: "/var/www/toplee.com/blog/index.php" EACCELERATOR hit: "/var/www/toplee.com/blog/wp-blog-header.php" EACCELERATOR hit: "/var/www/toplee.com/blog/wp-config.php" EACCELERATOR hit: "/var/www/toplee.com/blog/wp-settings.php" EACCELERATOR hit: "/var/www/toplee.com/blog/wp-content/plugins/wp-cache/wp-cache-phase1.php" ... 以上信息表示文件都得到了缓存和命中。 至此,我们就完成了全部的安装和配置,好好享受eAccelerator带给你的惊喜吧,根据Michael的测试,效果的确相当的好。 三、在PHP中可以使用eAccelerator的API开发 1、API和文档说明: eAccelerator提供了便捷便捷而又稳定的本机缓存实现方式,由于大部分代码实现基于共享内存,所以只能在*nix平台中使用,Windows平台Michael就暂时不知道何时有这方面的支持了。 eAccelerator提供如下的API接口和文件:(下述文件均在源码包的doc/php/目录下) 文件列表:
cache.php dasm.php encoder.php info.php loader.php session.php shared_memory.php 接口列表:
array eaccelerator_cached_scripts () void eaccelerator_cache_output (string $key, string $eval_code, [int $ttl = 0]) void eaccelerator_cache_page (string $key, [int $ttl = 0]) void eaccelerator_cache_result (string $key, string $code, [int $ttl = 0]) void eaccelerator_caching (boolean $flag) void eaccelerator_clean () void eaccelerator_clear () array eaccelerator_dasm_file (mixed $filename) mixed eaccelerator_encode (mixed $src, [mixed $prefix = ''], [string $pre_content = ''], [string $post_content = ''])  void eaccelerator_gc () mixed eaccelerator_get (string $key)  array eaccelerator_info () array eaccelerator_list_keys () void eaccelerator_load () boolean eaccelerator_lock (string $key) void eaccelerator_optimizer (boolean $flag)  void eaccelerator_purge () boolean eaccelerator_put (string $key, mixed $value, [int $ttl = 0]) array eaccelerator_removed_scripts () boolean eaccelerator_rm (string $key) void eaccelerator_rm_page (string $key)  boolean eaccelerator_set_session_handlers () boolean eaccelerator_unlock (string $key) 有关上述文档详细说明请参考官方文档: API Documents 下面有部分网友翻译后的接口说明:
eaccelerator_put($key, $value, $ttl=0)   将 $value 以 $key 为键名存进缓存(php4下支持对像类型,看源码好像zend2里不支持了),$ttl 是这个缓存的生命周期,单位是秒,省略该参数或指定为 0 表示不限时,直到服务器重启清空为止。   eaccelerator_get($key)   根据 $key 从缓存中返回相应的 eaccelerator_put() 存进去的数据,如果这项缓存已经过期或不存在那么返回值是 NULL   eaccelerator_rm($key)   根据 $key 移除缓存   eaccelerator_gc()   移除清理所有已过期的 key   eaccelerator_lock($key)   为 $key 加上锁定操作,以保证多进程多线程操作时数据的同步。需要调用 eaccelerator_unlock($key) 来释放这个锁或等待程序请求结束时自动释放这个锁。   例如:   <?php      eaccelerator_lock ( " count " ) ;      eaccelerator_put ( " count " , eaccelerator_get ( " count " ) + 1 ) );   ?>   eaccelerator_unlock($key)   根据 $key 释放锁   eaccelerator_cache_output($key, $eval_code, $ttl=0)   将 $eval_code 代码的输出缓存 $ttl 秒,($ttl参数同 eacclerator_put)   例如:   <?php eaccelerator_cache_output ( ' test ' , ' echo time(); phpinfo(); ' , 30 ) ; ?>   eaccelerator_cache_result($key, $eval_code, $ttl=0)   将 $eval_code 代码的执行结果缓存 $ttl 秒,($ttl参数同 eacclerator_put),类似 cache_output   例如:   <?php eaccelerator_cache_result ( ' test ' , ' time() . "Hello"; ' , 30 ) ; ?>   eaccelerator_cache_page($key, $ttl=0)   将当前整页缓存 $ttl 秒。   例如:   <?php      eaccelerator_cache_page ( $_SERVER [ ' PHP_SELF ' ] . ' ?GET= ' . serialize ( $_GET ) , 30 ) ;      echo time () ;      phpinfo () ;   ?>   eaccelerator_rm_page($key)   删除由  eaccelerator_cache_page() 执行的缓存,参数也是 $key
2、PHP代码中使用eAccelerator加速 下面有一个测试的代码,你可以测试一下eAccelerator强大的威力:(该代码在 cli 模式下可能无效)
<?php class test_cache {   var $pro = ' hello ' ;     function test_cache () {      echo " Object Created!<br> \n " ;   }   function func () {      echo ' , the world! ' ;   }   function now ( $t ) {      echo date ( ' Y-m-d H:i:s ' , $t ) ;   } }   $tt = eaccelerator_get ( " test_tt " ) ; if ( ! $tt ) {   $tt = new test_cache ;   eaccelerator_put ( " test_tt " , $tt ) ;   echo " no cached!<br> \n " ; } else {   echo " cached<br> \n " ; }   echo $tt -> pro ; $tt -> func () ; $tt -> now ( time () + 86400 ) ; ?> 另外,据说在著名的vBulletin 3.60Beta版里面已经集成了对eAccelerator的支持,下面是一段来自vBulletin里面的代码 // ############################################################################# // eAccelerator   /** * Class for fetching and initializing the vBulletin datastore from eAccelerator * * @package    vBulletin * @version     $Revision: 0.1 $ * @date         $Date: 2005/06/12 13:14:18 $ */ class vB_Datastore_eAccelerator extends vB_Datastore {      /**     * Fetches the contents of the datastore from eAccelerator     *     * @param    array    Array of items to fetch from the datastore     *     * @return    void     */      function fetch ( $itemarray )      {          if ( ! function_exists ( ' eaccelerator_get ' ))          {              trigger_error ( " eAccelerator not installed " , E_USER_ERROR ) ;          }            foreach ( $this -> defaultitems AS $item )          {              $this -> do_fetch (

展开
收起
kun坤 2020-06-02 15:46:18 740 0
1 条回答
写回答
取消 提交回答
  • PHP extension 模式和Zend extension 模式有什么区别吗?还有win7下怎么安装,谢谢######不建议使用EA了,建议使用APC代替之。######这个要注意  会把文档注释忽略,导致反射不到注释

    ######

    引用来自“oreak”的评论

    这个要注意  会把文档注释忽略,导致反射不到注释
    可以加上编译参数 --with-eaccelerator-doc-comment-inclusion
    2020-06-02 15:46:29
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载