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 
    ( 
    $item 
    ) 
    ; 
         
    } 
     
 
         
    if 
      
    ( 
    is_array 
    ( 
    $itemarray 
    )) 
     
         
    { 
     
             
    foreach 
      
    ( 
    $itemarray 
      
    AS 
      
    $item 
    ) 
     
             
    { 
     
                 
    $this 
    -> 
    do_fetch 
    ( 
    $item 
    ) 
    ; 
             
    } 
     
         
    } 
     
 
         
    $this 
    -> 
    check_options 
    () 
    ; 
 
         
    // set the version number variable  
    
         
    $this 
    -> 
    registry 
    -> 
    versionnumber 
     =&  
    $this 
    -> 
    registry 
    -> 
    options 
    [ 
    ' 
    templateversion 
    ' 
    ] 
    ; 
     
    } 
     
 
     
    /** 
    * Fetches the data from shared memory and detects errors 
    * 
    * 
     @param  
       string    title of the datastore item 
    * 
    * 
     @return  
       void 
    */ 
     
     
    function 
      
    do_fetch 
    ( 
    $title 
    ) 
     
     
    { 
     
         
    $data 
     =  
    eaccelerator_get 
    ( 
    $title 
    ) 
    ; 
         
    if 
      
    ( 
    $data 
     ===  
    null 
    ) 
     
         
    { 
      
    // appears its not there, lets grab the data, lock the shared memory and put it in  
    
             
    $data 
     =  
    '' 
    ; 
             
    $dataitem 
     =  
    $this 
    -> 
    dbobject 
    -> 
    query_first 
    ( 
    " 
     
                SELECT title, data FROM  
    " 
     .  
    TABLE_PREFIX 
     .  
    " 
    datastore 
                WHERE title = ' 
    " 
     .  
    $this 
    -> 
    dbobject 
    -> 
    escape_string 
    (