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