PHP擴充開發之 相關開發技術對比及介紹

來源:互聯網
上載者:User
本篇文章給大家分享的內容是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引擎的內部太複雜,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 擴充源碼大比拼

下面列出各個架構的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 &params){    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中文協助

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.