PHP 擴展開發之Zephir
最近對代碼進行性能分析後,發現兩個耗時的地方:自動加載文件數太多;參數驗證函數調用超過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