搜尋
首頁後端開發php教程PHP擴展開發之 相關開發技術比較及介紹

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

Apr 13, 2018 pm 04:13 PM
php對比開發技術

這篇文章跟大家分享的內容是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 <phpcpp.h>
void say_hello(Php::Parameters &params)
{
    Php::out <h2 id="參考文獻">參考文獻</h2><p>如何基於PHP-X 快速開發一個PHP擴充<br>PHP-X中文幫助<br>5分鐘PHP擴充開發快速入門<br>zephir中文網<br>zephir英文官網<br>zephir安裝與示範開發<br>phpcpp英文官網<br>phpcpp英文幫助<br>phpcpp中文幫助</p><p><br></p></phpcpp.h>

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

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。