本篇文章給大家分享的內容是PHP擴充開發之 相關開發技術對比及介紹 ,有著一定的參考價值,有需要的朋友可以參考一下
PHP擴充是進階PHP程式員必須瞭解的技能之一,對於一個初入門的PHP擴充開發人員,怎麼才能開發一個成熟的擴充,進入PHP開發的進階領域呢?本系列開發教程將手把手帶您從入門進入進階階段。
本教程系列在linux下面開發(推薦使用centos),php版本用的是5.6,並假設您有一定的linux操作經驗和c/c++基礎。
有問題需要溝通的朋友請加QQ技術交流群32550793和我溝通。
開發php擴充有好幾種技術方法和架構,對於初學者來說,最好能夠選擇一個最容易下手,最快出效果的架構,這樣才能提升學習的興趣。下面逐一對比一下各個技術架構,讓大家能夠找到最適合自己的。
一、使用ext-skel C語言開發
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語言開發
Zephir提供了一種類似php的進階語言文法的方式,來自動產生擴充的c語言代碼,使編寫php擴充變得非常的簡單。不過這種開發方式帶來了一個問題,就是由於他用的不是c/c++語言開發,那就沒辦法直接利用現有的各種c/c++開發庫來實現強大的功能。所以感覺上有點雞肋。
三、使用PHP-X C++語言開發
php-x是知名的swoole擴充開發人員根據多年的開發經驗,提煉出來的一套基於c++的擴充開發架構。從文檔來看,這是一個比較容易上手的開發架構,資料類型很齊全,和php cpp的開發風格非常相似,但本人還沒有去體驗使用。
按照php-x官方的文檔,開發出來的擴充只支援PHP7以上,這是一個遺憾。
四、使用phpcpp C++語言開發
PHP CPP是我重點推薦的php擴充開發架構,簡明易懂,功能強大,開發效率高,代碼易維護,執行速度快。
PHP CPP是一款免費的php開發擴充庫,主要針對C++語言,可以進行類集合的擴充和構建,採用簡單的電腦語言,讓擴充變得更有趣更有用,方便開發人員進行維護和編寫,易於理解、維護輕鬆並且代碼優美。用C ++編寫的演算法看起來與用PHP編寫的演算法幾乎完全相同。如果你知道如何在PHP中編程,你可以很容易地學習如何在C ++中做同樣的。
Zend引擎的內部太複雜,Zend引擎的代碼是一團糟,並且大多是無證的。但是PHP-CPP庫已經在非常容易使用的C ++類和對象中封裝了所有這些複雜的結構。你可以使用C ++寫出驚人的快速演算法,而不必直接調用Zend引擎,甚至無需查看Zend引擎原始碼。使用PHP-CPP,您可以編寫本地代碼,而無需處理PHP的內部。
使用PHP-CPP,您可以像使用普通PHP指令碼一樣輕鬆地處理變數,數組,函數,對象,類,介面,異常和命名空間。除此之外,你可以使用C ++的所有功能,包括線程,lambda和非同步編程。
PHP-CPP有兩套擴充開發架構,分別支援PHP 5.X,PHP7,雖然架構代碼有兩個,但是介面卻是一樣的。所以如果你要開發相容多個版本的php擴充,不會花費你額外太多時間做相容。
五、各開發架構的 hello world 擴充源碼大比拼
下面列出各個架構的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_HELLOWORLDZEND_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 <phpcpp.h>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中文協助