PHP 擴充套件開發之Zephir
最近對程式碼進行效能分析後,發現兩個耗時的地方:自動載入檔案數太多;引數驗證函式呼叫超過1000次。這也是許多php語言框架面臨的問題,所以發展出來諸如Yaf,Swoole,Phalcon這些C語言擴充套件框架,或者類似workerman,reactphp,phpdaemon這些一次載入的框架。總之減少載入檔案,使用內建函式,減少損耗,以提升效能。
相比之下,PHP擴充套件的框架效能還是要比PHP語言框架還要好不少。以往PHP擴充套件的開發方式就是C/C++,SWIG,現在還多了一個選擇:zephir,從Phalcon發展出來的專案,採用類似PHP語法的中間語言,將程式碼編譯為高效能的C擴充套件。zephir支援面向物件程式設計,變數型別除了類似PHP的動態型別,還支援靜態型別(有點像FackBook的
整個過程是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
|
1 2 |
cd ~ /utils
sudo vim greeting.php
|
greeting.php程式碼如下:
1 2 3 |
<?php
echo Utils\Greeting::say(), "\n" ;
|
儲存並執行:
至此你的zephir編譯的擴充套件已經成功了,趕緊翻譯你的PHP程式碼去吧。
參考這篇教程,計算斐波拉契數列在我的環境下是這樣的:
效能提升還是挺明顯的,而且在靜態型別(強型別)下面還能比動態型別再提升。
相關推薦
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 擴充套件開發講解網址 菜鳥學php擴充套件 之 hello world(一) 菜鳥學php擴充套件 之 自動生成的擴充套件框架詳解(二) 菜鳥學php擴充套件 之 詳解擴充套件函式的傳參(如何獲取引數)(三) 菜鳥學php擴充套件 之 詳解php擴充套件的變數(四) 菜鳥學php擴充套件 之
菜鳥學php擴充套件 之 hello world(一) https://blog.csdn.net/u011957758/article/details/72234075 菜鳥學php擴充套件 之 自動生成的擴充套件框架詳解(二) https://blog.csdn.net/u
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 =