1、安裝pcntl擴(kuò)展

[root@bogon downloads]# cd php-7.1.1/ext/pcntl[root@bogon pcntl]# php -i | grep configureConfigure Command => './configure' '" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁(yè) > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > PHP多進(jìn)程編程~(一)

PHP多進(jìn)程編程~(一)

時(shí)間:2023-05-26 16:57:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-05-26 16:57:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)

PHP多進(jìn)程編程~(一):

一、pcntl、shmop擴(kuò)展安裝




1、安裝pcntl擴(kuò)展

[root@bogon downloads]# cd php-7.1.1/ext/pcntl[root@bogon pcntl]# php -i | grep configureConfigure Command => './configure' '--prefix=/usr/local/php/' '--enable-mbstring' '--with-curl' '--with-gd' '--enable-fpm' '--enable-mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-config-file-path=/usr/local/php71/etc/' '--with-mysqli=mysqlnd'[root@bogon pcntl]# /usr/local/php/bin/phpize Configuring for:PHP Api Version: 20160303Zend Module Api No: 20160303Zend Extension Api No: 320160303[root@bogon pcntl]# ./configure --enable-pcntl --with-php-config=/usr/local/php/bin/php-config ......creating libtoolappending configuration tag "CXX" to libtoolconfigure: creating ./config.statusconfig.status: creating config.h[root@bogon pcntl]# make && make install......Build complete.Don't forget to run 'make test'.Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/#修改配置文件,添加pcntl擴(kuò)展[root@bogon pcntl]# vim /usr/local/php/etc/php.iniextension=pcntl.so


2、驗(yàn)證

[root@bogon pcntl]# php -m | grep pcntlpcntl※shmop安裝同pcntl




二、實(shí)驗(yàn)




0.1、觀察pcntl_fork的返回值

$pid = pcntl_fork();var_dump($pid);


[root@bogon multiprocess]# php test.php #會(huì)有兩個(gè)值返回int(55777)int(0)


0.2、觀察pid和$pid

$pid = pcntl_fork();switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; break; default: echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break;}


[root@bogon multiprocess]# php test.php I'm the parent process: 55806 and $pid=55807I'm the child process: 55807 and $pid=0





1.0、posix_getpid()初探

[root@bogon multiprocess]# vim test.php<?phpecho "Master process id: " . posix_getpid() . PHP_EOL;sleep(10);


[root@bogon multiprocess]# php test.php Master process id: 51688[root@bogon html]# ps -ef | grep test.phproot 51688 36864 0 02:00 pts/5 00:00:00 php test.php #可以看到進(jìn)程ID為51688


2.0、觀測(cè)

<?php$pid = pcntl_fork();switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process " . posix_getpid() . PHP_EOL; break; default: echo "I'm the parent process " . posix_getpid() . PHP_EOL; break;}sleep(100);


[root@bogon multiprocess]# php test.php I'm the parent process: 55715I'm the child process: 55716#為什么看上去程序中互斥的兩個(gè)分支都被執(zhí)行了,在一個(gè)程序的一次執(zhí)行中,這當(dāng)然是不可能的,事實(shí)上你看到的兩行輸出是來(lái)自兩個(gè)獨(dú)立的進(jìn)程,而這兩個(gè)進(jìn)程來(lái)自同一個(gè)程序的兩次執(zhí)行。[root@bogon html]# ps auxf | grep test.phproot 55715 0.0 1.1 222784 12128 pts/8 S+ 01:01 0:00 /_ php test.phproot 55716 0.0 0.5 222784 5444 pts/8 S+ 01:01 0:00 /_ php test.phpfork之后,操作系統(tǒng)會(huì)復(fù)制一個(gè)與父進(jìn)程完全相同的子進(jìn)程,雖說是父子關(guān)系,但是在操作系統(tǒng)看來(lái),他們更像兄弟關(guān)系,這2個(gè)進(jìn)程共享代碼空間, 但是數(shù)據(jù)空間是互相獨(dú)立的,子進(jìn)程數(shù)據(jù)空間中的內(nèi)容是父進(jìn)程的完整拷貝,指令指針也完全相同,但只有一點(diǎn)不同,如果fork成功,子進(jìn)程中fork的返回值是0, 父進(jìn)程中fork的返回值是子進(jìn)程的進(jìn)程號(hào),如果fork失敗,父進(jìn)程會(huì)返回錯(cuò)誤。 可以這樣想象,2個(gè)進(jìn)程一直同時(shí)運(yùn)行,而且步調(diào)一致,在fork之后,他們分別作不同的工作,也就是分岔了,這也是fork為什么叫fork的原因。 至于哪一個(gè)進(jìn)程最先運(yùn)行,這與操作系統(tǒng)平臺(tái)的調(diào)度算法有關(guān),而且這個(gè)問題在實(shí)際應(yīng)用中并不重要,如果需要父子進(jìn)程協(xié)同運(yùn)作,可以通過控制語(yǔ)法結(jié)構(gòu)的辦法解決。




3.0 exec和pcntl_exec的使用

#vim exe.php$pid = pcntl_fork();switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; //exec("sh /home/multiprocess/test.sh A B");//執(zhí)行完之后后面邏輯繼續(xù)執(zhí)行 pcntl_exec("/home/multiprocess/test.sh",["A","B"]);//執(zhí)行完之后,后面邏輯不再執(zhí)行 break; default: echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break;}


#vim test.sh#!/bin/bashecho $1 >> /home/multiprocess/test.logecho $2 >> /home/multiprocess/test.log


4.0封裝進(jìn)程監(jiān)控函數(shù)

#vim monitor.php<?php$child = [];function forkPro(){ global $child; echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; }}forkPro();sleep(10);


4.1 觀測(cè)

[root@bogon multiprocess]# php monitor.php Master process id: 60368I'm the parent process: 60368 and $pid=60369十秒鐘后,父進(jìn)程退出,子進(jìn)程繼續(xù)運(yùn)行...I'm the child process: 60369 and $pid=0......[root@bogon multiprocess]#


[root@bogon multiprocess]# ps auxf | grep monitor.phproot 60371 0.0 0.0 103324 844 pts/10 S+ 19:48 0:00 | /_ grep monitor.phproot 60369 0.0 0.5 222784 5388 pts/11 S 19:48 0:00 php monitor.php #子進(jìn)程還在繼續(xù)運(yùn)行


5.0創(chuàng)建多個(gè)子進(jìn)程




#vim monitor.php<?php$child = [];function forkPro(){ global $child; echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; }}//創(chuàng)建多個(gè)子進(jìn)程for($i = 0;$i < 5;$i++){ forkPro();}echo "十秒鐘后,父進(jìn)程退出,子進(jìn)程繼續(xù)運(yùn)行..." . PHP_EOL;sleep(10);


Master process id: 60586I'm the child process: 60587 and $pid=0I'm the parent process: 60586 and $pid=60587Master process id: 60586I'm the parent process: 60586 and $pid=60588Master process id: 60586I'm the parent process: 60586 and $pid=60589Master process id: 60586I'm the child process: 60588 and $pid=0I'm the child process: 60590 and $pid=0I'm the child process: 60589 and $pid=0I'm the parent process: 60586 and $pid=60590Master process id: 60586I'm the parent process: 60586 and $pid=60591十秒鐘后,父進(jìn)程退出,子進(jìn)程繼續(xù)運(yùn)行...I'm the child process: 60591 and $pid=0......[root@bogon multiprocess]#


[root@bogon multiprocess]# ps auxf | grep monitorroot 60607 0.0 0.0 103324 828 pts/10 S+ 22:32 0:00 | /_ grep monitorroot 60587 0.0 0.5 222784 5384 pts/11 S 22:28 0:00 php monitor.phproot 60588 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60589 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60590 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60591 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.php


5.1批量結(jié)束進(jìn)程

#可以看到命令“grep monitor”也被打印了出來(lái),不完美[root@bogon multiprocess]# ps auxf | grep monitorroot 60607 0.0 0.0 103324 828 pts/10 S+ 22:32 0:00 | /_ grep monitorroot 60587 0.0 0.5 222784 5384 pts/11 S 22:28 0:00 php monitor.phproot 60588 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60589 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60590 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60591 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.php


那么,可以這樣:

#使用“grep -v grep”就過濾了命令行[root@bogon multiprocess]# ps auxf | grep monitor | grep -v greproot 60587 0.0 0.5 222784 5384 pts/11 S 22:28 0:00 php monitor.phproot 60588 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60589 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60590 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.phproot 60591 0.0 0.5 222784 5380 pts/11 S 22:28 0:00 php monitor.php


接下來(lái),獲取所有的進(jìn)程ID:

[root@bogon multiprocess]# ps auxf | grep monitor | grep -v grep | awk '{print $2}'6058760588605896059060591


批量結(jié)束進(jìn)程

[root@bogon multiprocess]# ps auxf | grep monitor | grep -v grep | awk '{print $2}' | xargs kill -9


※參數(shù)詳解

|管道符,用來(lái)隔開兩個(gè)命令,管道符左邊命令的輸出會(huì)作為管道符右邊命令的輸入ps命令用來(lái)列出系統(tǒng)中當(dāng)前運(yùn)行的進(jìn)程, ps -ef顯示所有進(jìn)程信息,聯(lián)通命令行g(shù)rep命令用于過濾/搜索特定字符,grep monitor在這里為搜索過濾所有含有“monitor”名稱的進(jìn)程 grep -v 顯示不包含匹配文本的所有行,在這里為篩選出所有不包含grep名稱的進(jìn)程,對(duì)上一步的進(jìn)程再做一次篩選(因?yàn)閜s -ef列出了所有的命令,包括命令行) awk在文件或字符串中基于指定規(guī)則瀏覽和抽取信息。把文件逐行讀入,以空格為默認(rèn)分隔符將每行切片,然后再進(jìn)行后序處理。這里利用awk '{print $2}'將上一步中過濾得到的進(jìn)程進(jìn)行打印,$2表示打印第二個(gè)域(PID,進(jìn)程號(hào)) $0表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域。 xargs命令是給命令傳遞參數(shù)的過濾器,善于把標(biāo)準(zhǔn)數(shù)據(jù)數(shù)據(jù)轉(zhuǎn)換成命令行參數(shù)。在這里則是將獲取前一個(gè)命令的標(biāo)準(zhǔn)輸出然后轉(zhuǎn)換成命令行參數(shù)傳遞給后面的kill命令。


6.0 用pcntl_wait監(jiān)控子進(jìn)程狀態(tài)

<?php$child = [];function forkPro(){ global $child; //echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm a child process: " . posix_getpid() . ' and input $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; echo "I'm a parent process: " . posix_getpid() .' and input $pid='.$pid .PHP_EOL; break; }}for($i = 0;$i < 3;$i++){ forkPro();}while(count($child)){ if(($exit_id = pcntl_wait($status)) > 0){ echo "有子進(jìn)程退出,進(jìn)程ID是:" . $exit_id . PHP_EOL; }}echo "Done...";


子進(jìn)程退出:

[root@bogon multiprocess]# php monitor.php I'm a parent process: 60876 and input $pid=60877I'm a parent process: 60876 and input $pid=60878I'm a child process: 60877 and input $pid=0I'm a child process: 60878 and input $pid=0I'm a parent process: 60876 and input $pid=60879I'm a child process: 60879 and input $pid=0有子進(jìn)程退出,進(jìn)程ID是:60879 #當(dāng)kill -9 60879


7.0信號(hào)量

<?php$child = [];function forkPro(){ global $child; //echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; } } for($i = 0;$i < 3;$i++){ forkPro();}while(count($child)){ if(($exit_id = pcntl_wait($status)) > 0){ echo "有子進(jìn)程退出,進(jìn)程ID是:" . $exit_id . PHP_EOL; echo "被中斷的子進(jìn)程的信號(hào)值是:" . pcntl_wtermsig($status) . PHP_EOL; }}echo "done/n";


[root@bogon multiprocess]# php monitor.php I'm the parent process: 60933 and $pid=60934I'm the parent process: 60933 and $pid=60935I'm the parent process: 60933 and $pid=60936I'm the child process: 60934 and $pid=0I'm the child process: 60935 and $pid=0I'm the child process: 60936 and $pid=0有子進(jìn)程退出,進(jìn)程ID是:60936 #kill -9 60936被中斷的子進(jìn)程的信號(hào)值是:9 #會(huì)收到是什么操作導(dǎo)致了進(jìn)程退出





8.0 當(dāng)子進(jìn)程終止,自動(dòng)啟動(dòng)新的子進(jìn)程

#vim monitor.php<?php$child = [];function forkPro(){ global $child; //echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "I'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; } } for($i = 0;$i < 3;$i++){ forkPro();}while(count($child)){ if(($exit_id = pcntl_wait($status)) > 0){ echo "有子進(jìn)程退出,進(jìn)程ID是:" . $exit_id . PHP_EOL; echo "被中斷的子進(jìn)程的信號(hào)值是:" . pcntl_wtermsig($status) . PHP_EOL; unset($child[$exit_id]);//從子進(jìn)程集合中移除已經(jīng)退出的子進(jìn)程 } if(count($child) < 3){ //當(dāng)集合中的子進(jìn)程數(shù)量小于一定量時(shí),自動(dòng)fork新的子進(jìn)程 forkPro(); }}echo "done/n";


[root@bogon multiprocess]# php monitor.php I'm the parent process: 61076 and $pid=61077I'm the parent process: 61076 and $pid=61078I'm the parent process: 61076 and $pid=61079I'm the child process: 61077 and $pid=0I'm the child process: 61078 and $pid=0I'm the child process: 61079 and $pid=0有子進(jìn)程退出,進(jìn)程ID是:61079被中斷的子進(jìn)程的信號(hào)值是:9I'm the parent process: 61076 and $pid=61084I'm the child process: 61084 and $pid=0


[root@bogon multiprocess]# ps auxf | grep monitor | grep -v grep | grep -v vimroot 61076 0.0 1.2 222784 12224 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61077 0.0 0.5 222784 5468 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61078 0.0 0.5 222784 5384 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61079 0.0 0.5 222784 5384 pts/9 S+ 02:04 0:00 | /_ php monitor.php[root@bogon multiprocess]# kill -9 61079 #觀察進(jìn)程終止前后的變化[root@bogon multiprocess]# ps auxf | grep monitor | grep -v grep | grep -v vimroot 61076 0.0 1.2 222784 12232 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61077 0.0 0.5 222784 5468 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61078 0.0 0.5 222784 5384 pts/9 S+ 02:04 0:00 | /_ php monitor.phproot 61084 0.0 0.5 222784 5384 pts/9 S+ 02:05 0:00 | /_ php monitor.php #自動(dòng)啟動(dòng)的新進(jìn)程※That's all,就已經(jīng)完成了對(duì)子進(jìn)程的監(jiān)控和自動(dòng)重啟




9.0 守護(hù)進(jìn)程化




#vim daemon.php<?phpfunction daemon(){ global $child; //1.1 創(chuàng)建子進(jìn)程 $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: //child //2、設(shè)置sid if(($sid = posix_setsid()) <= 0){ die("Set sid failed!/n"); } //3、改變目錄 if(chdir('/') === false){ die("Change directory failed!/n"); } //4、更改為寬松掩碼 umask(0); //5、關(guān)閉標(biāo)準(zhǔn)I/O fclose(STDIN); //fclose(STDOUT); //fclose(STDERR); break; default: //parent exit; break; }}daemon();$child = [];function forkPro(){ global $child; //echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "/nI'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; //echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; }}for($i = 0;$i < 3;$i++){ forkPro();}while(count($child)){ if(($exit_id = pcntl_wait($status)) > 0){ echo "有子進(jìn)程退出,進(jìn)程ID是:" . $exit_id . PHP_EOL; echo "被中斷的子進(jìn)程的信號(hào)值是:" . pcntl_wtermsig($status) . PHP_EOL; unset($child[$exit_id]);//從子進(jìn)程集合中移除已經(jīng)退出的子進(jìn)程 } if(count($child) < 3){ //當(dāng)集合中的子進(jìn)程數(shù)量小于一定量時(shí),自動(dòng)fork新的子進(jìn)程 forkPro(); }}echo "done/n";


啟動(dòng)腳本

[root@bogon multiprocess]# php daemon.phpI'm the child process: 62746 and $pid=0I'm the child process: 62745 and $pid=0I'm the child process: 62747 and $pid=0


查看進(jìn)程

[root@bogon multiprocess]# ps auxf | grep daemon.php | grep -v grep | grep -v vimroot 62744 0.1 0.5 222780 5584 ? Ss 22:35 0:00 php daemon.phproot 62745 0.1 0.5 222780 5468 ? S 22:35 0:00 /_ php daemon.phproot 62746 0.0 0.5 222780 5468 ? S 22:35 0:00 /_ php daemon.phproot 62747 0.1 0.5 222780 5468 ? S 22:35 0:00 /_ php daemon.php


模擬進(jìn)程退出的情況

[root@bogon multiprocess]# kill 62746 62747[root@bogon multiprocess]# ps auxf | grep daemon.php | grep -v grep | grep -v vimroot 62744 0.0 0.5 222780 5712 ? Ss 22:35 0:00 php daemon.phproot 62745 0.0 0.5 222780 5468 ? S 22:35 0:00 /_ php daemon.phproot 62752 0.0 0.5 222780 5400 ? S 22:38 0:00 /_ php daemon.phproot 62753 0.0 0.5 222780 5400 ? S 22:38 0:00 /_ php daemon.php.........................................................[root@bogon multiprocess]# 有子進(jìn)程退出,進(jìn)程ID是:62746被中斷的子進(jìn)程的信號(hào)值是:15有子進(jìn)程退出,進(jìn)程ID是:62747被中斷的子進(jìn)程的信號(hào)值是:15I'm the child process: 62753 and $pid=0 #自動(dòng)重啟了進(jìn)程I'm the child process: 62752 and $pid=0 #自動(dòng)重啟了進(jìn)程


觀測(cè)

#退出終端,重新連接后發(fā)現(xiàn)進(jìn)程依然存在[root@bogon multiprocess]# ps auxf | grep daemon.php root 62812 0.0 0.0 103324 844 pts/3 S+ 22:52 0:00 /_ grep daemon.phproot 62744 0.0 0.5 222780 5712 ? Ss 22:35 0:00 php daemon.phproot 62745 0.0 0.5 222780 5468 ? S 22:35 0:00 /_ php daemon.phproot 62752 0.0 0.5 222780 5400 ? S 22:38 0:00 /_ php daemon.phproot 62753 0.0 0.5 222780 5400 ? S 22:38 0:00 /_ php daemon.php


※進(jìn)程信號(hào)

[root@bogon multiprocess]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX


※查詢某個(gè)父進(jìn)程的子進(jìn)程

[root@bogon multiprocess]# ps auxf | grep daemon.phproot 62993 0.0 0.0 103324 840 pts/5 S+ 00:34 0:00 /_ grep daemon.phproot 62744 0.0 0.5 222780 5712 ? Ss Dec26 0:00 php daemon.phproot 62745 0.0 0.5 222780 5468 ? S Dec26 0:00 /_ php daemon.phproot 62752 0.0 0.5 222780 5400 ? S Dec26 0:00 /_ php daemon.phproot 62753 0.0 0.5 222780 5400 ? S Dec26 0:00 /_ php daemon.php[root@bogon multiprocess]# ps --ppid 62744 # PID TTY TIME CMD62745 ? 00:00:00 php62752 ? 00:00:00 php62753 ? 00:00:00 php[root@bogon multiprocess]# ps --ppid 62744 | awk '/[0-9]/{print $1}'627456275262753


10.0 自定義命令控制




10.1 start

#vim signal.php<?phpfunction daemon(){ global $child; //1.1 創(chuàng)建子進(jìn)程 $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: //child //2、設(shè)置sid if(($sid = posix_setsid()) <= 0){ die("Set sid failed!/n"); } //3、改變目錄 if(chdir('/') === false){ die("Change directory failed!/n"); } //4、更改為寬松掩碼 umask(0); //5、關(guān)閉標(biāo)準(zhǔn)I/O fclose(STDIN); //fclose(STDOUT); //fclose(STDERR); break; default: //parent exit; break; }}$sign = $_SERVER['argv'][1];switch($sign){ case 'start': if(file_exists('/tmp/masterPid')){ die("MasterPid already running!"); } break; case 'stop': $masterPid = file_get_contents('/tmp/masterPid'); exec("ps --ppid {$masterPid} | awk '/[0-9]/{print $1}'",$output,$status); if($status == 0){ print_r($output); } break; case 'reload': break; default: die("Please enter commond.../n"); break;}daemon();$child = [];$masterPid = posix_getpid();file_put_contents('/tmp/masterPid',$masterPid);//存放主進(jìn)程IDfunction forkPro(){ global $child; //echo "Master process id: " . posix_getpid() . PHP_EOL; $pid = pcntl_fork(); switch($pid){ case -1: exit("Fork failed"); break; case 0: echo "/nI'm the child process: " . posix_getpid() . ' and $pid='.$pid.PHP_EOL; while(true) { sleep(3); } break; default: $child[$pid] = $pid; //echo "I'm the parent process: " . posix_getpid() .' and $pid='.$pid .PHP_EOL; break; }}for($i = 0;$i < 3;$i++){ forkPro();}while(count($child)){ if(($exit_id = pcntl_wait($status)) > 0){ echo "有子進(jìn)程退出,進(jìn)程ID是:" . $exit_id . PHP_EOL; echo "被中斷的子進(jìn)程的信號(hào)值是:" . pcntl_wtermsig($status) . PHP_EOL; unset($child[$exit_id]);//從子進(jìn)程集合中移除已經(jīng)退出的子進(jìn)程 } if(count($child) < 3){ //當(dāng)集合中的子進(jìn)程數(shù)量小于一定量時(shí),自動(dòng)fork新的子進(jìn)程 forkPro(); }}echo "done/n";


使用start啟動(dòng)腳本

[root@bogon multiprocess]# php signal.php startI'm the child process: 64374 and $pid=0I'm the child process: 64375 and $pid=0I'm the child process: 64376 and $pid=0[root@bogon multiprocess]# ps auxf | grep signal.php | grep -v grep | grep -v vim root 64373 0.0 0.5 222780 5748 ? Ss 19:32 0:00 php signal.php startroot 64374 0.0 0.5 222780 5432 ? S 19:32 0:00 /_ php signal.php startroot 64375 0.0 0.5 222780 5432 ? S 19:32 0:00 /_ php signal.php startroot 64376 0.0 0.5 222780 5432 ? S 19:32 0:00 /_ php signal.php start[root@bogon tmp]# cat masterPid 64373

關(guān)鍵詞:進(jìn)程

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉