国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
> main.cpp:包含get_module函數(shù)的主CPP文件(稍后將詳細(xì)討論)
更改名稱=您對更有意義的extension,例如名稱=骨架。
> main.cpp
>函數(shù)參數(shù)通過參考
結(jié)論
>調(diào)試PHP擴展程序可能會有些棘手,因為您''重新處理一種編譯的語言。但是,您可以使用GDB(GNU調(diào)試器)等工具進行調(diào)試。 GDB允許您設(shè)置斷點,逐步瀏覽代碼并檢查變量,在嘗試追蹤錯誤時,這可能非常有用。
>我可以使用PHP-CPP創(chuàng)建面向?qū)ο蟮臄U展嗎?您可以在C代碼中定義類,然后可以在PHP代碼中使用這些類。這使您可以編寫易于維護的干凈,模塊化的代碼。
>
首頁 后端開發(fā) php教程 通過PHP-CPP開始PHP擴展開發(fā)

通過PHP-CPP開始PHP擴展開發(fā)

Feb 21, 2025 am 09:06 AM

通過PHP-CPP開始PHP擴展開發(fā)

在與PHP的交往中,您可能會考慮自己寫PHP擴展。我能想到的有幾個原因激發(fā)了我這樣做:

>

    >擴展PHP功能以進行一些非常特殊的用法(數(shù)學(xué),統(tǒng)計,幾何等)。
  • 與純PHP實施相比,
  • 具有更高的性能和效率
  • 利用以前掌握的語言(對我,C)獲得的編程獲得的迅速性。
  • >
在選擇構(gòu)建PHP擴展的工具方面,我們看到了兩種不同的方法:

    使用更多的PRHP語義,例如Zephir。
  • >使用更多的Pro-C/C語義,例如PHP-CPP,將在本文中解決。
  • 對我來說,選擇第二種方法的主要驅(qū)動器很簡單:我開始使用C/C進行編程愛好,因此我仍然更愿意在C/C中編寫那些較低級別的模塊。 PHP-CPP的官方網(wǎng)站給出了其他一些理由。
>

鑰匙要點

PHP-CPP是一個用于開發(fā)PHP擴展的庫,允許C開發(fā)人員編寫PHP擴展,而無需直接與Zend API合作的復(fù)雜性。它寫在C 11中,并提供了有據(jù)可查和用戶友好的課程的集合。

> PHP-CPP正在迅速發(fā)展,建議使用Git克隆存儲庫以進行最新更新。它支持單線讀取的PHP安裝,并需要升級到G編譯器到4.8.x版或更高版本以兼容。
    >
  • > PHP-CPP提供了一個骨架擴展項目,其中包括一個main.cpp文件,用于編譯擴展名的制造文件以及用于擴展加載的.INI文件??梢远ㄖ乒羌茼椖恳赃m合個人需求,并使用“ make && sudo make install”命令進行編譯和安裝。
  • PHP-CPP支持四種類型的函數(shù)簽名,可以從PHP調(diào)用,并允許參數(shù)以數(shù)組形式通過值傳遞。它還允許功能導(dǎo)出/注冊,功能參數(shù)類型的規(guī)范以及以對象為導(dǎo)向的擴展的創(chuàng)建。
  • >安裝和配置
  • PHP-CPP正在迅速發(fā)展。在本文撰寫本文時,它以0.9.1版本(大約2天發(fā)布)。根據(jù)其文檔:“這是一個為即將推出的V1.0版本做準(zhǔn)備的功能凍結(jié)版本”,因此我們有信心很快就會看到其1.0主要版本。 因此,至少在此期間,建議使用git克隆存儲庫,并通過git拉動獲得最新更新。
  • 注意:安裝上的PHP-CPP文檔指出,暫時,它“僅支持單線讀取PHP安裝”,因為“內(nèi)部Zend Engine使用了非常奇怪的系統(tǒng)來確保線程安全性”。未來的發(fā)行版可能支持多線Readed PHP安裝,但讓我們暫時記住這一點,并遵守其當(dāng)前限制。幸運的是,大多數(shù)PHP安裝都應(yīng)該是“單線讀取的PHP安裝”。

    >

    > php-cpp寫在C 11中。因此,我的Ubuntu 12.04 LTS中安裝的G較舊版本不支持它。我們需要將G編譯器升級到上述4.8.x版本。有一篇文章詳細(xì)介紹了進行升級的步驟。請按照列出的說明進行操作。

    >另外,PHP-CPP匯編將使用php.h標(biāo)頭文件。除非安裝PHP-DEV,否則通常在Ubuntu框中缺少此文件。我們可以通過發(fā)出此命令來安裝與PHP5相關(guān)的開發(fā)文件:

<span>sudo apt-get install php5-dev</span>

>升級G并安裝必要的標(biāo)頭文件后,我們可以發(fā)布以下命令以編譯和安裝PHP-CPP庫文件(libphpcpp.so):>

<span>make && sudo make install</span>
匯編將很快。安裝后,libphpcpp.so文件將被復(fù)制到/usr/lib,所有PHP-CPP標(biāo)頭文件將被復(fù)制到/usr/include/include and/usr/include/include/phpcpp文件夾。

>。 PHP-CPP LIB的安裝現(xiàn)已完成。這非常簡單,我們現(xiàn)在可以繼續(xù)進行編程部分。

在這樣做之前,我們將討論PHP-CPP中使用的一些重要概念和術(shù)語。完整的文檔可以在其官方網(wǎng)站上找到,并鼓勵每個人在執(zhí)行任何真正的編程之前閱讀它。

骨架(空)擴展項目文件

PHP-CPP提供了一個骨架擴展項目,其中包含以下3個文件:

> main.cpp:包含get_module函數(shù)的主CPP文件(稍后將詳細(xì)討論)

>

makefile:示例制作文件以編譯擴展名

    yourextension.ini:僅包含一行擴展名加載
  • > makefile
  • >如果您熟悉 *NIX開發(fā),那么您熟悉此Makefile。應(yīng)進行一些輕微的更改以自定義此文件以滿足我們的需求:

更改名稱=您對更有意義的extension,例如名稱=骨架。

>更改ini_dir = /etc/php5/conf.d匹配系統(tǒng)的配置。就我而言,它是ini_dir = /etc/php5/cli/conf.d。我修改了INI路徑,以首先啟用PHP CLI環(huán)境的擴展。

  • 這些都是我所做的所有更改。其余的makefile可以保持原樣。
  • > yourextension.ini
>我將此文件重命名為skeleton.ini,然后更改了這樣的文件中的唯一行:

>

<span>sudo apt-get install php5-dev</span>

> main.cpp

在PHP-CPP提供的空項目中,此文件僅包含一個函數(shù):get_module(),該函數(shù)下面摘錄:

<span>make && sudo make install</span>

>目前,讓我們更改此行以匹配我們打算創(chuàng)建的擴展名:>

當(dāng)后者試圖加載所需的庫時,PHP調(diào)用了<span>extension=skeleton.so</span>來調(diào)用。 到目前為止,我們已經(jīng)對空的項目進行了一些更改,以適應(yīng)我們的需求?,F(xiàn)在,我們可以編譯和安裝此項目并安裝擴展名:

接下來,我們需要將所需的文件復(fù)制到適當(dāng)?shù)奈募A中:>

<span><span>#include <phpcpp.h></span>
</span>
<span>/**
</span><span> *  tell the compiler that the get_module is a pure C function
</span><span> */
</span><span>extern "C" {
</span>
    <span>/**
</span><span>     *  Function that is called by PHP right after the PHP process
</span><span>     *  has started, and that returns an address of an internal PHP
</span><span>     *  strucure with all the details and features of your extension
</span><span>     *
</span><span>     *  @return void*   a pointer to an address that is understood by PHP
</span><span>     */
</span>    PHPCPP_EXPORT <span>void *get_module() 
</span>    <span>{
</span>        <span>// static(!) Php::Extension object that should stay in memory
</span>        <span>// for the entire duration of the process (that's why it's static)
</span>        <span>static Php::Extension extension("yourextension", "1.0");
</span>
        <span>// @todo    add your own functions, classes, namespaces to the extension
</span>
        <span>// return the extension
</span>        <span>return extension;
</span>    <span>}
</span><span>}  </span>
>我們只需要確保將骨架復(fù)制到PHP擴展的正確位置(在我的Ubuntu設(shè)置中,它應(yīng)該為/usr/lib/php5/20121212,如上所示)。

然后,我們可以通過PHP -I |將擴展名驗證在CLI中加載。 GREP骨架,終端應(yīng)顯示類似的東西:

>
<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>

(回想一下skeleton.ini是我們修改的文件,其中包含擴展名= skeleton.so line。)

> 到目前為止,我們已經(jīng)使用PHP-CPP進行了編譯并安裝了我們的第一個PHP擴展。當(dāng)然,此擴展程序還沒有任何作用?,F(xiàn)在,我們將創(chuàng)建第一個功能,以進一步了解建立PHP擴展的過程。

通過PHP-CPP開始PHP擴展開發(fā)“你好,泰勒”功能

我們創(chuàng)建的第一個功能將是“ Hello,World”的第一個功能。讓我們查看main.cpp的完整代碼:

>

>根據(jù)“注冊本機函數(shù)”上的PHP-CPP文檔,它支持四種類型的功能簽名:

在這種情況下,我使用第二個簽名,并且參數(shù)以數(shù)組形式(PHP功能)按值傳遞。

但是,在Helloworld中,我們專門使用了C型STD :: String來獲取第一個參數(shù)。 我們還使用C STD LIB來輸出一個熱情的消息。

在get_module()函數(shù)中,在聲明擴展變量后,我們添加了要導(dǎo)出的函數(shù)(helloworld()),并為php腳本(helloworld)分配一個名稱。

現(xiàn)在,讓我們編譯并安裝擴展程序。如果一切順利進行,新的骨架將復(fù)制到擴展名目錄。
<span>make && sudo make install</span>

我們可以編寫一個簡單的腳本來測試剛剛創(chuàng)建的函數(shù):>

<span>cp -f skeleton.so /usr/lib/php5/20121212
</span><span>cp -f skeleton.ini /etc/php5/cli/conf.d</span>
請花一些時間來查看輸出:

>我們將回到以后觀察到的內(nèi)容。

>函數(shù)參數(shù)通過參考

接下來,我們將看到另一個函數(shù),該函數(shù)通過引用,swap()函數(shù)傳遞參數(shù)。在此功能中,我們還將嘗試指定參數(shù)及其類型的數(shù)量。

在main.cpp中,我們添加了另一個函數(shù)swap():

>

<span>sudo apt-get install php5-dev</span>
以及通過指定參數(shù)數(shù)量及其類型來導(dǎo)出功能:>

我們明確地說:
<span>make && sudo make install</span>

將有兩個參數(shù)(a和b);
    >
  • 應(yīng)通過引用(而不是通過值); >通過
  • 它們應(yīng)該是數(shù)字類型的。
  • >讓我們編譯并再次安裝更新的擴展程序,并編寫一些代碼片段,以查看此新功能的工作方式:>
交換($ a)將失敗。這是預(yù)期的和出乎意料的。預(yù)期的部分是我們需要兩個參數(shù),只給出一個參數(shù)。但是,當(dāng)調(diào)用函數(shù)交換并提示我們不夠的參數(shù)時,PHP不應(yīng)該捕獲該錯誤嗎?

>

>第一個呼叫(交換($ a,$ b))顯示了預(yù)期的結(jié)果:20 | 10。該函數(shù)交換了兩個數(shù)字。
<span>extension=skeleton.so</span>
>

第二個通話是出乎意料的:我們告訴PHP我們要交換兩個數(shù)字!但是它只是忽略了第二個參數(shù)傳遞的是字符串,并且無論如何都進行交換!

好吧,從某種意義上說,仍然可以預(yù)期。 PHP并沒有真正區(qū)分?jǐn)?shù)字類型和字符串類型。這種行為符合PHP標(biāo)準(zhǔn)。同樣,由于這種行為,我們沒有,也不能使用C內(nèi)部類型作為功能(TEMP)中使用的臨時變量,而是使用PHP ::值作為變量類型。

第三個通話將起作用。第一個var_dump將顯示DateTime對象,第二個將顯示整數(shù)。這是某種程度上出乎意料的(至少對我來說)。畢竟,對象與數(shù)字/字符串完全不同。但是,在考慮到這種“互換”行為在PHP中也可行之后,它與PHP的奇怪之處相符。

>那么,這是否意味著“類型”規(guī)范不會產(chǎn)生任何影響?并不真地。為了進一步闡述這一點,我們創(chuàng)建了第三個功能:>

我們這樣注冊了此功能:

測試代碼將是這樣的:

>
<span><span>#include <phpcpp.h></span>
</span>
<span>/**
</span><span> *  tell the compiler that the get_module is a pure C function
</span><span> */
</span><span>extern "C" {
</span>
    <span>/**
</span><span>     *  Function that is called by PHP right after the PHP process
</span><span>     *  has started, and that returns an address of an internal PHP
</span><span>     *  strucure with all the details and features of your extension
</span><span>     *
</span><span>     *  @return void*   a pointer to an address that is understood by PHP
</span><span>     */
</span>    PHPCPP_EXPORT <span>void *get_module() 
</span>    <span>{
</span>        <span>// static(!) Php::Extension object that should stay in memory
</span>        <span>// for the entire duration of the process (that's why it's static)
</span>        <span>static Php::Extension extension("yourextension", "1.0");
</span>
        <span>// @todo    add your own functions, classes, namespaces to the extension
</span>
        <span>// return the extension
</span>        <span>return extension;
</span>    <span>}
</span><span>}  </span>

>當(dāng)我們通過正確的類類型(SampleClass)傳遞時,對SwapoBject()的第一個調(diào)用將起作用。第二個將失敗,顯示“可捕獲的致命錯誤:參數(shù)1傳遞給swapobject()必須是SampleClass的實例,是給定的另一個類別的實例...”。

<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
>上面的代碼段說明了類型限制的一個重要方面:標(biāo)量類型聲明并未真正實現(xiàn)。 PHP以及PHP-CPP僅執(zhí)行對象類型聲明。同樣,在PHP側(cè)并未真正執(zhí)行參數(shù)的數(shù)量。

結(jié)論

在本文中,我們說明了準(zhǔn)備PHP-CPP為我們的PHP環(huán)境工作的步驟。我們還討論了使用PHP-CPP(和C語義)創(chuàng)建PHP擴展的一些基本步驟。

>我們介紹了擴展項目文件,功能簽名,功能導(dǎo)出/注冊和功能參數(shù)類型。

>在下一篇文章中,我們將進一步詳細(xì)介紹PHP-CPP中的一些關(guān)鍵功能,并提供現(xiàn)實世界中的用例,展示了使用php-cpp的C類和名稱空間實現(xiàn)的使用。

>

>關(guān)于PHP擴展開發(fā)的常見問題(常見問題解答)

什么是PHP-CPP,它與PHP有何不同?它提供了有據(jù)可查和用戶友好型類的集合,使C開發(fā)人員可以編寫PHP擴展名,而無需直接與Zend API合作的復(fù)雜性。與PHP是一種解釋的語言不同,PHP-CPP允許您以C(Comperied語言)編寫代碼。這可能會導(dǎo)致性能改進,因為編譯的代碼通常比解釋的代碼更快。

>如何在系統(tǒng)上安裝php-cpp?

在系統(tǒng)上安裝PHP-CPP需要從GitHub克隆PHP-CPP存儲庫??寺『?,導(dǎo)航到目錄并執(zhí)行“ make”命令。構(gòu)建過程完成后,使用“ Make install”命令安裝庫。請記住,您需要具有根特權(quán)來安裝庫。

>如何使用PHP-CPP?創(chuàng)建基本的PHP擴展名,使用PHP-CPP創(chuàng)建PHP擴展程序涉及多個步驟。首先,您需要為擴展程序創(chuàng)建一個目錄并導(dǎo)航到其中。然后,為您的擴展程序創(chuàng)建一個“ makefile”和c源文件。 “ makefile”將包含構(gòu)建擴展名的說明,而C源文件將包含用于擴展的實際代碼。編寫代碼后,您可以使用“ make”命令構(gòu)建擴展名。

>如何調(diào)試我的php擴展名?

>調(diào)試PHP擴展程序可能會有些棘手,因為您''重新處理一種編譯的語言。但是,您可以使用GDB(GNU調(diào)試器)等工具進行調(diào)試。 GDB允許您設(shè)置斷點,逐步瀏覽代碼并檢查變量,在嘗試追蹤錯誤時,這可能非常有用。

我可以使用php-cpp創(chuàng)建PHP 7的擴展名。

是的,PHP-CPP與PHP 7兼容。但是,您需要確保使用最新版本的PHP-CPP,因為較早的版本可能不支持PHP 7。

>我如何處理PHP-CPP中的異常?

php-cpp提供一個名為php ::異常的類,您可以用來從C代碼中拋出異常。這些例外可以像其他任何PHP例外一樣在您的PHP代碼中捕獲和處理。

>我可以使用PHP-CPP創(chuàng)建面向?qū)ο蟮臄U展嗎?您可以在C代碼中定義類,然后可以在PHP代碼中使用這些類。這使您可以編寫易于維護的干凈,模塊化的代碼。

>如何從我的C代碼中調(diào)用PHP函數(shù)?

php-cpp提供了一個名為php :: call的類,您可以使用C代碼調(diào)用PHP功能。這使您可以利用PHP內(nèi)置功能在擴展中的功能。

>我可以使用php-cpp創(chuàng)建與數(shù)據(jù)庫交互的擴展嗎? CPP創(chuàng)建與數(shù)據(jù)庫交互的擴展。但是,您需要使用C數(shù)據(jù)庫庫,因為PHP-CPP不提供任何內(nèi)置數(shù)據(jù)庫功能。

>

>一旦您''如何分發(fā)我的php擴展名? VE構(gòu)建了PHP擴展名,您可以通過將其包裝為PECL包裝來分配它。 PECL是PHP擴展的存儲庫,它提供了分發(fā)和安裝擴展的標(biāo)準(zhǔn)方法。

以上是通過PHP-CPP開始PHP擴展開發(fā)的詳細(xì)內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

如何在PHP中實施身份驗證和授權(quán)? 如何在PHP中實施身份驗證和授權(quán)? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在于驗證文件類型、重命名文件并限制權(quán)限。1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限制文件大小,設(shè)置目錄權(quán)限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? PHP中==(松散比較)和===(嚴(yán)格的比較)之間有什么區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在于類型檢查的嚴(yán)格程度。==在比較前會進行類型轉(zhuǎn)換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應(yīng)優(yōu)先使用,==僅在需要類型轉(zhuǎn)換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? 如何在PHP( - , *, /,%)中執(zhí)行算術(shù)操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學(xué)運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用于變量,字符串?dāng)?shù)字會自動轉(zhuǎn)換但不推薦依賴;2.減法用-號,變量同理,類型轉(zhuǎn)換同樣適用;3.乘法用*號,適用于數(shù)字及類似字符串;4.除法用/號,需避免除以零,并注意結(jié)果可能是浮點數(shù);5.取模用%號,可用于判斷奇偶數(shù),處理負(fù)數(shù)時余數(shù)符號與被除數(shù)一致。正確使用這些運算符的關(guān)鍵在于確保數(shù)據(jù)類型清晰并處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅(qū)動(通過PECL或Composer安裝)創(chuàng)建客戶端實例并操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設(shè)置與獲取,推薦phpredis用于高性能場景,Predis則便于快速部署;兩者均適用于生產(chǎn)環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什么是PHP,為什么它用于Web開發(fā)? 什么是PHP,為什么它用于Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時區(qū)? 如何設(shè)置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles