各開源框架使用與設計總結(二)

5、PHP性能改進在生產中的實踐
5.一、XHProf
首先來看一下XHProf這個工具,怎麼能改進咱們的PHP語言自己。php

首先安裝這個工具,就是模塊化安裝。
咱們封裝一下操做類。html

<?php
/** 
 * 優才網公開課示例代碼 
 * 
 * XHProf 封裝類
 * 
 * @author 伍星 
 * @see http://www.ucai.cn 
 */  

class XHProf
{

    public function __construct()
    {
        // start profiling
        $XHPROF_ROOT = "/home/wwwroot/ucai_app/samples";
        include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
        include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
    }

    public function beginProf()
    {
        xhprof_enable();

        register_shutdown_function('XHProf::endProf');
    }

    public function endProf()
    {
        $xhprof_data = xhprof_disable();

        $xhprof_runs = new XHProfRuns_Default();
        $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

        echo "<a href=\"http://samples.app.ucai.cn/xhprof_html/index.php?run=$run_id&source=xhprof_foo\">性能分析結果</a>";
    }

}

值得注意的是這句話:nginx

register_shutdown_function('XHProf::endProf');

什麼意思呢,就是在整個頁面完成了以後,輸出結果報表連接。git

5.2 、Opcache的安裝與配置
其次咱們來看看 opcache,安裝過程沒有什麼講的,主要是推薦一個配置,而且須要強調,opcache不是PHP extension,是zend extension, 因此很是容易出錯。配置以下:github

[opcache]
zend_extension="/usr/local/php/lib/php/extensions/no-debug-zts-20090626/opcache.so"
opcache.enable_cli=1
opcache.memory_consumption=128      //共享內存大小, 這個根據大家的需求可調
opcache.interned_strings_buffer=8   //interned string的內存大小, 也可調
opcache.max_accelerated_files=4000  //最大緩存的文件數目
opcache.revalidate_freq=60          //60s檢查一次文件更新
opcache.fast_shutdown=1             //打開快速關閉, 打開這個在PHP Request Shutdown的時候
                                    //   會收內存的速度會提升
opcache.save_comments=0             //不保存文件/函數的註釋

5.三、Yaf和Phalcon
再次來看兩個C語言寫的PHP框架sql

第一個介紹的是Yaf 框架,這是一個純C語言框架。具體的安裝過程和實驗以下:
一、從github 下載 php-yaf https://github.com/laruence/php-yafsegmentfault

二、解壓,按PHP模塊的編譯手法編譯後端

phpize
./configure --with-php- /usr/local/php/bin/php-config 
make
make install

三、在php.ini 中配置緩存

extension = "yaf.so"
yaf.environ="product"

四、經過命令行上執行 php –m|grep yaf 你就能看到模塊已經安裝好了。app

五、餘下的就是Web測試。
在源碼目錄下,找到

php-yaf-master/tools/cg
./yaf_cg ucai_gkk

六、將output 目錄下的 ucai_gkk 移至 samples.app.ucai.cn 所在的目錄下,就能夠經過 http://samples.app.ucai.cn/ucai_gkk
來訪問。

七、咱們能夠作一下改造實驗,瞭解一下這個框架的基本結構。
請輸入圖片描述
你們能夠看到,我只是一經過一個工具,就生成了整個程序的框架,就能夠根據須要,添加本身的業務邏輯。
好比 ,在models/Sample.php 中增長一個方法,

public function selectProductSample()
    {
        return "<h1>Hello Haha</h1>";
    }

在 views 目錄下新建文件,product/index.phtml

<?php
/** 
 * 優才網公開課示例代碼 
 * 
 * Yaf 視圖
 * 
 * @author 伍星 
 * @see http://www.ucai.cn 
 */  
echo $content, " I am ", $name, " From Product";
?>

在controllers 目錄下創建 Product.php

<?php
/** 
 * 優才網公開課示例代碼 
 * 
 * Yaf 控制器
 * 
 * @author 伍星 
 * @see http://www.ucai.cn 
 */  

/**
 * @name IndexController
 * @author root
 * @desc 默認控制器
 * @see http://www.php.net/manual/en/class.yaf-controller-abstract.php
 */
class ProductController extends Yaf_Controller_Abstract
{

    /**
     * 默認動做
     * Yaf支持直接把Yaf_Request_Abstract::getParam()獲得的同名參數做爲Action的形參
     * 對於以下的例子, 當訪問http://yourhost/hello/index/index/index/name/root 的時候, 你就會發現不一樣
     */
    public function indexAction($name = "Product")
    {
        //1. fetch query
        $get = $this->getRequest()->getQuery("get", "default value");

        //2. fetch model
        $model = new SampleModel();

        //3. assign
        $this->getView()->assign("content", $model->selectProductSample());
        $this->getView()->assign("name", $name);

        //4. render by Yaf, 若是這裏返回FALSE, Yaf將不會調用自動視圖引擎Render模板
        return TRUE;
    }

}

這樣咱們就能夠經過,http://samples.app.ucai.cn/hello/?a=index&c=product,這樣的連接來訪問,咱們新建的內容了。操做起來很簡單。

用一樣的方式,咱們安裝Phalcon。雖然從形式上,它更簡單。經過目錄就知道,內容更爲豐富。

這也是Yaf跟Phalcon的很大的不一樣之處,Yaf儘管效率很高,可是要在生產上使用,仍是略顯單薄,功能不夠豐富。而Phalcon則真的是功能很全的。正像優才網培養的叫全棧工程師,而Phalcon也號稱本身是Full Stack 的一個框架。

此次,沒有工具來生成一個基本的框架,可是咱們能夠從Github上的一個教程,做爲切入點。
https://github.com/phalcon/tutorial
下載了這個教程以後,咱們就能夠開始動手了。先看看功能 。
放到相應的目錄下以後,好比 http://samples.app.ucai.cn 目錄下以後,得配置一下rewrite 規則。

rewrite ^/phalcon/(.*?)$ /phalcon/public/index.php?_url=/$1 last;
    rewrite ^/phalcon$ /phalcon/public/index.php last;

而後,經過 http://samples.app.ucai.cn/phalcon/ 能夠訪問。

發現有一個註冊功能,那咱們就來想這個數據怎麼保存的。
發如今 public/index.php 中有一段配置,

//Set the database service
 $di->set('db', function() {
        return new \Phalcon\Db\Adapter\Pdo\Mysql(array(
            "host" => "127.0.0.1",
            "username" => "xxxx",
            "password" => "xxxxx",
            "dbname" => "xxxxxx"
        ));
    });

咱們在這裏改了配置了以後,再看看提交的狀況。
發如今SignupControll.php 中有一段保存代碼 ,

$user = new Users();
        $user->name = $name;
        $user->email = $email;


        //Store and check for errors
        if (($userid = $user->save()) == true)
        {
            echo 'Thanks for register!';
        } else
        {
            echo 'Sorry, the next problems were generated: ';
            foreach ($user->getMessages() as $message)
            {
                echo $message->getMessage(), '<br/>';
            }
        }

過去看這個 models/Users.php 倒是空的?
咱們在不修改Users.php的時候,看看是否能將數據保存進去?

固然前提是建一個表,由於我懷疑,這存在某種關係 的映射。

CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(70) NOT NULL,
  `email` varchar(70) NOT NULL,
  PRIMARY KEY (`id`)
);

發現果不其然,保存進去了,好,咱們再進一步,找一現實中可能會用的表格格式,好比下劃線的表格 users_exinfo。

CREATE TABLE `users_exinfo` (
  `id` int(10) unsigned NOT NULL default 0,
  `schoolname` varchar(70) NOT NULL,
  `age` int NOT NULL,
  PRIMARY KEY (`id`)
);

看看可否實現保存,因而乎也建了一個空類。

class UsersExinfo extends Phalcon\Mvc\Model{

}

同時也修改了視圖,將數據保存了進去。
請輸入圖片描述

結果以下:
請輸入圖片描述

你們看到,成功地保存了數據。

5.四、zephir高效開發模塊
好的,講到這裏,衍生出一個小話題,就是開發模塊。
在PHP裏,開發模塊,是一個很痛苦的過程。由於C語言,你們都知道,是出了名的難學的,值得高興的是,也是Phalcon這個團隊的童鞋們,也爲咱們準備了一個高效的開發模塊的語言,稱之爲zephir。正由於擴展如此難以開發,可是擴展又是如此高效,因此咱們要用高效的方式來開發擴展。

git clone https://github.com/phalcon/zephir.git
cd zephir/
mv zephir /usr/local/

而後就能夠開發模塊了,咱們使用
zephir init gkk
生成模塊的框架,
而後 cd gkk/gkk
編寫 hello.zep
namespace Gkk;

/**
 * This is a sample class
 */
class Welcome
{
    /**
     * This is a sample method
     */
    public function welcome()
    {
        echo "大家好!參加優才網公開課的同窗們!";
    }

    public function say()
    {
        echo "今天是優才網第三十三講公開課了!";
    }


}

而後再返回

zephir compile
zephir build

而後在 php.ini 中配置

extension=gkk.so

經過 php –m 能夠看到相應的模塊。再編寫
test.php

<?php

$t = new Gkk\Welcome();
$t->say();
echo "\n";
?>

就能看到相應的輸出。

5.五、各框架性能總結
好的,有關兩個用C開發的框架和相關內容咱們就介紹到這裏。下面咱們來總結一下框架,以及作一些性能評測。
首先來看一下性能評測報告,這是一個專門測框架的github項目出的數據,
請輸入圖片描述

博客在這裏,
https://github.com/eryx/php-framework-benchmark

從上面的圖能夠看到,兩個用C編寫的框架,性能仍是至關可觀的。Yaf比Phalcon性能更強,也不奇怪。由於結構更爲簡單,模塊更少。同時也發現,像zend framework這樣的框架,是不能輕易在一個大衆的互聯網產品中使用的,儘管代碼寫得不錯,可是效率過低了,有木有!

5.六、PHP的重寫
在評測以前,你們記起來了沒有,咱們上面講了六點,其中有一點是什麼?重寫PHP!
那就看看,哪些業界人士,在PHP重寫的路子上作了很是激動人心的嘗試。
剛纔講了,誰最有動力?有兩個方面的人有動力,一個是PHP最大的使用者,一個是PHP官方。最大的使用者,他對PHP的提高,能大幅度地減小資源的佔用,一個百分之幾的優化可能就是成百上千臺設備的節省。然後者,則要想到若是PHP自己效率提高不上去,在將來的發展過程當中,很容易出現轉折,儘管如今仍是很是火的。

全部從官方,就有了,PHPng,這個我沒有安裝過,有興趣的同窗,能夠本身去折騰,https://wiki.php.net/phpng 值得一提的是,我們國內的鳥哥是這個項目的主要參與者之一。Yaf也是他的做品。而另一個,則是Facebook主導的,HHVM,其前身是HipHop, 當時的思路是把PHP所有編譯成C++程序,在上線的過程當中,上線的是一個二進制包,很是不靈活,修改代碼,須要發包才能生效。若是出現故障,會有災難性的影響。因此演進到如今成了HHVM,全稱是HipHop Virtual Machine。
如今的模式,簡單了講就是能夠作爲FastCGI 的運行容器。你們安裝過LNMP的同窗就知道,在Nginx的後端,也就是說Nginx的配置中,經過fastcgi_pass  這個配置指向了實際運行PHP的FastCGI 運行容器,PHP自帶的是PHP-FPM(FastCGI Process Manager),而HHVM就是能夠必定程度上無縫地替換掉,FPM,好比你kill掉FPM進程,經過

hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000 &來啓動HHVM。都不須要修改nginx 配置。就能夠訪問了。可是性能必定程度上,大有提高。
這枚神器有以下特色:
•固然不是小團隊能玩的
•與PHP 5.2引擎+APC相比,能夠處理的Web請求吞吐量增長了9倍,而內存消耗減小了5倍。
•如無特殊模塊,能夠無縫替換 php-fpm(除了極少數兼容問題)

•一、優勢
–FB出品
–強大到令你吃驚,數十倍的性能提高
–已經趨於穩定,無縫替換 PHP-FPM

•二、缺點 –還不是很穩定 –模塊須要遷移

相關文章
相關標籤/搜索