首頁  >  文章  >  後端開發  >  PHP擴展開發之 相關開發技術比較及介紹

PHP擴展開發之 相關開發技術比較及介紹

不言
不言原創
2018-04-13 16:13:381952瀏覽

這篇文章跟大家分享的內容是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_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 &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中文幫助


以上是PHP擴展開發之 相關開發技術比較及介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn