1. 程式人生 > >PHP 擴展開發之Zephir

PHP 擴展開發之Zephir

onf ech per data stat 註意 help undefine int

最近對代碼進行性能分析後,發現兩個耗時的地方:自動加載文件數太多;參數驗證函數調用超過1000次。這也是許多php語言框架面臨的問題,所以發展出來諸如Yaf,Swoole,Phalcon這些C語言擴展框架,或者類似workerman,reactphp,phpdaemon這些一次加載的框架。總之減少加載文件,使用內置函數,減少損耗,以提升性能。
相比之下,PHP擴展的框架性能還是要比PHP語言框架還要好不少。以往PHP擴展的開發方式就是C/C++,SWIG,現在還多了一個選擇:zephir,從Phalcon發展出來的項目,采用類似PHP語法的中間語言,將代碼編譯為高性能的C擴展。zephir支持面向對象編程,變量類型除了類似PHP的動態類型,還支持靜態類型(有點像FackBook的hack了),而且可以調用php內置或其他C擴展的函數。zephir編譯流程如下

技術分享
整個過程是zephir和底層編譯器自動進行編譯優化的,當然也可以自己調整以獲得更好的性能。
在ubuntu下的安裝如官方教程即可,在centos下的安裝如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 su -c ‘yum update‘ sudo yum install -y wget sudo yum install -y vim sudo yum install -y libtool sudo yum
install -y gcc sudo yum install -y make sudo yum install -y re2c sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm sudo yum install -y php55w sudo yum install -y php55w-devel sudo yum install -y php55w-json sudo yum install -y git-core git clone https://github.com/json-c/json-c
.git cd json-c ./autogen.sh ./configure make make install git clone https://github.com/phalcon/zephir cd zephir ./install -c zephir help

安裝完成如下:
技術分享
按照教程創建示例:

1 2 3 zephir init utils cd utils sudo vim utils/greeting.zep

greeting.zep代碼如下:

1 2 3 4 5 6 7 8 9 10 11 namespace Utils; class Greeting { public static function say() { echo "hello world!"; } }

編譯安裝

1 $ zephir build

註意,我在php5.3下面這麽編譯都不行,在php5.5/php5.4的版本基本沒有碰到什麽問題。
然後更改php.ini:

1 sudo vim /etc/php.ini

在php.ini中加上以下內容

1 2 3 4 5 6 7 ;zephir編譯的擴展需要依賴json.so,需要提前加載 [json] ;如果php.ini中沒有則加上,有則去掉; extension=json.so [utils] extension=utils.so

查看php可用擴展

1 php -i

註意:如果提示’undefined symbol: php_json_decode_ex in Unknown on line 0’,則是php json擴展未加載,在php.ini打開就行了。加載了json.so後又提示’PHP Warning: Module ‘json’ already loaded’,則是已經在其他地方加載了該擴展,找出並註釋掉。我的是在php.d下面的json.ini裏面:

1 sudo vim /etc/php.d/json.ini
1 2 3 [json] ;已經在php.ini中加載了,為避免重復加載註釋掉 ;extension = json

加載成功後的效果:
技術分享
創建一個php腳本來試一下

1 2 cd ~/utils sudo vim greeting.php

greeting.php代碼如下:

1 2 3 <?php echo Utils\Greeting::say(), "\n";

保存並運行:
技術分享
技術分享
技術分享
至此你的zephir編譯的擴展已經成功了,趕緊翻譯你的PHP代碼去吧。
參考這篇教程,計算斐波拉契數列在我的環境下是這樣的:
技術分享
性能提升還是挺明顯的,而且在靜態類型(強類型)下面還能比動態類型再提升。

參考鏈接:
開源的 PHP 輕量級框架 iphp
自己寫PHP擴展之創建一個類
快速開發一個PHP擴展
CentOS 5 or CentOS 6 Upgrade PHP to PHP 5.4 or PHP 5.5
PHP 開發者應該將 Zephir 列為重要觀察的專案
Hack: a new programming language for HHVM
PHP-CPP
Getting Started with PHP Extension Development via Zephir
Quick Tip: Install Zephir and Phalcon 2 on Vagrant

PHP 擴展開發之Zephir