摘要:提供了一個(gè)擴(kuò)展,基于的進(jìn)程,系統(tǒng)暫時(shí)沒(méi)有這個(gè)擴(kuò)展,用于實(shí)現(xiàn)基礎(chǔ)的多進(jìn)程實(shí)現(xiàn),可以利用這個(gè)處理一個(gè)很耗時(shí)的任務(wù),例如發(fā)訂閱郵件,短信,站內(nèi)信等。如果父進(jìn)程不關(guān)心子進(jìn)程什么時(shí)候結(jié)束子進(jìn)程結(jié)束后,內(nèi)核會(huì)回收。
PHP提供了一個(gè)Pcntl擴(kuò)展,Pcntl基于Linux的進(jìn)程,Windows系統(tǒng)暫時(shí)沒(méi)有這個(gè)擴(kuò)展,用于實(shí)現(xiàn)基礎(chǔ)的多進(jìn)程實(shí)現(xiàn),可以利用這個(gè)處理一個(gè)很耗時(shí)的任務(wù),例如發(fā)訂閱郵件,短信,站內(nèi)信等。
參考鏈接:
http://php.net/manual/zh/ref....
http://php.net/manual/zh/ref....
http://blog.csdn.net/huyanpin...
http://rango.swoole.com/archi...
https://www.lvtao.net/dev/php...
示例代碼:
代碼是基于Laravel 框架的,建議使用此框架來(lái)允許這部分代碼。
public function index(Request $request) { pcntl_signal(SIGCHLD, SIG_IGN); //如果父進(jìn)程不關(guān)心子進(jìn)程什么時(shí)候結(jié)束,子進(jìn)程結(jié)束后,內(nèi)核會(huì)回收。 $max = 8000; $workers = 10; $pids = array(); for($i = 0; $i < $workers; $i++){ $pids[$i] = pcntl_fork(); $pid = posix_getpid(); switch ($pids[$i]) { case -1: echo "fork error : {$i} "; exit; case 0: $param = array( "lastid" => $max / $workers * $i, "maxid" => $max / $workers * ($i+1), ); $this->doSomething($pid, $param); exit; default: break; } } foreach ($pids as $i => $pid) { if($pid) { //父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯 //如果不需要阻塞進(jìn)程,而又想得到子進(jìn)程的退出狀態(tài),則可以注釋掉pcntl_wait($status)語(yǔ)句,或?qū)懗桑? pcntl_wait($status,WNOHANG); //等待子進(jìn)程中斷,防止子進(jìn)程成為僵尸進(jìn)程。 //pcntl_waitpid($pid, $status); } } } // 可以看到那個(gè)子進(jìn)程在處理哪些數(shù)據(jù) public function doSomething($filename, $param) { for ($i = $param["lastid"]; $i < $param["maxid"]; $i++) { $path = "./test/"; if (!is_dir($path)){ mkdir($path, 0777, true); } $content = $i . "|"; $file = $path . $filename . ".txt"; file_put_contents($file, $content, FILE_APPEND); } }
更多建議讀文檔,進(jìn)程和線程,還有很多內(nèi)容的,需要讀書(shū)去學(xué)習(xí)了
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/30165.html
摘要:消息隊(duì)列更常見(jiàn)的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費(fèi)執(zhí)行。子進(jìn)程前面加了個(gè),這是為了防止父進(jìn)程還未往消息隊(duì)列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實(shí)現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來(lái)替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...
摘要:子進(jìn)程得到的為所以這里是子進(jìn)程執(zhí)行的邏輯。最后再次附上項(xiàng)目地址歡迎 大多數(shù)人都說(shuō)php是單進(jìn)程執(zhí)行的,其實(shí)這是不準(zhǔn)確的,在cli模式下php是可以做到多進(jìn)程的;不過(guò)需要pcntl的擴(kuò)展; $pid = pcntl_fork(); //父進(jìn)程和子進(jìn)程都會(huì)執(zhí)行下面代碼 if ($pid == -1) { //錯(cuò)誤處理:創(chuàng)建子進(jìn)程失敗時(shí)返回-1. die(could not...
摘要:輸出結(jié)果子進(jìn)程回收阻塞方式剛剛有么一般我習(xí)慣用加上命令來(lái)查找運(yùn)行著的后臺(tái)進(jìn)程。還有一種方法,既可以回收已經(jīng)結(jié)束的子進(jìn)程,又可以并行。但是這個(gè)時(shí)候,子進(jìn)程會(huì)被交給號(hào)進(jìn)程,號(hào)進(jìn)程成為了這些子進(jìn)程的繼父。 使用多進(jìn)程的優(yōu)點(diǎn): 1. 使用多進(jìn)程, 子進(jìn)程結(jié)束以后, 內(nèi)核會(huì)負(fù)責(zé)回收資源 2. 使用多進(jìn)程,子進(jìn)程異常退出不會(huì)導(dǎo)致整個(gè)進(jìn)程Thread退出. 父進(jìn)程還有機(jī)會(huì)重建流程. ...
摘要:職場(chǎng)多年下來(lái),技術(shù)也算是逐漸地有些積累,但是更重要的是對(duì)自身有了更加合理的人生定位?;蛟S,人生的意義,就在于此處的感悟吧。基于的并發(fā)處理封裝類。對(duì)語(yǔ)言底層擴(kuò)展的的深度解讀和生產(chǎn)應(yīng)用。函數(shù)官網(wǎng)手冊(cè)中對(duì)的說(shuō)明,更細(xì)化的需求可以研究深化。 個(gè)人聲明 作者:于立(wx/yulichenr) 敬告:聯(lián)系我,請(qǐng)注明來(lái)源和來(lái)意 本人開(kāi)發(fā)有很多年了,但是很少整理分享,如今趁著清閑就為大家服務(wù)了,希...
摘要:用于創(chuàng)建子進(jìn)程。該函數(shù)阻塞當(dāng)前進(jìn)程,只到當(dāng)前進(jìn)程的一個(gè)子進(jìn)程退出或者收到一個(gè)結(jié)束當(dāng)前進(jìn)程的信號(hào)。注意處需要注意子進(jìn)程需要防止子進(jìn)程也進(jìn)入循環(huán)。如果沒(méi)有,最終創(chuàng)建的子進(jìn)程不只個(gè)。 本系列文章將向大家講解pcntl_*系列函數(shù),從而更深入的理解進(jìn)程相關(guān)知識(shí)。 PCNTL在PHP中進(jìn)程控制支持默認(rèn)是關(guān)閉的。您需要使用 --enable-pcntl 配置選項(xiàng)重新編譯PHP的 CGI或CLI版本...
閱讀 1383·2021-11-16 11:44
閱讀 3908·2021-10-09 10:01
閱讀 1855·2021-09-24 10:31
閱讀 4159·2021-09-04 16:41
閱讀 2604·2021-08-09 13:45
閱讀 1321·2019-08-30 14:08
閱讀 1912·2019-08-29 18:32
閱讀 1720·2019-08-26 12:12