網(wǎng)站后臺(tái)管理系統(tǒng)php安裝擴(kuò)展下多線程擴(kuò)展的安裝步驟查看(組圖)php網(wǎng)站后臺(tái)訪問(wèn)統(tǒng)計(jì)分析
2022-09-28
需求管理今天碰到一個(gè)問(wèn)題網(wǎng)站開(kāi)發(fā),就是用戶反映,添加備注等接口響應(yīng)速度慢,6秒多,影響用戶體驗(yàn)。
查找原因,發(fā)現(xiàn)是因?yàn)榻涌诶镒詈笥邪l(fā)送郵件的操作,這個(gè)接口是同步的, 需要6秒左右返回。
請(qǐng)求里,有三個(gè)主要操作,都跟網(wǎng)絡(luò)環(huán)境息息相關(guān):
** 主要操作**
1
連接數(shù)據(jù)庫(kù),修改數(shù)據(jù);
2
請(qǐng)求日志接口,添加用戶日志;
3
調(diào)用郵件服務(wù)的接口發(fā)送郵件;
這個(gè)三個(gè)操作是串行的順序的執(zhí)行的,都執(zhí)行完才能返回,但是第三步耗時(shí)6秒,導(dǎo)致界面卡。這個(gè)郵件服務(wù)是別人的接口,需要他們?nèi)ヅ挪榘伞?/p>
要解決這個(gè)問(wèn)題網(wǎng)站后臺(tái)管理系統(tǒng)php,我這邊需要把接口改成異步的,首先想到的是用多線程,把第三步發(fā)送郵件的操作放到工作線程里,這樣當(dāng)前線程可以及時(shí)返回結(jié)果給客戶端,不能讓用戶等太長(zhǎng)時(shí)間,因?yàn)樗麄兪巧系邸?/p>
問(wèn)題來(lái)了,php自身不支持多線程,聽(tīng)說(shuō)有個(gè)擴(kuò)展-可以實(shí)現(xiàn),那就安裝吧。
的安裝
擴(kuò)展
下PHP多線程擴(kuò)展的安裝
擴(kuò)展安裝步驟
1.查看()
獲取PHP版本號(hào)及位數(shù)(x86表示32位網(wǎng)站后臺(tái)管理系統(tǒng)php,x64表示64位)、編譯器版本、PHP配置文件加載所在位置等。如下圖所示:
2.擴(kuò)展
下載地址:
3.在擴(kuò)展列表中找到對(duì)應(yīng)版本
4.-2.0.9-5.5-ts-vc11-x86.zip參數(shù)詳解
2.0.9代表的版本號(hào)
5.5代表php的版本號(hào)
ts表示php是線程安全版本
vc11表示php要 ( C++ 2012)編譯器編譯
x86則表示PHP版本是32位
5.解壓縮包
復(fù)制.dll到D:\\php\ext目錄下
復(fù)制.dll到D:\\php\目錄下
復(fù)制.dll到D:\\\bin目錄下
復(fù)制.dll到C:\\目錄下
7.重啟服務(wù)器
重啟服務(wù)器后,查看()就能看到擴(kuò)展就表示安裝成功網(wǎng)站開(kāi)發(fā),如下圖:
Note:
安裝時(shí)看好版本:
php5需要安裝 v2版,
php7可以安裝 v3
done-用官方例子測(cè)試
.php:
然后在項(xiàng)目里嘗試,把發(fā)送郵件的代碼放到子線程里,日志里也顯示調(diào)用成功了,但是就是沒(méi)收到郵件。費(fèi)解,懷疑是子線程里的操作沒(méi)完成, 主線程返回,php進(jìn)程退出了?導(dǎo)致郵件發(fā)送失???
但是,發(fā)送郵件的接口返回的是成功了,沒(méi)有什么錯(cuò)誤,而且,在接口最后,加上(10)也不行,很奇怪。
過(guò)程中,發(fā)現(xiàn)一個(gè)通過(guò)curl并發(fā)請(qǐng)求的開(kāi)源項(xiàng)目 ,但并不能解決我們的問(wèn)題。只能另想辦法。
最后,利用php的系統(tǒng)調(diào)用,開(kāi)啟新的進(jìn)程來(lái)實(shí)現(xiàn)。
php 提供了函數(shù),此函數(shù)的功能為初始化一個(gè)套接字連接到指定主機(jī),默認(rèn)情況下將以阻塞模式開(kāi)啟套接字連接。當(dāng)然你可以通過(guò)()將它轉(zhuǎn)換到非阻塞模式。
這是關(guān)鍵。所以,思路就是:開(kāi)啟一個(gè)非阻塞的套接字連接到本機(jī),本機(jī)收到之后作一些耗時(shí)處理。
現(xiàn)在要做的就是: 把第3步耗時(shí)的郵件發(fā)送操作放到其他進(jìn)程里執(zhí)行。
這個(gè)接口完成第2步后, 與服務(wù)器建立非阻塞的連接,通過(guò)http協(xié)議告訴服務(wù)器:幫忙發(fā)個(gè)郵件啊,東西都放這了,我還有事,先走了,拜拜 。
之后這個(gè)接口也就可以馬上給客戶端回復(fù)。
服務(wù)端另外一個(gè)接口收到發(fā)送郵件請(qǐng)求后,會(huì)異步的完成郵件發(fā)送。
廢話不多說(shuō),直接上代碼:
接口偽代碼:
發(fā)送郵件的代碼:
這樣就完成了異步操作。