国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP擴展基礎學習

2020-03-22 18:50:47
字體:
來源:轉載
供稿:網友
本文主要和大家介紹從零開始寫 PHP 擴展,我們會從如何生成y一個php擴展講起,希望能幫助到大家。

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

生成一個擴展

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

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

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

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

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

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

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

一個小坑

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

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

我們會驚訝地發(fā)現(xiàn),編譯的時候會有一個 warning。

warning:implicitdeclaration of function'ZEND_PARSE_PARAMETERS_NONE'isinvalid inC99 [-Wimplicit-function-declaration]ZEND_PARSE_PARAMETERS_NONE();^

1warning generated.

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

#ifndefzend_parse_parameters_none#definezend_parse_parameters_none()zend_parse_parameters(ZEND_NUM_ARGS(),"")#endif

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

定義一個函數(shù)

我想,大多數(shù)人寫擴展,肯定至少希望實現(xiàn)一個函數(shù),不會是要幾個html' target='_blank'>全局變量就去寫個擴展的吧(霧

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

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

constzend_function_entry cesium_functions[]={PHP_FE(cesium_test1,arginfo_cesium_test1)PHP_FE(cesium_test2,arginfo_cesium_test2)PHP_FE_END};constzend_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};

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

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

編譯安裝完了之后我們就可以使用這個函數(shù)了。

相關推薦:

PHP擴展之騰訊CMEM的編譯

php擴展之擴展框架的自動生成

如何編寫一個php擴展

以上就是PHP擴展基礎學習的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 太康县| 卓资县| 当阳市| 华蓥市| 同德县| 秦安县| 西宁市| 海安县| 新宁县| 贵阳市| 察隅县| 军事| 云霄县| 嵊泗县| 简阳市| 基隆市| 南和县| 离岛区| 峨边| 苍梧县| 平顶山市| 三亚市| 胶州市| 富宁县| 漳州市| 青河县| 资中县| 平泉县| 济南市| 通许县| 子长县| 左权县| 霍州市| 宁武县| 湛江市| 壶关县| 祁阳县| 渑池县| 永济市| 永济市| 任丘市|