摘要:子進(jìn)程得到的為所以這里是子進(jìn)程執(zhí)行的邏輯。最后再次附上項(xiàng)目地址歡迎
大多數(shù)人都說php是單進(jìn)程執(zhí)行的,其實(shí)這是不準(zhǔn)確的,在cli模式下php是可以做到多進(jìn)程的;不過需要pcntl的擴(kuò)展;
$pid = pcntl_fork(); //父進(jìn)程和子進(jìn)程都會(huì)執(zhí)行下面代碼 if ($pid == -1) { //錯(cuò)誤處理:創(chuàng)建子進(jìn)程失敗時(shí)返回-1. die("could not fork"); } else if ($pid) { //父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯 pcntl_wait($status); //等待子進(jìn)程中斷,防止子進(jìn)程成為僵尸進(jìn)程。 } else { //子進(jìn)程得到的$pid為0, 所以這里是子進(jìn)程執(zhí)行的邏輯。 }
上面的代碼摘自php官方手冊(cè),熟悉C語(yǔ)言的同學(xué)可能很吃驚,簡(jiǎn)直跟c的api是一毛一樣的;確實(shí)是這樣,一樣直白,一樣沒有包裝;現(xiàn)在這種問題得到解決了;先附上鏈接https://github.com/slince/process
通過composer安裝composer require slince/process基本用法
//創(chuàng)建子進(jìn)程 $process = new SlinceProcessProcess(function(){ echo "hello, my pid is " . getmypid(); }); $process->start(); //程序執(zhí)行到此處發(fā)生分裂,下面的代碼在父進(jìn)程執(zhí)行,上面閉包的代碼在子進(jìn)程執(zhí)行 var_dump($process->isRunning()); // 子進(jìn)程是否還在執(zhí)行 var_dump($process->getPid()); // 獲取子進(jìn)程id //其他業(yè)務(wù)邏輯 $process->wait(); //等待子進(jìn)程執(zhí)行完畢,此過程會(huì)發(fā)生阻塞;不要忘了此步驟
注冊(cè)新號(hào)處理器,以及觸發(fā)新號(hào)
$process = ... $process->getSignalHandler()->register([SIGUSR1, SIGUSR2], function(){ echo "trigger signal"; }); $process->start(); $process->signal(SIGUSER1); //給子進(jìn)程發(fā)信號(hào) $process->wait();
其它IPC包裝
Shared memory$memory = new SlinceProcessSystemVSharedMemory(); $memory->set("foo", "bar"); var_dump($memory->get("foo"));
The default size of shared memory is the sysvshm.init_mem in the php.ini, otherwise 10000 bytes. You can adjust this.
$memory = new SlinceProcessSystemVSharedMemory(__FILE__, "5M"); //Adjusts to 5mSemaphore
$semaphore = new SlinceProcessSystemVSemaphore(); $semaphore->acquire(); //Acquires a lock // do something $semaphore->release() //Releases a lockMessage queue
$queue = new SlinceProcessSystemVMessageQueue(); $queue->send("hello"); echo $queue->receive(); //Will output helloFifo
$writeFifo = new SlinceProcessPipeWritableFifo("/tmp/test.pipe"); $writeFifo->write("some message"); $readFifo = new SlinceProcessPipeReadableFifo("/tmp/test.pipe"); echo $readFifo->read();
Fifo works with half duplex mode. You can use DuplexFifo that will create two fifos.
$fifo = new SlinceProcessPipeDuplexFifo("/tmp/test.pipe"); $fifo->write("some message"); $fifo->read();
由于pcntl擴(kuò)展在window上是不可用的,所以本庫(kù)并不能在window上使用;如果有需求的化建議使用symfony/process但需要注意的是該庫(kù)只能實(shí)現(xiàn)進(jìn)程間調(diào)用,也就是說你必須先創(chuàng)建一個(gè)腳本命令再調(diào)用該命令,與pcntl擴(kuò)展實(shí)現(xiàn)的并不是同一個(gè)東西。
最后再次附上項(xiàng)目地址https://github.com/slince/process 歡迎star
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25690.html
摘要:在版本中我們將的進(jìn)程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進(jìn)程管理器了。提供的進(jìn)程管理器來(lái)自于,經(jīng)過大量生產(chǎn)項(xiàng)目驗(yàn)證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進(jìn)程管理器自帶了消息隊(duì)列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進(jìn)程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進(jìn)程管理器了。 在實(shí)際項(xiàng)目中經(jīng)常需要寫一些長(zhǎng)期運(yùn)行的腳本,如基于r...
摘要:提供了一個(gè)擴(kuò)展,基于的進(jìn)程,系統(tǒng)暫時(shí)沒有這個(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í)沒有這個(gè)擴(kuò)展,用于實(shí)現(xiàn)基礎(chǔ)的多進(jìn)程實(shí)現(xiàn),可以利用這個(gè)處理一個(gè)很耗時(shí)的任務(wù),例如發(fā)訂閱郵件,短信,站...
摘要:下文如無(wú)特殊聲明將使用進(jìn)程同時(shí)表示進(jìn)程線程。收到數(shù)據(jù)后服務(wù)器程序進(jìn)行處理然后使用向客戶端發(fā)送響應(yīng)。現(xiàn)在各種高并發(fā)異步的服務(wù)器程序都是基于實(shí)現(xiàn)的,比如。 并發(fā) IO 問題一直是服務(wù)器端編程中的技術(shù)難題,從最早的同步阻塞直接 Fork 進(jìn)程,到 Worker 進(jìn)程池/線程池,到現(xiàn)在的異步IO、協(xié)程。PHP 程序員因?yàn)橛袕?qiáng)大的 LAMP 框架,對(duì)這類底層方面的知識(shí)知之甚少,本文目的就是詳細(xì)介...
摘要:職場(chǎng)多年下來(lái),技術(shù)也算是逐漸地有些積累,但是更重要的是對(duì)自身有了更加合理的人生定位?;蛟S,人生的意義,就在于此處的感悟吧?;诘牟l(fā)處理封裝類。對(duì)語(yǔ)言底層擴(kuò)展的的深度解讀和生產(chǎn)應(yīng)用。函數(shù)官網(wǎng)手冊(cè)中對(duì)的說明,更細(xì)化的需求可以研究深化。 個(gè)人聲明 作者:于立(wx/yulichenr) 敬告:聯(lián)系我,請(qǐng)注明來(lái)源和來(lái)意 本人開發(fā)有很多年了,但是很少整理分享,如今趁著清閑就為大家服務(wù)了,希...
摘要:消息隊(duì)列更常見的用途是主進(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...
閱讀 1302·2021-11-24 09:39
閱讀 2679·2021-09-30 09:47
閱讀 1335·2021-09-22 15:15
閱讀 2424·2021-09-10 10:51
閱讀 1973·2019-08-30 15:55
閱讀 2984·2019-08-30 11:06
閱讀 905·2019-08-30 10:53
閱讀 845·2019-08-29 17:26