最近對代碼進行性能分析後,發現兩個耗時的地方:自動加載文件數太多;參數驗證函數調用超過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下的安裝以下:php
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代碼以下:react
1
2
3
4
5
6
7
8
9
10
11
|
namespace
Utils;
class
Greeting
{
public
static
function
say()
{
echo
"hello world!"
;
}
}
|
編譯安裝git
1
|
$ zephir build
|
注意,我在php5.3下面這麼編譯都不行,在php5.5/php5.4的版本基本沒有碰到什麼問題。
而後更改php.ini:github
1
|
sudo
vim
/etc/php
.ini
|
在php.ini中加上如下內容web
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裏面:json
1
|
sudo
vim
/etc/php
.d
/json
.ini
|
1
2
3
|
[json]
;已經在php.ini中加載了,爲避免重複加載註釋掉
;extension = json
|
1
2
|
cd
~
/utils
sudo
vim greeting.php
|
greeting.php代碼以下:vim
1
2
3
|
<?php
echo
Utils\Greeting::say(),
"\n"
;
|
保存並運行:
至此你的zephir編譯的擴展已經成功了,趕忙翻譯你的PHP代碼去吧。
參考這篇教程,計算斐波拉契數列在個人環境下是這樣的:
性能提高仍是挺明顯的,並且在靜態類型(強類型)下面還能比動態類型再提高。