在做批量發(fā)郵件的操作,要獲取發(fā)送結(jié)果,所以需要等待請(qǐng)求結(jié)果。
php有沒(méi)有辦法異步請(qǐng)求接口,然后獲取數(shù)據(jù),再執(zhí)行回調(diào)函數(shù)?
現(xiàn)在是同步請(qǐng)求接口,然后等待,很慢。。而且執(zhí)行的時(shí)候服務(wù)器cpu會(huì)升高。。
求大神賜教
現(xiàn)在的重點(diǎn)是不想等待請(qǐng)求的返回,因?yàn)楹苈?,等有返回的時(shí)候直接調(diào)用某段代碼。。redis隊(duì)列什么的已經(jīng)在用了,也是腳本在執(zhí)行
php安裝多線程擴(kuò)展。自己擴(kuò)展即可達(dá)到,js也是單線程實(shí)現(xiàn)的。
可以嘗試使用reactphp
,workerman
,swoole
這些庫(kù)來(lái)執(zhí)行異步任務(wù)
強(qiáng)烈推薦你使用workerman,如果使用了fsockopen,這個(gè)只是講異步發(fā)出去了,但是并沒(méi)有返回回來(lái)!如果你要異步處理,就用workerman.當(dāng)然swoole也可以的,但是呢,這個(gè)有C語(yǔ)言的,一些報(bào)錯(cuò)信息是C的。你會(huì)C你也可以用這個(gè)。workerman入門(mén)特簡(jiǎn)單。具體的實(shí)現(xiàn)邏輯如下:
當(dāng)你需要異步的時(shí)候,你直接調(diào)用workerman,來(lái)執(zhí)行你的邏輯,這個(gè)workerman這里是同步執(zhí)行的,
workerman執(zhí)行邏輯過(guò)后,通過(guò)異步的方式來(lái)調(diào)用task任務(wù),這個(gè)是workerman的異步。workerman直接返回。
當(dāng)你的task任務(wù)搞定了過(guò)后,就講傳遞到workerman中,在由workerman來(lái)執(zhí)行你異步之后的邏輯。
給你一個(gè)備份里面有PHP異步通信的框架
github-php-awesome 翻譯過(guò)后的
1.把需要發(fā)送的信息存到Redis或者其他內(nèi)存緩存里面。
2.php提供一個(gè)需要訪問(wèn)密鑰token的接口,這個(gè)接口便是循環(huán)的讀取緩存redis里面得郵件數(shù)據(jù),去發(fā)送。
3.使用定時(shí)任務(wù)windows和linux均有方案,定時(shí)去http請(qǐng)求這個(gè)php接口,完成發(fā)送。也相當(dāng)于就是異步了。