zoukankan      html  css  js  c++  java
  • eAccelerator配置和使用指南

    本文由Michael原创和整理,转载请保留出处!http://www.toplee.com/blog/?p=100
    Trackback URL: http://www.toplee.com/blog/wp-trackback.php?p=100
    对于本文中出现的错误导致您的损失,Michael不承担责任。

    前一段时间完成了服务器从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($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($title) ."'
    ");
    if (!empty($dataitem['title']))
    {
    $data =& $dataitem['data'];
    $this->build($dataitem['title'], $dataitem['data']);
    }
    }
    $this->register($title, $data);
    }




    /**
    * Updates the appropriate cache file
    *
    * @param string title of the datastore item
    *
    * @return void
    */
    function build($title, $data)
    {
    if (!function_exists('eaccelerator_put'))
    {
    trigger_error("eAccelerator not installed", E_USER_ERROR);
    }
    eaccelerator_lock($title);
    eaccelerator_put($title, $data);
    eaccelerator_unlock($title);
    }
    }
  • 相关阅读:
    将log4Net记录的日志导入数据库操作指南
    算法40 leetcode 155.最小栈
    c++求以3为底的对数 遇到243 怎么也通不过
    算法36 动规初探&&斐波那契&&尾递归
    算法38 5. 最长回文子串
    算法39 leetcode22. 括号生成
    算法34 堆排序heapsort
    算法37 动规求数组和
    算法35 力扣twosum
    c++ vector size()18446744073709551615 bug
  • 原文地址:https://www.cnblogs.com/shuaixf/p/2270836.html
Copyright © 2011-2022 走看看