哆啦的時(shí)光機(jī)
2019-03-08 09:07:34
是這樣,我有一個(gè)PHP腳本,不斷地從隊(duì)列里取出任務(wù)予以處理,大致邏輯:<main.php>require do_job.php;while (true){$job = queue_pop(); // 取出一個(gè)任務(wù),阻塞調(diào)用do_job($job); // 這個(gè)函數(shù)來(lái)自 do_job.php}該腳本直接從命令行啟動(dòng):nohup php main.php &但是隨著業(yè)務(wù)的發(fā)展,我發(fā)現(xiàn)要處理的任務(wù)種類(lèi)越來(lái)越多,所以我需要不斷地修改 do_job() 函數(shù),以處理新類(lèi)型的任務(wù)或更改之前的邏輯;但是每次修改這個(gè)函數(shù),我都需要先 kill 掉之前的進(jìn)程,然后再次執(zhí)行上面的命令行,非常不方便。我想問(wèn),如何在不停止 main.php 進(jìn)程的條件下,更新 do_job.php ?如果可以的話(huà),盡量不要引入重量級(jí)的第三方框架。我知道有一種方案可行,就是每當(dāng)收到任務(wù)后,創(chuàng)建一個(gè)php子進(jìn)程,把任務(wù)通過(guò)某種進(jìn)程間通信機(jī)制傳給它來(lái)處理,就像Apache服務(wù)器。但是我覺(jué)得這種方案過(guò)于重量級(jí)了,因?yàn)槎鄶?shù)情況下 do_job()函數(shù)很簡(jiǎn)單,很快就能執(zhí)行完,專(zhuān)門(mén)為它創(chuàng)建一個(gè)進(jìn)程,有點(diǎn)“殺雞用牛刀”。謝謝!
2 回答

飲歌長(zhǎng)嘯
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
我們業(yè)務(wù)中也有類(lèi)似這樣的異步任務(wù)模塊,用于處理隊(duì)列、報(bào)表統(tǒng)計(jì)等等
crontab 任務(wù),每分鐘執(zhí)行一個(gè) crontab.sh 腳本,crontab.sh 腳本用于分發(fā) php 任務(wù),可自定義設(shè)置1分鐘、5分鐘、1小時(shí),根據(jù)需要分配粒度,這樣新增 php 任務(wù)不需要運(yùn)維幫忙新增 crontab 任務(wù)(需要申請(qǐng)運(yùn)維工單)
php 任務(wù)激活之后,執(zhí)行任務(wù)前:判斷是否存在任務(wù)、執(zhí)行任務(wù)進(jìn)程數(shù)是否超過(guò)規(guī)定數(shù)目、進(jìn)程是否觸發(fā)概率回收
執(zhí)行當(dāng)前任務(wù)
簡(jiǎn)單實(shí)用 while + nohup 方式, 使 php 腳本常駐,邏輯處理不當(dāng),容易導(dǎo)致內(nèi)存泄漏
- 2 回答
- 0 關(guān)注
- 452 瀏覽
添加回答
舉報(bào)
0/150
提交
取消