新聞中心
本篇內(nèi)容主要講解“什么是swoft2進(jìn)程”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“什么是swoft2進(jìn)程”吧!
為章貢等地區(qū)用戶(hù)提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及章貢網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站建設(shè)、網(wǎng)站制作、章貢網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專(zhuān)業(yè)、用心的態(tài)度為用戶(hù)提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶(hù)的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
基本功能介紹
swoft2 自定義用戶(hù)進(jìn)程來(lái)定期執(zhí)行用戶(hù)自定義任務(wù)
swoft2 支持進(jìn)程池解決多進(jìn)程并發(fā)執(zhí)行用戶(hù)自定義任務(wù)
進(jìn)程和線程的介紹 https://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
多進(jìn)程程序設(shè)計(jì)能解決很多有意義的問(wèn)題,程序的主進(jìn)程運(yùn)行核心任務(wù),一些輔助進(jìn)程解決一些例如消息隊(duì)列的處理,后臺(tái)定期執(zhí)行的任務(wù)處理,文件監(jiān)控,定期日志上報(bào)等相關(guān)功能.每個(gè)進(jìn)程都有獨(dú)立的上下文,進(jìn)程之間互不干擾.
功能的相關(guān)配置選項(xiàng)
用戶(hù)進(jìn)程的配置一般需要在 bean.php 里注冊(cè),系統(tǒng)會(huì)自動(dòng)加載用戶(hù)配置的自定義進(jìn)程
進(jìn)程池的配置也需要在 bean.php 配置進(jìn)程池配置項(xiàng),但進(jìn)程池不會(huì)自動(dòng)加載,需要手動(dòng)執(zhí)行命令來(lái)啟動(dòng)用戶(hù)進(jìn)程
用戶(hù)進(jìn)程配置簡(jiǎn)單示例
修改 bean.php
'httpServer' => [ 'class' => HttpServer::class, 'port' => 18306, 'listener' => [ 'rpc' => bean('rpcServer') ], 'process' => [ 'crontab' => bean(CrontabProcess::class) 'log' => bean(\App\Process\LogProcess::class) ], ],
上面的配置是 WEB服務(wù)器 的應(yīng)用配置 如果是 WebSocket服務(wù)器 寫(xiě)在wsServer配置項(xiàng)里,定義 process 屬性就好.
注意process的值是一維數(shù)組,其中key你可以自己定義,只要合法且不重復(fù)即可,值則為你定義的進(jìn)程類(lèi),請(qǐng)用工廠函數(shù) bean 加載.
進(jìn)程池的配置簡(jiǎn)單示例
修改 bean.php
'processPool' => [ 'class' => \Swoft\Process\ProcessPool::class, 'workerNum' => 12 ]
上面的配置定了進(jìn)程池,且分配了12個(gè)可用工作進(jìn)程,實(shí)際生產(chǎn)中根據(jù)你的項(xiàng)目需求自行修改配置項(xiàng).
進(jìn)程 workerid 的初始值是0,所以這里的 workerid 有效訪問(wèn)是0-11,請(qǐng)注意
簡(jiǎn)單的示例
用戶(hù)進(jìn)程代碼預(yù)覽
namespace App\Process; use Swoft\Bean\Annotation\Mapping\Bean; use Swoft\Log\Helper\CLog; use Swoole\Coroutine; use Throwable; use Swoft\Process\Process; use Swoft\Process\UserProcess; /** * Class LogProcess * * @since 2.0 * * @Bean() */ class LogProcess extends UserProcess { /** * @param Process $process * * @throws Throwable */ public function run(Process $process): void { $process->name('swoft-monitor'); //設(shè)置用戶(hù)進(jìn)程名 while (true) { CLog::info('用戶(hù)進(jìn)程,每隔3秒輸出一次');//需要處理的工作 Coroutine::sleep(3);//休眠3秒 } }
注意事項(xiàng)
自定義進(jìn)程類(lèi)需要打上 Bean 注解
用自定義進(jìn)程類(lèi)必須繼承 Swoft\Process\UserProcess
用戶(hù)自定義進(jìn)程類(lèi)的 run 方法是具體的任務(wù)執(zhí)行代碼
用戶(hù)進(jìn)程需要while循環(huán)來(lái)防止進(jìn)程執(zhí)行完畢后退出
休眠函數(shù)請(qǐng)使用 Coroutine::sleep(3) 參數(shù)根據(jù)項(xiàng)目實(shí)際情況配置,單位是秒.支持傳小數(shù),如果傳入?yún)?shù)0.5,則代表每 500ms 執(zhí)行一次
在run方法里不使用 while(true) 而使用 \Swoft\Timer::tick ,也是可以的,但tick更多的用于解決周期性任務(wù),該函數(shù)需要維護(hù)更多的調(diào)用棧,并且觸發(fā) swoft 的內(nèi)置事件,所以它更消耗性能,一般在執(zhí)行頻率要求不高的場(chǎng)景下使用,如果一些執(zhí)行頻率較高的任務(wù)推薦使用 while(true)
控制臺(tái)打印
進(jìn)程池代碼預(yù)覽
namespace App\Process; use Swoft\Log\Helper\CLog; use Swoft\Process\Annotation\Mapping\Process; use Swoft\Process\Contract\ProcessInterface; use Swoole\Coroutine; use Swoole\Process\Pool; use Throwable; /** * Class Worker2Process * * @since 2.0 * * @Process(workerId={0,1}) */ class Worker2Process implements ProcessInterface { /** * @param Pool $pool * @param int $workerId * * @throws Throwable */ public function run(Pool $pool, int $workerId): void { while (true) { CLog::info('worker-' . $workerId.' context='.context()->getWorkerId()); Coroutine::sleep(3); } } }
注意事項(xiàng)
進(jìn)程池進(jìn)程類(lèi)需要打上 Process 注解 且參數(shù)是 workerId 值為分配的進(jìn)程池work進(jìn)程的id數(shù)組.
進(jìn)程池進(jìn)程類(lèi)需要實(shí)現(xiàn) Swoft\Process\Contract\ProcessInterface 接口.
進(jìn)程池 Process 注解的 workerId 不是越多越好,需要根據(jù)你的需要設(shè)置,設(shè)置的越多占用的內(nèi)存越多.
每個(gè) workerid 只允許分配一次,如果分配多個(gè)系統(tǒng)會(huì)拋出異常.
workerid的取值范圍是 0 到 bean.php 配置的 workerNum-1 本文的例子是 0-11
啟動(dòng)說(shuō)明
前臺(tái)啟用進(jìn)程
php bin/swoft process:start
后臺(tái)啟動(dòng)進(jìn)程
php bin/swoft process:start -d
重啟所有 worker 進(jìn)程
php bin/swoft process:reload
重新啟動(dòng)
php bin/swoft process:restart
停止服務(wù)
php bin/swoft process:stop
控制臺(tái)打印
到此,相信大家對(duì)“什么是swoft2進(jìn)程”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!
本文題目:什么是swoft2進(jìn)程
網(wǎng)頁(yè)鏈接:http://www.ef60e0e.cn/article/pghgic.html