導航:首頁 > 編程語言 > phppcntl多進程

phppcntl多進程

發布時間:2022-08-16 07:21:49

php中pcntl_fork是什麼意思,pcntl_fork創建子進程如何進行的

一、php中pcntl_fork函數概述

pcntl_fork()函數是php中用於創建子進程的一個函數,返回創建的子進程的pid。

該函數創建子進程具體fork的過程:

(1)調用該函數即創建一個子進程,創建成功父進程返回子進程的pid,子進程返回0;

(2)創建子進程實際上對父進程的一個拷貝,共享代碼空間,拷貝父進程的數據,也就是說父進程改變父進程的數據,子進程改變子進程


二、示例代碼分析

1.代碼示例:

<?php

$curr_pid=posix_getpid();//獲取當前的進程id

//將當前進程的id寫入文件中

echo'當前進程:'.$curr_pid.PHP_EOL;

//開始創建子進程

$son_pid=pcntl_fork();//返回子進程的id

//查看當前進程

echo'創建子進程之後當前的進程為:'.posix_getpid().PHP_EOL;

//創建了子進程之後

if($son_pid>0){

echo'子進程id:'.$son_pid.PHP_EOL;

}

2.以上代碼執行後結果為:

3.示例代碼分析:

(1)發現創建了子進程之後,系統會切換到子進程中,而子進程中的代碼是從含有pcntl_fork函數的那行執行的

(2)創建子進程之後,子進程的代碼段是拷貝pcntl_fork函數及之後的代碼段,之前的代碼段並不拷貝,但是具體的數據變數子進程仍然會拷貝

(3)可見,fork之後程序會分叉執行,即子進程執行


三、pcntl_fork的業務場景舉例

1.php的多進程中,常用pcntl_fork來實現並發,多用於一些簡單工具的實現。

2.例如監控工具,想要監控幾個不同指標的情形,可以使用主進程監控各指標的配置變化,然後對每個指標分別fork一個子進程來監控其具體的情形,當主進程發現指標的配置改變則kill掉之前的子進程重新創建子進程進行監控。

3.主進程進行業務分發操作,子進程進行具體的業務邏輯執行。(BY三人行慕課)

⑵ php 多線程計劃任務

做法1:利用隊隊,如redis. 將所要執行數據, 都壓入到隊列里. 然後, 多進程去取就行.

做法2: 可以看下swoole和利用swoole 來處理.

⑶ 想用PHP做Socket伺服器,不知道如何實現同時和多個不同客戶端數據交互

因為只有調用了accept客戶端才能連上,你如果accept下面接一個循環,那麼第二個用戶不是說能不能進這個循環,而是連不進……此時只有第一個用戶break出了循環,然後程序回頭再調用accept,第二個用戶才能連上。
用多進程來處理如何?因為accept一個客戶端以後,應該是馬上准備accept下一個客戶端才對,而不是處理完現在這個客戶端才accept下一個客戶端。
socket_accept以後,直接調用
pcntl_fork(),此時進程會分裂為兩個,其中一個的pnctl_fork返回值是0,另一個不是0。不是0的那個直接繼續調用socket_accept即可,是0的那個處理客戶端請求。
pnctl_fork不知道在windows下能不能用。
不過返回不是0的那個進程並不是這樣就完事了,還要調用pcntl_wait防止子進程卡在那邊沒有完全結束。你可以在主進程里時不時就調用這個,配上WNOHANG作為option參數防止沒有子進程需要wait的時候卡在那邊。
這都是linux下常用的處理手段。說實話本來我想讓你用多線程的,不過看了一圈不知道php里怎麼用線程,倒是找到了用進程的方式,所以就

⑷ 有辦法在windows下實現PHP的多進程編程

你先想清楚是否真的需要fork, signal, priority等pcntl的特性,如果其實你只是想要另外新開一個進程,也可以通過cli下面用exec執行額外的php進程來一定程度上模擬多進程

如果你確實需要fork等特性:

cygwin是Windows上的POSIX環境,你可以在上邊試試編譯php以及pcntl的擴展(不知道是否能走通)
上虛擬機吧

⑸ php pcntl擴展有什麼用

pcntl擴展為進程式控制制擴展,詳見PHP官方手冊
http://php.net/manual/zh/book.pcntl.php

⑹ php採集大數據的方案

1、建議你讀寫數據和下載圖片分開,各用不同的進程完成。
比如說,取數據用get-data.php,下載圖片用get-image.php。

2、多進程的話,php可以簡單的用pcntl_fork()。這樣可以並發多個子進程。
但是我不建議你用fork,我建議你安裝一個gearman worker。這樣你要並發幾個,就啟幾個worker,寫代碼簡單,根本不用在代碼里考慮thread啊,process等等。

3、綜上,解決方案這樣:
(1)安裝gearman worker。
(2)寫一個get-data.php,在crontab里設置它每5分鍾執行一次,只負責讀數據,然後把讀回來的數據一條一條的扔到 gearman worker的隊列里;
然後再寫一個處理數據的腳本作為worker,例如叫process-data.php,這個腳本常駐內存。它作為worker從geraman 隊列里讀出一條一條的數據,然後跟你的資料庫老數據比較,進行你的業務邏輯。如果你要10個並發,那就啟動10個process-data.php好了。處理完後,如果圖片地址有變動需要下載圖片,就把圖片地址扔到 gearman worker的另一個隊列里。
(3)再寫一個download-data.php,作為下載圖片的worker,同樣,你啟動10個20個並發隨便你。這個進程也常駐內存運行,從gearman worker的圖片數據隊列里取數據出來,下載圖片

4、常駐進程的話,就是在代碼里寫個while(true)死循環,讓它一直運行好了。如果怕內存泄露啥的,你可以每循環10萬次退出一下。然後在crontab里設置,每分鍾檢查一下進程有沒有啟動,比如說這樣啟動3個process-data worker進程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php >> /dev/null 2>&1'

不知道你明白了沒有

⑺ PHP支持多線程嗎

PHP語言本身是不支持多線程的。網上關於PHP模擬多線程的方法,都是利用了LINUX和APACHE等本身所具有的多線程能力。既然是模擬的,就不是真正的多線程,其實只是多進程。
1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum = 10; /// 進程總數
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的數據信息
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

也可以把需要多線程處理的部分交給java去處理,然後在PHP里調用。

<?php
system('java multiThread.java');
?>

⑻ php 多進程 有沒有必要加鎖

php多進程只有pcntl擴展了,
枷鎖問題,你是操作文件么,
如果多個進程同時操作一個文件的話,必須鎖定,這涉及的到文件數據異常的問題,
如果使用隊列,可以避免鎖的問題。

⑼ php多線程

以下都是轉載, 簡單說下, php是不支持多線程的。。。。

PHP語言本身是不支持多線程的. 總結了一下網上關於PHP模擬多線程的方法, 總的來說, 都是利用了PHP的好夥伴們本身所具有的多線程能力. PHP的好夥伴指的就是LINUX和APACHE啦, LAMP嘛.

另外, 既然是模擬的, 就不是真正的多線程. 其實只是多進程. 進程和線程是兩個不同的概念. 好了, 以下方法都是從網上找來的.

1. 利用LINUX操作系統

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然後寫一段SHELL代碼

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子進程(其實同樣是利用LINUX操作系統)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待進程結束
$intNum = 10; /// 進程總數
$pids = array(); /// 進程PID數組
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的數據信息
if(!$pids[$i]) {
// 子進程進程代碼段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子進程進程代碼段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多線程, APACHE可是支持的, 呵呵.

假設我們現在運行的是a.php這個文檔. 但是我在程式中又請求WEB伺服器運行另一個b.php

那麼這兩個文檔將是同時執行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

當然啦,也可以把需要多線程處理的部分交給JAVA去處理, 然後在PHP里調用, 哈哈.

<?php
system('java multiThread.java');
?>

⑽ php pcntl 僵屍進程怎麼產生的

一個進程在調用exit命令結束自己的生命的時候,其實它並沒有真正的被銷毀,而是留下一個稱為僵屍進程(Zombie)的數據結構(系統調用exit,它的作用是使進程退出,但也僅僅限於將一個正常的進程變成一個僵屍進程,並不能將其完全銷毀)。

閱讀全文

與phppcntl多進程相關的資料

熱點內容
周潤發黃百鳴電影 瀏覽:814
mfc列印pdf 瀏覽:521
大尺度網址 瀏覽:828
飛行中的偶遇電影 瀏覽:982
電影功夫夢演員表 瀏覽:904
128單片機中斷程序編寫 瀏覽:325
休傑克曼脖子上長蛋蛋的電影1002無標題 瀏覽:916
台灣真軍紅羊生日舞會 瀏覽:762
女主叫洛洛的補課小說 瀏覽:33
程序員溝通時笑死 瀏覽:389
易語言網路共享下載源碼 瀏覽:807
誰有那種電影你懂得 瀏覽:194
台灣男同性戀片 瀏覽:70
安卓應用包安裝程序怎麼清除數據 瀏覽:61
催眠合集txt下載 瀏覽:323
韓國車震大尺度電影有哪些 瀏覽:335
割乳酷刑電影 瀏覽:234
怎麼給電腦app分身 瀏覽:821
資治通鑒pdf中華書局 瀏覽:187
穿越民國種馬 瀏覽:628