摘要:子進程得到的為所以這里是子進程執(zhí)行的邏輯。最后再次附上項目地址歡迎
大多數(shù)人都說php是單進程執(zhí)行的,其實這是不準(zhǔn)確的,在cli模式下php是可以做到多進程的;不過需要pcntl的擴展;
$pid = pcntl_fork(); //父進程和子進程都會執(zhí)行下面代碼 if ($pid == -1) { //錯誤處理:創(chuàng)建子進程失敗時返回-1. die("could not fork"); } else if ($pid) { //父進程會得到子進程號,所以這里是父進程執(zhí)行的邏輯 pcntl_wait($status); //等待子進程中斷,防止子進程成為僵尸進程。 } else { //子進程得到的$pid為0, 所以這里是子進程執(zhí)行的邏輯。 }
上面的代碼摘自php官方手冊,熟悉C語言的同學(xué)可能很吃驚,簡直跟c的api是一毛一樣的;確實是這樣,一樣直白,一樣沒有包裝;現(xiàn)在這種問題得到解決了;先附上鏈接https://github.com/slince/process
通過composer安裝composer require slince/process基本用法
//創(chuàng)建子進程 $process = new SlinceProcessProcess(function(){ echo "hello, my pid is " . getmypid(); }); $process->start(); //程序執(zhí)行到此處發(fā)生分裂,下面的代碼在父進程執(zhí)行,上面閉包的代碼在子進程執(zhí)行 var_dump($process->isRunning()); // 子進程是否還在執(zhí)行 var_dump($process->getPid()); // 獲取子進程id //其他業(yè)務(wù)邏輯 $process->wait(); //等待子進程執(zhí)行完畢,此過程會發(fā)生阻塞;不要忘了此步驟
注冊新號處理器,以及觸發(fā)新號
$process = ... $process->getSignalHandler()->register([SIGUSR1, SIGUSR2], function(){ echo "trigger signal"; }); $process->start(); $process->signal(SIGUSER1); //給子進程發(fā)信號 $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擴展在window上是不可用的,所以本庫并不能在window上使用;如果有需求的化建議使用symfony/process但需要注意的是該庫只能實現(xiàn)進程間調(diào)用,也就是說你必須先創(chuàng)建一個腳本命令再調(diào)用該命令,與pcntl擴展實現(xiàn)的并不是同一個東西。
最后再次附上項目地址https://github.com/slince/process 歡迎star
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25690.html
摘要:在版本中我們將的進程管理模塊封裝成了類,現(xiàn)在可以在代碼中使用的進程管理器了。提供的進程管理器來自于,經(jīng)過大量生產(chǎn)項目驗證,穩(wěn)定性和健壯性都非常高。三任務(wù)投遞進程管理器自帶了消息隊列和消息投遞的支持。 在Swoole-2.1.2版本中我們將Server的進程管理模塊封裝成了PHP類,現(xiàn)在可以在PHP代碼中使用Swoole的進程管理器了。 在實際項目中經(jīng)常需要寫一些長期運行的腳本,如基于r...
摘要:提供了一個擴展,基于的進程,系統(tǒng)暫時沒有這個擴展,用于實現(xiàn)基礎(chǔ)的多進程實現(xiàn),可以利用這個處理一個很耗時的任務(wù),例如發(fā)訂閱郵件,短信,站內(nèi)信等。如果父進程不關(guān)心子進程什么時候結(jié)束子進程結(jié)束后,內(nèi)核會回收。 PHP提供了一個Pcntl擴展,Pcntl基于Linux的進程,Windows系統(tǒng)暫時沒有這個擴展,用于實現(xiàn)基礎(chǔ)的多進程實現(xiàn),可以利用這個處理一個很耗時的任務(wù),例如發(fā)訂閱郵件,短信,站...
摘要:下文如無特殊聲明將使用進程同時表示進程線程。收到數(shù)據(jù)后服務(wù)器程序進行處理然后使用向客戶端發(fā)送響應(yīng)。現(xiàn)在各種高并發(fā)異步的服務(wù)器程序都是基于實現(xiàn)的,比如。 并發(fā) IO 問題一直是服務(wù)器端編程中的技術(shù)難題,從最早的同步阻塞直接 Fork 進程,到 Worker 進程池/線程池,到現(xiàn)在的異步IO、協(xié)程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細介...
摘要:職場多年下來,技術(shù)也算是逐漸地有些積累,但是更重要的是對自身有了更加合理的人生定位?;蛟S,人生的意義,就在于此處的感悟吧?;诘牟l(fā)處理封裝類。對語言底層擴展的的深度解讀和生產(chǎn)應(yīng)用。函數(shù)官網(wǎng)手冊中對的說明,更細化的需求可以研究深化。 個人聲明 作者:于立(wx/yulichenr) 敬告:聯(lián)系我,請注明來源和來意 本人開發(fā)有很多年了,但是很少整理分享,如今趁著清閑就為大家服務(wù)了,希...
摘要:消息隊列更常見的用途是主進程分配任務(wù),子進程消費執(zhí)行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
閱讀 1290·2021-11-24 09:39
閱讀 2632·2021-09-30 09:47
閱讀 1325·2021-09-22 15:15
閱讀 2410·2021-09-10 10:51
閱讀 1955·2019-08-30 15:55
閱讀 2977·2019-08-30 11:06
閱讀 896·2019-08-30 10:53
閱讀 830·2019-08-29 17:26