ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

PHP¶à½ø³ÌϵÁбÊ(ת)(Ò»)
2019-09-20 11:45:33 ¡¾´ó ÖРС¡¿ ä¯ÀÀ:108´Î
Tags£ºPHP ½ø³Ì ϵÁÐ

±¾ÏµÁÐÎÄÕ½«Ïò´ó¼Ò½²½âpcntl_*ϵÁк¯Êý£¬´Ó¶ø¸üÉîÈëµÄÀí½â½ø³ÌÏà¹Ø֪ʶ¡£

PCNTLÔÚPHPÖнø³Ì¿ØÖÆÖ§³ÖĬÈÏÊǹرյġ£ÄúÐèҪʹÓà --enable-pcntl ÅäÖÃÑ¡ÏîÖØбàÒëPHPµÄ CGI»òCLI°æ±¾ÒÔ´ò¿ª½ø³Ì¿ØÖÆÖ§³Ö¡£

Èç¹û×Ô´øµÄPHPûÓа²×°pcntlÀ©Õ¹£¬¿ÉÒÔÏÂÔØÏàͬ°æ±¾µÄÔ´Â룬½øÈëext/pcntlʹÓÃphpize±àÒë°²×°¡£

Note: ´ËÀ©Õ¹ÔÚ Windows ƽ̨Éϲ»¿ÉÓá£

pcntl_fork

int pcntl_fork ( void )

ÓÃÓÚ´´½¨×Ó½ø³Ì¡£³É¹¦Ê±£¬ÔÚ¸¸½ø³ÌÖ´ÐÐÏß³ÌÄÚ·µ»Ø²úÉúµÄ×Ó½ø³ÌµÄPID£¬ÔÚ×Ó½ø³ÌÖ´ÐÐÏß³ÌÄÚ·µ»Ø0¡£Ê§°Üʱ£¬ÔÚ¸¸½ø³ÌÉÏÏÂÎÄ·µ»Ø-1£¬²»»á´´½¨×Ó½ø³Ì£¬²¢ÇÒ»áÒý·¢Ò»¸öPHP´íÎó¡£

fork.php

<?php $pid = pcntl_fork(); if($pid == -1){ //´íÎó´¦Àí£º´´½¨×Ó½ø³Ìʧ°Üʱ·µ»Ø-1. die( 'could not fork' ); }elseif($pid){ //¸¸½ø³Ì»áµÃµ½×Ó½ø³ÌºÅ£¬ËùÒÔÕâÀïÊǸ¸½ø³ÌÖ´ÐеÄÂß¼­ $id = getmypid(); echo "Parent process,pid {$id}, child pid {$pid}\n"; }else{ //×Ó½ø³ÌµÃµ½µÄ$pidΪ0, ËùÒÔÕâÀïÊÇ×Ó½ø³ÌÖ´ÐеÄÂß¼­ $id = getmypid(); echo "Child process,pid {$id}\n"; sleep(10); }

ÃüÁîÐÐÔËÐУº

$ php fork.php Parent process,pid 98, child pid 99 Child process,pid 99

¸ÃÀýÀ︸½ø³Ì»¹Ã»ÓÐÀ´µÃ¼°µÈ×Ó½ø³ÌÔËÐÐÍê±Ï¾Í×Ô¶¯Í˳öÁË£¬×Ó½ø³ÌÓÉ init½ø³Ì½Ó¹Ü¡£Í¨¹ý ps -ef | grep php ¿´µ½×Ó½ø³Ì»¹ÔÚÔËÐУº

[root@9355490fe5da /]# ps -ef | grep php root 105 1 0 16:46 pts/0 00:00:00 php fork.php root 107 27 0 16:46 pts/1 00:00:00 grep php

×Ó½ø³Ì³ÉΪ¹ÂÁ¢½ø³Ì£¬ppid(¸¸½ø³Ìid)±ä³É1ÁË¡£Èç¹ûÔÚ¸¸½ø³ÌÀïÒ²¼Ó¸ösleep(5)£¬Äã»á¿´µ½×Ó½ø³Ìppid±¾À´ÊÇ´óÓÚ1µÄ£¬ºóÀ´¾Í±ä³É1ÁË¡£

×¢£ºÈç¹ûÊÇdocker»·¾³£¬¹ÂÁ¢½ø³ÌµÄppid¿ÉÄÜÊÇ0¡£

pcntl_wait

pcntl_wait()º¯ÊýÓÃÀ´Èø¸½ø³ÌµÈ´ý×Ó½ø³ÌÍ˳ö£¬Ä¬ÈÏÇé¿öÏ»á×èÈûÖ÷½ø³Ì¡£

×èÈûģʽ

½ô½Ó×ÅÉÏÃæµÄÀý×Ó£¬Èç¹ûÏëµÈ×Ó½ø³ÌÔËÐнáÊøºó¸¸½ø³ÌÔÙÍ˳ö£¬¸ÃÔõô°ì£¿ÄǾÍÓõ½pcntl_waitÁË¡£

int pcntl_wait ( int &$status [, int $options = 0 ] )

¸Ãº¯Êý×èÈûµ±Ç°½ø³Ì£¬Ö»µ½µ±Ç°½ø³ÌµÄÒ»¸ö×Ó½ø³ÌÍ˳ö»òÕßÊÕµ½Ò»¸ö½áÊøµ±Ç°½ø³ÌµÄÐźš£

ÎÒÃÇÐ޸ĴúÂ룺

<?php $pid = pcntl_fork(); if($pid == -1){ exit("fork fail"); }elseif($pid){ $id = getmypid(); echo "Parent process,pid {$id}, child pid {$pid}\n"; pcntl_wait($status); //pcntl_waitpid($pid, $status); }else{ $id = getmypid(); echo "Child process,pid {$id}\n"; sleep(10); }

´ËʱÔÙ´ÎÔËÐгÌÐò£¬¸¸½ø³Ì¾Í»áÒ»Ö±µÈ´ý×Ó½ø³ÌÔËÐнáÊøÈ»ºóÍ˳ö¡£

pcntl_waitpid()ºÍ pcntl_wait()¹¦ÄÜÏàͬ¡£Ç°ÕßµÚÒ»¸ö²ÎÊýÖ§³ÖÖ¸¶¨pid²ÎÊý£¬µ±Ö¸¶¨-1×÷Ϊ pidµÄÖµµÈͬÓÚºóÕß¡£
int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
µ±ÒÑÖª×Ó½ø³ÌpidµÄʱºò£¬¿ÉÒÔʹÓà pcntl_waitpid()¡£

ÕâÁ½¸öº¯Êý·µ»ØÍ˳öµÄ×Ó½ø³Ì½ø³ÌºÅ(>1)£¬·¢Éú´íÎóʱ·µ»Ø-1,Èç¹ûÌṩÁË WNOHANG ×÷Ϊoption£¨wait3¿ÉÓõÄϵͳ£©²¢ÇÒûÓпÉÓÃ×Ó½ø³Ìʱ·µ»Ø0¡£

·µ»ØֵΪÍ˳öµÄ×Ó½ø³Ì½ø³ÌºÅʱ£¬ÏëÁ˽âÈçºÎÍ˳ö£¬¿ÉÒÔͨ¹ý $status״̬Âë·´Ó¦¡£

·Ç×èÈûģʽ

pcntl_wait()ĬÈÏÇé¿öÏ»á×èÈûÖ÷½ø³Ì£¬Ö±µ½×Ó½ø³ÌÖ´ÐÐÍê±Ï²Å¼ÌÐøÍùÏÂÔËÐС£Èç¹ûÉèÖÃ×îºóÒ»¸ö²ÎÊýΪ³£Á¿WNOHANG£¬ÄÇô¾Í²»»á×èÈûÖ÷½ø³Ì£¬¶øÊǼÌÐøÖ´ÐкóÐø´úÂ룬 ´Ëʱ pcntl_waitpid ¾Í»á·µ»Ø0¡£

ʾÀý£º

<?php $pid = pcntl_fork(); if($pid == -1){ exit("fork fail"); }elseif($pid){ $id = getmypid(); echo "Parent process,pid {$id}, child pid {$pid}\n"; while(1){ $res = pcntl_wait($status, WNOHANG); //$res = pcntl_waitpid($pid, $status, WNOHANG); if ($res == -1 || $res > 0){ sleep(10);//´Ë´¦ÎªÁË·½±ã¿´Ð§¹û£¬Êµ¼Ê²»ÐèÒª break; } } }else{ $id = getmypid(); echo "Child process,pid {$id}\n"; sleep(2); }

¸ÃʾÀýÀïÖ»ÓÐÒ»¸ö×Ó½ø³Ì£¬¿´²»³öÀ´·Ç×èÈûµÄºÃ´¦£¬ÎÒÃÇÐÞ¸Äһϣº

<?php $child_pids = []; for($i=0;$i<3; $i++){ $pid = pcntl_fork(); if($pid == -1){ exit("fork fail"); }elseif($pid){ $child_pids[] = $pid; $id = getmypid(); echo time()." Parent process,pid {$id}, child pid {$pid}\n"; }else{ $id = getmypid(); $rand = rand(1,3); echo time()." Child process,pid {$id},sleep $rand\n"; sleep($rand); //#1 ¹ÊÒâÉèÖÃʱ¼ä²»Ò»Ñù exit();//#2 ×Ó½ø³ÌÐèÒªexit,·ÀÖ¹×Ó½ø³ÌÒ²½øÈëforÑ­»· } } while(count($child_pids)){ foreach ($child_pids as $key => $pid) { // $res = pcntl_wait($status, WNOHANG); $res = pcntl_waitpid($pid, $status, WNOHANG);//#3 if ($res == -1 || $res > 0){ echo time()." Child process exit,pid {$pid}\n"; unset($child_pids[$key]); }else{ // echo time()." Wa
Ê×Ò³ ÉÏÒ»Ò³ 1 2 ÏÂÒ»Ò³ βҳ 1/2/2
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
ÉÏһƪ£ºPHPÉú³ÉÓб³¾°µÄ¶þάÂëͼƬ ÏÂһƪ£º[PHP] ½üÆÚ½ÓÊÖ¬FÓеÄÆóÓÊÇ°¶Ë¿ò¼..

×îÐÂÎÄÕÂ

ÈÈÃÅÎÄÕÂ

Hot ÎÄÕÂ

Python

C ÓïÑÔ

C++»ù´¡

´óÊý¾Ý»ù´¡

linux±à³Ì»ù´¡

C/C++ÃæÊÔÌâÄ¿