最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

大神指路:如何“抄“一個(gè)PHP擴(kuò)展,真的超級(jí)簡(jiǎn)單~

2023-10-09 09:49 作者:藍(lán)橋云課  | 我要投稿

寫一個(gè)WEB服務(wù)器,如果用file_get_contents從磁盤中讀取文件,并發(fā)直線下降,用sendfile可以提升性能。但是,PHP不支持,開發(fā)擴(kuò)展我又不會(huì),只能靠抄襲PHP擴(kuò)展源碼維持一下生活這樣子。

看一下sendfile的原型:

這個(gè)函數(shù)在linux2.6.3之前的內(nèi)核,out_fd只能是socket類型。

我們要實(shí)現(xiàn)的sendfile的PHP函數(shù)原型也差不多,為了簡(jiǎn)單,我就不要offset這個(gè)參數(shù)了。

而且,規(guī)定out_fd必須是stream類型的資源,in_fd必須是普通文件類型的資源:

生成開發(fā)骨架,怎么辦?不會(huì),Google一下,好像運(yùn)行個(gè)命令就可以了:

我用的php7.3版本,好像無需手動(dòng)去注釋,也好,省事。按照網(wǎng)上的教程,不管三七二十一,先復(fù)制一份PHP_FUNCTION(sendfile)。

接下來咋辦?我又不會(huì),只能看看別人怎么搞的,到ext里面找找,好像都得先接收傳過來的變量。

連猜帶蒙(人家的宏名字取得多好,跟讀英文似的),這一堆宏應(yīng)該就是用來接收變量。

你看看PARSE_PARAMETERS_START直譯過來就是開始解析參數(shù), 至于它的兩個(gè)參數(shù),你去這個(gè)宏定義的地方看看

完美的命名,這個(gè)宏要求的最小參數(shù)個(gè)數(shù)和最大參數(shù)個(gè)數(shù)。

這個(gè)很容易就聯(lián)想到,最小參數(shù)個(gè)數(shù)不就是必填參數(shù)個(gè)數(shù)么?最大參數(shù)個(gè)數(shù)不就是必填+選填個(gè)數(shù)總數(shù)么?

PARAM_RESOURCE直譯過來就是資源類型的參數(shù)

PARAM_LONG直譯過來就是整型參數(shù)

PARAM_OPTIONAL直譯過來就是可選的

PARSE_PARAMETERS_END直譯過來就是結(jié)束解析參數(shù)

至于前面的ZEND和Z,你還不允許人家加個(gè)前綴,表示這宏是人家命名的呀?

根據(jù)我們之前的分析,前兩個(gè)用zval接,count用zend_long接。

接下來怎么玩?我們不是要調(diào)用sendfile嗎?不管三七二十一,先把C語言的sendfile函數(shù)調(diào)用寫上去,如果成功就返回寫入的長(zhǎng)度,失敗就返回false.

然后呢?想辦法把zval類型變成int類型的fd,怎么變呢,我又不會(huì),只能繼續(xù)發(fā)揮拿來主義精神,去ext找找看人家是怎么玩的。終于,在ext/sockets/sockets.c的

PHP_FUNCTION(socket_import_stream)中找到把zval轉(zhuǎn)成int類型的方法。

OK,開抄。

1、先把zval轉(zhuǎn)成php_stream,

2、再把php_streamphp_stream_cast轉(zhuǎn)成STDIO。

3、再調(diào)用fileno把stream資源轉(zhuǎn)成int類型的文件描述符。

這幾個(gè)函數(shù)都不用我解釋,人家的命名太完美了,php_stream_is判斷php_stream是不是指定類型的流。php_stream_cast流轉(zhuǎn)換函數(shù)。

好激動(dòng),是不是快成功了?

接下來怎么玩?我又不會(huì)了,還是去看看人家怎么玩的吧。好像要配置參數(shù)信息之類的,連猜帶蒙。

還要把函數(shù)加到函數(shù)實(shí)體結(jié)構(gòu)體里面:

收功,我們寫完P(guān)HP的一個(gè)功能,往往會(huì)跑個(gè)單元測(cè)試,來驗(yàn)證這個(gè)功能是不是達(dá)到我們的預(yù)期。剛好看到我們的擴(kuò)展根目錄有個(gè)tests目錄,沒辦法,我又不會(huì),只能再去別的ext里面偷師。

先新建一個(gè)request.txt,里面的內(nèi)容是

注意一下http協(xié)議格式,后面的換行也是內(nèi)容:

哇,應(yīng)該快好了吧?好激動(dòng),趕緊編譯四步曲:

好開心,居然沒問題!

成功運(yùn)用到自己玩的項(xiàng)目中,抄襲完成。

作者:church

版權(quán)聲明:版權(quán)歸原作者所有,藍(lán)橋云課僅做分享使用,如有侵權(quán),聯(lián)系刪除


如果你對(duì)作者的課程感興趣,藍(lán)橋云課官網(wǎng)上線了該老師的《PHP Socket 編程基礎(chǔ)入門》課程,如果你是藍(lán)橋云課的刷題會(huì)員或者是學(xué)習(xí)會(huì)員,可免費(fèi)學(xué)習(xí)該課程。



同時(shí),如果你是剛接觸編程的大一新生,不知道該如何系統(tǒng)學(xué)習(xí)課程?學(xué)姐建議大家可以在藍(lán)橋云課的免費(fèi)課程處進(jìn)行入門學(xué)習(xí)。像對(duì)新手比較友好的C語言、python等的入門,在藍(lán)橋云課上都有免費(fèi)課程可供大家入門。


掃碼添加學(xué)姐微信

了解更多課程內(nèi)容詳情

↓↓↓



大神指路:如何“抄“一個(gè)PHP擴(kuò)展,真的超級(jí)簡(jiǎn)單~的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
林甸县| 文水县| 昌江| 永泰县| 大冶市| 鲜城| 常德市| 新郑市| 太仓市| 南投县| 信丰县| 伊春市| 翁源县| 外汇| 施甸县| 辰溪县| 桂阳县| 饶阳县| 新乡县| 库车县| 大同市| 长治市| 玉树县| 读书| 桦南县| 六安市| 双柏县| 翁牛特旗| 曲阜市| 五指山市| 深水埗区| 泰州市| 越西县| 仁寿县| 吴旗县| 抚远县| 利津县| 张家界市| 肃南| 石嘴山市| 陇西县|