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
•二、缺點 –還不是很穩定 –模塊須要遷移