PHP多程序系列筆記(三)

2022-02-01 00:46:34 字數 2493 閱讀 7249

本節講解幾個多程序的例項。

下面例子實現了簡單的多程序管理:

<?php 

$pids = ; //儲存子程序pid

$max_process = 3;//最大程序數

$pid = pcntl_fork();

if($pid <0)elseif($pid > 0)else

$id = getmypid();

echo time()." master process, pid \n";

for($i=0; $i<$max_process;$i++)

//master程序等待子程序退出,必須是死迴圈

while(1)}}

}}/**

* 建立worker程序

*/function start_worker_process()elseif($pid > 0)else. run $rand s\n";

while(1)

}}

下面我們使用多程序實現乙個tcp伺服器,支援:

<?php 

class tcpserverelseif($pid > 0) else

umask(0);

$id = getmypid();

echo time()." master process, pid \n";

//建立tcp server

$this->socket = stream_socket_server("tcp:", $errno, $errstr);

if(!$this->socket) exit("start server err: $errstr --- $errno");}}

public function run()

echo "waiting client...\n";

//master程序等待子程序退出,必須是死迴圈

while(1)}}

sleep(1);//讓出1s時間給cpu}}

/*** 建立worker程序,接受客戶端連線

*/private function start_worker_process()elseif($pid > 0)else

}private function acceptclient()

$pos = strpos($buffer, "\n"); //訊息結束符

if($pos === false)else

$recv = ''; //清空訊息,準備下一次接收}}

}}

function __destruct()

}$server = new tcpserver();

$server->onconnect = function($conn);

$server->onmessage = function($conn,$msg);

$server->onclose = function($conn);

$server->run();

執行:

$ php process_multi.server.php 

1528734803 master process, pid 9110

waiting client...

此時服務端已經變成守護程序了。新開終端,我們使用ps命令檢視程序:

$ ps -ef | grep php

yjc 9110 1 0 00:33 ? 00:00:00 php process_multi.server.php

yjc 9111 9110 0 00:33 ? 00:00:00 php process_multi.server.php

yjc 9112 9110 0 00:33 ? 00:00:00 php process_multi.server.php

yjc 9113 9110 0 00:33 ? 00:00:00 php process_multi.server.php

yjc 9134 8589 0 00:35 pts/1 00:00:00 grep php

可以看到4個程序:1個主程序,3個子程序。使用kill命令結束子程序,主程序會重新拉起乙個新的子程序。

然後我們使用telnet測試連線:

$ telnet 127.0.0.1 9201

trying 127.0.0.1...

connected to 127.0.0.1.

escape character is '^]'.

conn success

hello server!

received hello server!

quit

received quit

connection closed by foreign host.

PHP 多程序系列筆記(三)

本節講解幾個多程序的例項。下面例子實現了簡單的多程序管理 pids 儲存子程序pid max process 3 最大程序數 pid pcntl fork if pid 0 elseif pid 0 else id getmypid echo time master process,pid n fo...

PHP多程序 4 內部多程序

說的都是只相容unix 伺服器的多程序,下面來講講在window 和 unix 都相容的多程序 這裡是泛指,下面的curl實際上是通過io復用實現的 通過擴充套件實現多執行緒的典型例子是curl,curl 支援多執行緒的抓取網頁的功能。這部分過於抽象,所以,我先給出乙個curl並行抓取多個網頁內容的...

PHP多程序 四 內部多程序

上面乙個系列的教程 用 socket 和 pcntl 實現乙個多程序伺服器 一 php多程序程式設計 一 php多程序程式設計 二 管道通訊 php多程序程式設計 三 多程序抓取網頁的演示 說的都是只相容unix 伺服器的多程序,下面來講講在window 和 unix 都相容的多程序 這裡是泛指,下...