我想咨詢一下,在web端,前端post了一個(gè)任務(wù)請求,
后端拿到請求后,通過workerman能新開一個(gè)進(jìn)程或者work
來執(zhí)行我一個(gè)比較耗時(shí)間的任務(wù)么?
然后當(dāng)前的主進(jìn)程去響應(yīng)前端,
任務(wù)結(jié)束后自主關(guān)閉或者交給系統(tǒng)回收,
因?yàn)榇藭r(shí)主進(jìn)程的http結(jié)束了。
有相關(guān)的代碼示例么?
而且我更想問的是,目前看到的是相當(dāng)于創(chuàng)建了一個(gè)服務(wù)器
所以是否有這個(gè)開啟新進(jìn)程的方法。
這個(gè)你可以一開始就運(yùn)行一個(gè)進(jìn)程在那,后端拿到請求后,通過內(nèi)部通訊,把信息發(fā)過去,那邊進(jìn)程收到消息后,根據(jù)消息判斷去執(zhí)行操作.我以前就是一直這樣操作的.
這個(gè)方法我明白適用于不同的服務(wù)之間解耦合,創(chuàng)建一個(gè)服務(wù)用來在線處理這種外部第三方之類的相關(guān)任務(wù),
但是我這里是內(nèi)部的耦合度有一點(diǎn)高。我在我的任務(wù)函數(shù)內(nèi),還會(huì)調(diào)用內(nèi)部的一些函數(shù),暫時(shí)無法做到外部共享之類的一些內(nèi)容
服務(wù)端
$worker = new Worker('Text://0.0.0.0:12345');
后臺發(fā)送任務(wù)的時(shí)候,發(fā)送了 函數(shù)名和參數(shù),但是實(shí)際執(zhí)行的任務(wù)需要用到的環(huán)境不同,這個(gè)怎么處理的啊
我想問問 這樣的形式,如果傳遞的參數(shù)和方法,在不同服務(wù)器之間沒辦法共享數(shù)據(jù)函數(shù)內(nèi)部資源
如附件圖中的execution在后臺發(fā)送處理任務(wù)
然后我想讓這個(gè)在后臺處理,然后快速響應(yīng)前臺內(nèi)容
但是如果開啟新的腳本做服務(wù)的話,不同文件數(shù)據(jù)方法,還有引入文件無法做到完全共享一些函數(shù)方法等的存在。。。
直接fork就行了。子進(jìn)程執(zhí)行你的任務(wù)。主進(jìn)程執(zhí)行:```php
ignore_user_abort();ob_flush();
我最后還是將耦合的部分拆分了,fork不行我試過在web端,fork linux進(jìn)程會(huì)和主進(jìn)程直接消失。但是我自己寫寫的腳本就沒問題,這應(yīng)該就是在web端的應(yīng)用吧問題吧,
ignore_user_abort(True) 有時(shí)候可行,有時(shí)候任務(wù)存在問題
花了漫長時(shí)間,重構(gòu)了項(xiàng)目,現(xiàn)在用接口形式,異步任務(wù)處理了,
workerman 作為服務(wù)端,然后通過 接口形式,做任務(wù)交互。這樣就不用特意在乎環(huán)境問題了
@8223: ignore_user_abort(True)不會(huì)有時(shí)有用有時(shí)沒用,你應(yīng)該沒設(shè)置超時(shí)時(shí)間設(shè)為永不超時(shí)。 你不是說需要調(diào)用原進(jìn)程的函數(shù)和一些變量嗎,用這個(gè)很合適
@6279:一些參數(shù)都設(shè)置過,例如超時(shí)時(shí)間、增加內(nèi)存、還有nginx緩存刷新,等等參數(shù)設(shè)置例如你說的這個(gè)set_time_limit(0),
但是存在一些問題,例如前端頁面直接空白,后端任務(wù)直接消失,進(jìn)程中斷之類的一些問題。
我還參考過在php-fpm中運(yùn)行的fastcgi_finish_request 在腳本的例子中有效,
但是在web端無效的情況,很多很多嘗試
ini_set("max_execution_time", "0"); 前端頁面直接空白,是因?yàn)槟銢]有用ob_flush() 把內(nèi)容推送給瀏覽器。
不需要fork,只要ob_flush() 把內(nèi)容推送給瀏覽器。然后接下來執(zhí)行你的任務(wù)就行了。
隊(duì)列不行么?
這個(gè)問題和參數(shù)之類的無關(guān),是和環(huán)境有點(diǎn)關(guān)系,因?yàn)閮?nèi)部代碼耦合度很高,隊(duì)列無法將一個(gè)個(gè)所有的當(dāng)前請求進(jìn)程緩存進(jìn)隊(duì)列,所以就會(huì)造成了這種情況,如論是redis還是rabbitmq中間件,除非是fork這樣開一個(gè)進(jìn)程,一樣的環(huán)境,不然比較困難,內(nèi)部的函數(shù)參數(shù),無法正確引用,會(huì)因?yàn)槁窂竭€有運(yùn)行的差異出現(xiàn)一些問題
所以我就拆分了項(xiàng)目重構(gòu)了一下