摘要:下載源代碼要開(kāi)發(fā)擴(kuò)展,需要先下載的源代碼,一方面是因?yàn)槲覀兊臄U(kuò)展一般會(huì)用到自身定義的函數(shù)和宏,另一方面我們可以利用官方提供的工具減少工作量。重點(diǎn)關(guān)注,,即可,最簡(jiǎn)單的場(chǎng)景下這三個(gè)文件就是一個(gè)擴(kuò)展的全部組成部分了。
下載PHP源代碼
要開(kāi)發(fā)PHP擴(kuò)展,需要先下載PHP的源代碼,一方面是因?yàn)槲覀兊臄U(kuò)展一般會(huì)用到PHP自身定義的函數(shù)和宏,另一方面我們可以利用官方提供的工具減少工作量。
我下載了PHP-7.0.2,地址是:http://cn2.php.net/get/php-7....。
解壓源碼壓縮包, tar xzf php-7.0.2.tar.gz,我們現(xiàn)在只需要關(guān)注Zend和ext這兩個(gè)目錄。
Zend目錄里面包含了PHP的Zend Engine源代碼,有些函數(shù)和宏的定義我們需要在這里面簡(jiǎn)單地看一下。
ext目錄里面包含了PHP原生的擴(kuò)展,以及我們開(kāi)發(fā)自己的擴(kuò)展時(shí)可以利用的工具,Linux下使用ext_skel,Windows下使用ext_skel_win32.php
我們可以在ext目錄下看到所有的PHP原生擴(kuò)展,其中包括了熟悉的curl,json,mbstring,simplexml,sockets等擴(kuò)展,還有很多沒(méi)有用過(guò)甚至沒(méi)有聽(tīng)說(shuō)過(guò)的擴(kuò)展,不用在意這些,我們先打開(kāi)我們最熟悉的curl來(lái)看看,有config.m4配置文件,有php_curl.h,curl_file.c等源代碼,還有一些中間文件,最后還有一個(gè)tests目錄,里面放的curl擴(kuò)展的單元測(cè)試。重點(diǎn)關(guān)注config.m4,php_curl.h,curl_file.c即可,最簡(jiǎn)單的場(chǎng)景下這三個(gè)文件就是一個(gè)擴(kuò)展的全部組成部分了。
打開(kāi)隨便看一下,不算太復(fù)雜,但是自己寫(xiě)一個(gè)類(lèi)似的還是挺頭疼的,這時(shí)就需要用到我前面提到的ext_skel工具了。這個(gè)工具也在ext目錄下,我們執(zhí)行一下,./ext_skel --help,可以看到若干參數(shù),我們用到的只有--extname=module,這里填上自己開(kāi)發(fā)的擴(kuò)展名稱(chēng)。想深入了解各個(gè)參數(shù)的作用可以看這里:http://php.net/manual/en/inte...
./ext_skel --extname=hello
ext目錄下多了一個(gè)hello目錄,我們后續(xù)的工作都在這個(gè)目錄下面,工具已經(jīng)為我們自動(dòng)生成了一些文件。
config.m4配置文件
開(kāi)發(fā)PHP擴(kuò)展,在寫(xiě)C代碼之前,要先配置一下這里。我們打開(kāi)可以看到詳細(xì)的注釋說(shuō)明,dnl是注釋語(yǔ)法。
如果你的擴(kuò)展用到了外部依賴(lài),就配置--with-hello選項(xiàng),否則配置--enable-hello選項(xiàng),刪除這下面3行的dnl注釋
PHP_ARG_ENABLE(hello, whether to enable hello support, Make sure that the comment is aligned: [ --enable-hello Enable hello support])
PHP_ARG_WITH和PHP_ARG_ENABLE這兩個(gè)宏用來(lái)配置configure選項(xiàng),一個(gè)配置需要外部依賴(lài)的,另一個(gè)配置不需要外部依賴(lài)的
配置好的內(nèi)容,在后面執(zhí)行configure --help時(shí)可以看到。
php_hello.h頭文件
類(lèi)似于C語(yǔ)音的頭文件,包含了一些自定義的結(jié)構(gòu)和函數(shù)聲明,在這個(gè)demo中暫時(shí)不需要改動(dòng)
hello.c代碼文件
真正的邏輯代碼都在這個(gè)文件中,后面會(huì)詳細(xì)介紹。
好了,到這一步我們終于要開(kāi)始寫(xiě)代碼了,打開(kāi)hello.c文件。
整個(gè)擴(kuò)展的入口是zend_module_entry這個(gè)結(jié)構(gòu),具體的定義可以在Zend目錄下的zend_modules.h文件中看到,一共有十幾個(gè)屬性,快速跳過(guò),我們暫時(shí)只需要"hello world"。
zend_module_entry hello_module_entry = { STANDARD_MODULE_HEADER, "hello", hello_functions, PHP_MINIT(hello), PHP_MSHUTDOWN(hello), PHP_RINIT(hello), /* Replace with NULL if there"s nothing to do at request start */ PHP_RSHUTDOWN(hello), /* Replace with NULL if there"s nothing to do at request end */ PHP_MINFO(hello), PHP_HELLO_VERSION, STANDARD_MODULE_PROPERTIES };
STANDARD_MODULE_HEADER幫我們實(shí)現(xiàn)了前面6個(gè)屬性
"hello"是擴(kuò)展的名字
hello_functions是擴(kuò)展包含的全部方法的集合
后面5個(gè)宏分別代表5個(gè)擴(kuò)展特定方法
PHP_HELLO_VERSION是擴(kuò)展的版本號(hào),定義在頭文件中
STANDARD_MODULE_PROPERTIES幫我們實(shí)現(xiàn)了剩下的屬性
暫時(shí)都不需要修改,知道這是一個(gè)入口就行。順著這個(gè)入口,我們繼續(xù)看怎么給擴(kuò)展添加方法,在hello_functions[]方法數(shù)組中已經(jīng)有了一個(gè)示例方法confirm_hello_compiled,我們參考它寫(xiě)我們的方法hello_world
const zend_function_entry hello_functions[] = { PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */ PHP_FE(hello_world, NULL) PHP_FE_END /* Must be the last line in hello_functions[] */ };
先在擴(kuò)展的方法數(shù)組中添加上hello_world,然后再定義hello_world。找到confirm_hello_compiled方法定義的地方,在它下面依葫蘆畫(huà)瓢,php_printf是Zend Engine中的printf方法。
PHP_FUNCTION(hello_world) { php_printf("Hello World! "); RETURN_TRUE; }編譯安裝
最后就是編譯安裝我們的擴(kuò)展了,安裝過(guò)PHP擴(kuò)展的同學(xué)不用看,沒(méi)有經(jīng)驗(yàn)的可以參考一下。
/usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make make test make install
現(xiàn)在PHP的擴(kuò)展目錄中已經(jīng)有了hello.so這個(gè)文件,在php.ini中添加上擴(kuò)展的配置
extension = hello.so測(cè)試
寫(xiě)一個(gè)test.php方法,執(zhí)行腳本就可以看到"Hello World!"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22062.html
摘要:服務(wù)重點(diǎn)基本概述協(xié)議是基于的一種新的網(wǎng)絡(luò)協(xié)議。被調(diào)用者通過(guò)狀態(tài)通知機(jī)制等來(lái)通知調(diào)用者,或通過(guò)回調(diào)函數(shù)來(lái)處理結(jié)果阻塞和非阻塞關(guān)注的是調(diào)用者等待被調(diào)用者返回調(diào)用結(jié)果時(shí)的狀態(tài)。 一、PHP7源碼安裝和Swoole源碼編譯安裝 1.1 PHP7源碼安裝 1.1.1 獲取源碼與安裝 ????獲取PHP7源碼:www.php.net tar -xzvf ... # 解壓命令 ./configur...
摘要:對(duì)于這一問(wèn)題企業(yè)一般多會(huì)采用其他技術(shù),比如使用或者其他語(yǔ)言。但是有了之后,由于底層全是用語(yǔ)言實(shí)現(xiàn),其出色的性能深受追捧。由于以前適用場(chǎng)景的局限性比較大,所以會(huì)有說(shuō)重新定義了的說(shuō)法。到這里的環(huán)境已經(jīng)搭建完成了。 Swoole 是一個(gè) php 的擴(kuò)展,它的核心目標(biāo)就是解決 php 在實(shí)現(xiàn)一些高訪(fǎng)問(wèn) server 服務(wù)中可能遇到的一系列問(wèn)題,這些問(wèn)題用原生的 php 往往并不能很方便高效的解...
摘要:最適合入門(mén)的初級(jí)教程一為什么選擇曾經(jīng)要跟白頭到老沒(méi)想到它升了個(gè)級(jí)就拋了錨把我等拋棄了痛定思痛重新審視了一遍框架是世界上最好的語(yǔ)言這個(gè)沒(méi)有疑問(wèn)吧如果有那絕對(duì)是個(gè)異教徒這是要被拖出去燒死的信仰的問(wèn)題神圣不可侵犯那最好的語(yǔ)言中最流行的框架是哪個(gè)呢 最適合入門(mén)的 Laravel 初級(jí)教程 (一) 為什么選擇 laravel 曾經(jīng)要跟 thinkphp 白頭到老;沒(méi)想到它升了個(gè)級(jí)就拋了錨;把我等...
閱讀 3904·2021-09-27 13:35
閱讀 1083·2021-09-24 09:48
閱讀 2912·2021-09-22 15:42
閱讀 2353·2021-09-22 15:28
閱讀 3156·2019-08-30 15:43
閱讀 2624·2019-08-30 13:52
閱讀 2981·2019-08-29 12:48
閱讀 1460·2019-08-26 13:55