国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

從零開始寫 PHP 擴展(一)

shiina / 938人閱讀

摘要:對于每個來說,都有著內心的一種希望寫擴展的沖動了吧。然而,缺乏一個很好的切入點。生成了擴展之后,我們會看到四個文件和一個文件夾。雖然大寫的有宏定義,但是為什么會報錯,我也不太清楚了。這個宏最終會被翻譯成一個函數。

PHP 是用 C 語言寫的。對于每個 PHPer 來說,都有著內心的一種希望寫擴展的沖動了吧。然而,缺乏一個很好的切入點。Google 上搜 PHP 擴展開發,大部分都是復制品文章,甚至有些人連操作都沒有操作過就搬運在了自己的博客。不過也有幾篇好教程,但是都是 PHP 5 時代的產物,隱藏著非常多的坑。我會將我自己慢慢踩坑的過程記錄下來,也許這就成了其它人的“教程”了吧。

生成一個擴展

想必很多人已經看到很多網上的教程了。大多都是教我們執行這個命令:$ ./ext_skel --extname=extname。但是,當你 clone 了 PHP 源碼后會發現,master 分支下并沒有 ext/ext_skel 這個文件。所以,我總結了一下:

如果你是直接下載 PHP 的源碼,或者在已經 release 的版本分之下,你可以執行這個命令

$ cd ext
$ ./ext_skel --extname=extname

如果你是直接在 master 分支下,只有 ext_skel.php 文件,這個時候你就直接可以執行這個 PHP 文件

$ cd ext
$ php ext_skel.php --ext extname

由于我是直接在 master 分支下開發的,所以后面的都是默認在 master 分之下的操作。

生成了擴展之后,我們會看到四個文件和一個文件夾?,F在這個階段,我們只需要用到兩個文件,.c 文件和 .h 文件。

一個小坑

在我們生成好擴展之后,我們可以試著編譯一下

$ phpize
$ ./configure
$ make && make test

我們會驚訝地發現,編譯的時候會有一個 warning。

warning: implicit declaration of function
      "ZEND_PARSE_PARAMETERS_NONE" is invalid in C99 [-Wimplicit-function-declaration]
        ZEND_PARSE_PARAMETERS_NONE();
        ^
1 warning generated.

然后你再執行 make test 發現有一個測試沒有通過。沒錯,腳本為我們生成好的文件,居然通不過自己的測試。有沒有覺得很詭異。我們看看 warning 的具體信息。找不到函數 ZEND_PARSE_PARAMETERS_NONE。看了一下文件,發現在第 15 行。看看這個函數名大概也能猜出來是什么意思了。于是我去 PHP 源碼里搜了一下??墒俏覀儼l現了這樣一個宏定義。

#ifndef zend_parse_parameters_none
#define zend_parse_parameters_none()    
        zend_parse_parameters(ZEND_NUM_ARGS(), "")
#endif

替換掉原來的大寫之后,就沒有 warning 了。這也算是官方給我們挖了一個小坑吧。雖然大寫的有宏定義,但是為什么會報錯,我也不太清楚了。

定義一個函數

我想,大多數人寫擴展,肯定至少希望實現一個函數,不會是要幾個全局變量就去寫個擴展的吧(霧

這里 PHP 給我們提供了一個有用的宏 PHP_FUNCTION。生成好的代碼里也有定義好的兩個函數,可以參照它的用法。這個宏最終會被翻譯成一個函數。例如 PHP_FUNCTION(name) 最終會被翻譯成 void zif_name(zend_execute_data *execute_data, zval *return_value)

同時我們看到有定義了這么一個數組

const zend_function_entry cesium_functions[] = {
    PHP_FE(cesium_test1,        arginfo_cesium_test1)
    PHP_FE(cesium_test2,        arginfo_cesium_test2)
    PHP_FE_END
};

我們需要將新添加的函數添加到這個數組里。像這樣

const zend_function_entry cesium_functions[] = {
    PHP_FE(cesium_test1,        arginfo_cesium_test1)
    PHP_FE(cesium_test2,        arginfo_cesium_test2)
    PHP_FE(name,           NULL)
    PHP_FE_END
};

記住,結尾不要加分號或者逗號。最后,我們可以個這個函數一個輸出

PHP_FUNCTION(name)
{
    php_printf("Hello
");
}

編譯安裝完了之后我們就可以使用這個函數了

總結

本文僅僅是展示了從創建擴展開始到運行的全過程,本著能運行的心態來走完這些流程。

由于作者水平有限,如有錯誤,敬請不吝賜教。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26087.html

相關文章

  • 從零開始創建PHP 擴展

    摘要:創建一個擴展的基本步驟都有哪些。執行命令后,這樣在當前目錄下會生成一個與擴展名一樣的目錄。文件是用于環境檢測的。檢測擴展編譯運行所需的環境是否滿足。其中,是注釋符號。去掉注釋后的代碼如下第三步,代碼實現修改文件。 創建一個擴展的基本步驟都有哪些。示例中,我們將實現如下功能: 輸出內容: $ php ./test.php$ hello word 在擴展中實現一個say方法,調用say方...

    yearsj 評論0 收藏0
  • php】Mac下從零搭建和配置 php+nginx+mysql 環境

    摘要:既然是從零開始,那么就把作為統一的安裝工具。下面附上安裝方法安裝好之后,就可以開始搭建環境了。環境安裝比較簡單安裝好之后,首先要啟動服務。和一起安裝,我們先去安裝,再做相關配置。成功解析還差一步,就是修改配置文件。 既然是從零開始,那么就把 homebrew 作為統一的安裝工具。如果你不知道 homebrew 是什么東東,移步這里。下面附上 homebrew 安裝方法: /usr/bi...

    yzzz 評論0 收藏0
  • php】Mac下從零搭建和配置 php+nginx+mysql 環境

    摘要:既然是從零開始,那么就把作為統一的安裝工具。下面附上安裝方法安裝好之后,就可以開始搭建環境了。環境安裝比較簡單安裝好之后,首先要啟動服務。和一起安裝,我們先去安裝,再做相關配置。成功解析還差一步,就是修改配置文件。 既然是從零開始,那么就把 homebrew 作為統一的安裝工具。如果你不知道 homebrew 是什么東東,移步這里。下面附上 homebrew 安裝方法: /usr/bi...

    QiShare 評論0 收藏0
  • 1. Laravel的初始化安裝 - Laravel從零開始教程

    摘要:要學習那么第一步就是要在我們的開發機上安裝并運行,首先我們會先安裝再使用框架提供的安裝小工具,通過使用就能生成我們的工程了。在的官方網站上的文檔中已經很詳細的介紹了如何安裝不過文檔可能講解的并不是那么的細致。從零開始學系列目錄地址 要學習Laravel,那么第一步就是要在我們的開發機上安裝并運行Laravel,首先我們會先安裝composer,再使用laravel框架提供的安裝小工具,...

    baukh789 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<