1. 程式人生 > >PHP 擴充套件開發之Zephir

PHP 擴充套件開發之Zephir

最近對程式碼進行效能分析後,發現兩個耗時的地方:自動載入檔案數太多;引數驗證函式呼叫超過1000次。這也是許多php語言框架面臨的問題,所以發展出來諸如YafSwoolePhalcon這些C語言擴充套件框架,或者類似workermanreactphpphpdaemon這些一次載入的框架。總之減少載入檔案,使用內建函式,減少損耗,以提升效能。
相比之下,PHP擴充套件的框架效能還是要比PHP語言框架還要好不少。以往PHP擴充套件的開發方式就是C/C++SWIG,現在還多了一個選擇:zephir,從Phalcon發展出來的專案,採用類似PHP語法的中間語言,將程式碼編譯為高效能的C擴充套件。zephir支援面向物件程式設計,變數型別除了類似PHP的動態型別,還支援靜態型別(有點像FackBook的

hack了),而且可以呼叫php內建或其他C擴充套件的函式。zephir編譯流程如下
scheme
整個過程是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

安裝完成如下:
zephir10
按照教程建立示例:

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

載入成功後的效果:
zephir3
建立一個php指令碼來試一下

1 2 cd ~/utils sudo vim greeting.php

greeting.php程式碼如下:

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

儲存並執行:
zephir11
zephir5
zephir6
至此你的zephir編譯的擴充套件已經成功了,趕緊翻譯你的PHP程式碼去吧。
參考這篇教程,計算斐波拉契數列在我的環境下是這樣的:
zephir13
效能提升還是挺明顯的,而且在靜態型別(強型別)下面還能比動態型別再提升。

相關推薦

PHP 擴充套件開發Zephir

最近對程式碼進行效能分析後,發現兩個耗時的地方:自動載入檔案數太多;引數驗證函式呼叫超過1000次。這也是許多php語言框架面臨的問題,所以發展出來諸如Yaf,Swoole,Phalcon這些C語言擴充套件框架,或者類似workerman,reactphp,phpdaemon這些一次載入的框架。總之減少載入檔

PHP擴充套件開發動態載入so模組與靜態重編譯PHP(上)

動態載入so模組:利用ext_skel工具編譯生成so模組,修改php.ini檔案,動態載入即可 靜態編譯:將編寫的模組靜態編譯到PHP,需要重新編譯PHP 假設要編寫一個my_dynamic擴充套件,呼叫my_dynamic函式後輸出字串“The Best

一次失敗的PHP擴充套件開發

2. 進入php原始碼包的ext目錄,藉助ext_skel工具生成外掛架子程式碼 cd ext ./ext_skel --extname=demo 3. 編輯config.m4,開啟PHP_ARG_WITH或者PHP_ARG_ENABLE選項(說實話區別仍沒搞清楚,求達人指點),新增C++支援、依賴路徑

PHP 擴展開發Zephir

onf ech per data stat 註意 help undefine int 最近對代碼進行性能分析後,發現兩個耗時的地方:自動加載文件數太多;參數驗證函數調用超過1000次。這也是許多php語言框架面臨的問題,所以發展出來諸如Yaf,Swoole,Phalcon這

PHP 擴充套件支援 redis

       在很多企業中,不管是 LNMP 架構,還是 LAMP 架構,都會通過redis做資料快取,而主要因素就是,redis 對資料的存取都是在記憶體中進行,因此,對資料的處理速度相對硬碟來說,快樂佈置一個數量級,今天,我們就來講一下關閉 php r

PHP 擴充套件支援 imap

    首先,進入php原始碼包ext目錄,再進入imap目錄。     [[email protected] ~]# cd imap/     [[email 

php擴充套件開發-變數設定和銷燬

//定義變數 zval *op; //分配記憶體 MAKE_STD_ZVAL(op); //賦值 ZVAL_LOGN(op, 0); //獲取 op 的值 if (Z_LVAL_P(op)) { php_printf("%s", "true"); } else { p

php擴充套件開發-錯誤處理

//輸出php錯誤 //NULL TSRMLS_CC 預設寫法 //E_NOTICE 錯誤級別 //錯誤內容 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "test"); //Notice: confirm_xing2233_compiled()

php擴充套件開發-陣列操作

//add_assoc_*系列函式,生成字元索引: add_assoc_null(zval *aval, char *key); add_assoc_bool(zval *aval, char *key, zend_bool bval); add_assoc_long(zval *ava

php擴充套件開發--快速入手

我們首先找到快速上手文章裡面關於函式定義的程式碼,以此說明然後開發PHP的函式 //php_myext.h PHP_FUNCTION(myext_hello);//函式申明,所有在myext.c檔案定義的函式,都會在這個檔案裡有一個申明 //myext.c static

php擴充套件開發筆記(9)sizeof 和 strlen 遇到空字元 '\0' 的問題

看看下面程式碼的不同表現 #include <stdio.h> #include <stdlib.h> #include <string.h> int m

Windows下php擴充套件開發c++動態庫

PHP擴充套件開發,從零瞭解到初步完成一個小專案,經過三天的仔細研究,現整理如下 一、需求介紹 PHP擴充套件開發,呼叫自己之前的c++動態庫,完成功能 二、專案之前 系統:windows xp  開發工具:vs 2008 web環境:apache2.4  PHP5.3.2

PHP7擴充套件開發建立變數

前言 在這篇博文中我們將演示如何在PHP擴充套件中建立一個變數。示例程式碼如下: <?php class demo {} $lng = 2; $str = "abc"; $arr = array(1,'a' => 'b'); $obj =

PHP擴充套件開發-08-陣列的使用以及HashTable簡介

1      陣列 本節我們講一下php的陣列,在php中,陣列使用HashTable實現的。本節中我們先詳細的介紹一下HashTable,然後再講講如何使用HastTable 1.1     變長結構體 所謂的變長結構體,其實是我們C語言結構體的一種特殊用法,並沒

php程式開發實現網頁跳轉的三種方式

PHP目前是用來開發WEB專案的首選語言。Web專案中,從一個網頁跳轉到另一個網頁是最常用的技術之一。使用者單擊連結、按鈕或者系統邏輯等等都需要實現頁面跳轉。 本文介紹PHP開發中常用的實現頁面自動跳轉的方法。 方式一:header()實現301重定向 <?ph

PHP7擴充套件開發常量定義

前言 這次,我們將演示如何在PHP擴充套件中定義一個常量。要實現的PHP程式碼如下: <?php define("__ARR__", array('2', 'site'=>"www.bo56.com")); define(

php擴充套件開發(一 基本介紹和擴充套件開發的基本步驟)

需要開發擴充套件的場景: 1)應用非常注重效率,如複雜的影象演算法,需要編寫成擴充套件模組 2)有些系統呼叫不能用PHP直接訪問,比如Linux下的fork函式建立一個程序,需要編寫擴充套件 3)需要商業化一個應用,又不想暴露原始碼 一,搭建PHP框架 1  

chrome擴充套件開發在content_script裡執行目標頁面的函式。

如果我們想在content_script裡執行目標頁面的函式很容易寫出下面的程式碼: //content_script.jstest() //直接呼叫目標頁面的函式 但chrome是禁止這種訪

PHP7擴充套件開發字串處理

前言 這次,我們來看看字串在PHP擴充套件裡面如何處理。 示例程式碼如下: <?php function str_concat($prefix, $string) { $len = strlen($prefix); $substr =