這篇文章跟大家分享的內容是PHP擴充開發之相關開發技術對比及介紹 ,有著一定的參考價值,有需要的朋友可以參考一下
PHP擴充是高階PHP程式設計師必須了解的技能之一,對於初入門的PHP擴展開發者,怎麼能開發一個成熟的擴展,進入PHP開發的高階領域呢?本系列開發教學將手把手帶您從入門進入進階階段。
本教學系列在linux下方開發(建議使用centos),php版本用的是5.6,並假設您有一定的linux操作經驗和c/c 基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。
開發php擴充有好幾種技術方法和框架,對於初學者來說,最好能夠選擇一個最容易下手,最快出效果的框架,這樣才能提升學習的興趣。以下逐一比較一下各個技術框架,讓大家能找到最適合自己的。
ext-skel是PHP官方原始碼裡提供的產生php擴充的工具,可以產生一個c語言框架的php擴充的骨架。
PHP 官方對擴充開發者非常不友好,原始碼中提供的Zend API極其難用,API複雜且凌亂,充斥著各種巨集的寫法。 Zend API坑非常多,普通開發者很容易踩到坑裡。出現各種莫名其妙的core dump問題。 Zend API幾乎沒有任何文檔,開發者如果要真正掌握這項技能需要付出大量的學習時間。
以上是swoole插件開發者的肺腑之言,可見用這個方法來開發插件,對我們初學者來說將是對自信心極嚴重的打擊。幸好有大神們為我們準備了其他開發php擴展的方法,不用學習zend api,不用精通c語言,也照樣能開發php擴展,而且生成的擴展運行速度不會比c語言開發的相差太多。
Zephir提供了一種類似php的高階語言語法的方式,來自動產生擴展的c語言程式碼,使編寫php擴充變得非常的簡單。不過這種開發方式帶來了一個問題,就是由於他用的不是c/c 語言開發,那就沒辦法直接利用現有的各種c/c 開發函式庫來實現強大的功能。所以感覺上有點雞肋。
php-x是知名的swoole擴展開發者根據多年的開發經驗,提煉出來的一套基於c 的擴展開發框架。從文件來看,這是一個比較容易上手的開發框架,資料類型很齊全,和php cpp的開發風格非常相似,但本人還沒有去體驗使用。
依照php-x官方的文檔,開發出來的擴充只支援PHP7以上,這是一個遺憾。
PHP CPP是我重點推薦的php擴充開發框架,簡明易懂,功能強大,開發效率高,程式碼易維護,執行速度快。
PHP CPP是一款免費的php開發擴充庫,主要針對C 語言,可以進行類別集合的擴展和構建,採用簡單的計算機語言,讓擴展變得更有趣更有用,方便開發者進行維護和編寫,易於理解、維護輕鬆且程式碼優美。用C 寫的演算法看起來與用PHP寫的演算法幾乎完全相同。如果你知道如何在PHP中編程,你可以很容易地學習如何在C 中做同樣的事情。
優點一:不需要Zend引擎知識。
Zend引擎的內部太複雜,Zend引擎的程式碼是一團糟,而且大多是無證的。但是PHP-CPP庫已經在非常容易使用的C 類別和物件中封裝了所有這些複雜的結構。你可以使用C 寫出驚人的快速演算法,而不必直接呼叫Zend引擎,甚至無需查看Zend引擎原始碼。使用PHP-CPP,您可以編寫本機程式碼,而無需處理PHP的內部。
優點二:支援所有重要的PHP功能
#使用PHP-CPP,您可以像使用普通PHP腳本一樣輕鬆地處理變量,數組,函數,對象,類,接口,異常和命名空間。除此之外,你可以使用C 的所有功能,包括線程,lambda和非同步程式設計。
優點三:支援PHP 5.X,PHP7的擴充開發
PHP-CPP有兩套擴充開發框架,分別支援PHP 5.X,PHP7,雖然框架程式碼有兩個,但是介面卻是一樣的。所以如果你要開發相容多個版本的php擴展,不會花你額外太多時間做相容。
下面列出各個框架的hello world擴展源碼,從源碼長度和複雜度,就能有個直觀感受。
ext-skel產生的c擴充原始碼明顯可讀性極差,也極難理解。
zephir的擴充原始碼最類似php語法,最容易入手,但難以加入成熟的c/c 函式庫程式碼。
PHP-X和PHP CPP的原始碼風格很相似,都是標準的c 語言,都很容易看懂。不難想像,這兩種方式開發擴充必然是最合適的,因為我們既能利用c 的封裝簡化開發,又能直接呼叫市面上各個成熟c 函式庫為我們服務。
ext-skel的hello world原始碼
#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "php_helloworld.h" static int le_helloworld; PHP_FUNCTION(confirm_helloworld_compiled) { char *arg = NULL; int arg_len, len; char *strg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = spprintf(&strg, 0, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "helloworld", arg); RETURN_STRINGL(strg, len, 0); } PHP_MINIT_FUNCTION(helloworld) { return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(helloworld) { return SUCCESS; } PHP_RINIT_FUNCTION(helloworld) { return SUCCESS; } PHP_RSHUTDOWN_FUNCTION(helloworld) { return SUCCESS; } PHP_MINFO_FUNCTION(helloworld) { php_info_print_table_start(); php_info_print_table_header(2, "helloworld support", "enabled"); php_info_print_table_end(); } const zend_function_entry helloworld_functions[] = { PHP_FE(confirm_helloworld_compiled, NULL) /* For testing, remove later. */ PHP_FE_END /* Must be the last line in helloworld_functions[] */ }; zend_module_entry helloworld_module_entry = { STANDARD_MODULE_HEADER, "helloworld", helloworld_functions, PHP_MINIT(helloworld), PHP_MSHUTDOWN(helloworld), PHP_RINIT(helloworld), /* Replace with NULL if there's nothing to do at request start */ PHP_RSHUTDOWN(helloworld), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(helloworld), PHP_HELLOWORLD_VERSION, STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_HELLOWORLD ZEND_GET_MODULE(helloworld) #endif
zephir的hello world原始碼
namespace Test; class Hello { public function say() { echo "Hello World!"; } }
#PHP-X的hello world原始碼
#include <phpx.h> using namespace std; using namespace php; //声明函数 PHPX_FUNCTION(say_hello); //导出模块 PHPX_EXTENSION() { Extension *ext = new Extension("hello-world", "0.0.1"); ext->registerFunction(PHPX_FN(say_hello)); return ext; } //实现函数 PHPX_FUNCTION(say_hello) { echo("hello world"); }
PHP CPP的hello world原始碼
#include 619f335ddca2117bde26fa8c0e35995e void say_hello(Php::Parameters ¶ms) { Php::out << "hello world" << std::endl; } extern "C" { PHPCPP_EXPORT void *get_module() { static Php::Extension extension("helloworld", "1.0"); extension.add("say_hello", say_hello); return extension; } }
如何基於PHP-X 快速開發一個PHP擴充
PHP-X中文幫助
5分鐘PHP擴充開發快速入門
zephir中文網
zephir英文官網
zephir安裝與示範開發
phpcpp英文官網
phpcpp英文幫助
phpcpp中文幫助
以上是PHP擴展開發之 相關開發技術比較及介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!