1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | <?php function convert( $size ) { $unit = array ( 'b' , 'kb' , 'mb' , 'gb' , 'tb' , 'pb' ); return @ round ( $size /pow(1024,( $i = floor (log( $size ,1024)))),2). $unit [ $i ]; } $childs = array (); for ( $i = 0; $i < 10; $i ++) { $pid = pcntl_fork(); if ( $pid == -1) die ( 'Could not fork' ); if ( $pid ) { //主进程执行 echo "parent \n" ; $childs [] = $pid ; } else { //子进程执行 for ( $i =1; $i <10; $i ++) { $pid = posix_getpid(); echo '当前进程' . $pid .PHP_EOL; echo '当前循环' . $i .PHP_EOL; echo '占用内存' .convert(memory_get_usage()) . PHP_EOL; sleep(1); } exit (); } } while ( count ( $childs ) > 0) { foreach ( $childs as $key => $pid ) { $res = pcntl_waitpid( $pid , $status , WNOHANG); if ( $res == -1 || $res > 0) unset( $childs [ $key ]); } sleep(1); } |
或:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | <?php function convert( $size ) { $unit = array ( 'b' , 'kb' , 'mb' , 'gb' , 'tb' , 'pb' ); return @ round ( $size /pow(1024,( $i = floor (log( $size ,1024)))),2). $unit [ $i ]; } //最大的子进程数量 $maxChildPro = 8; //当前的子进程数量 $curChildPro = 0; //当子进程退出时,会触发该函数 function sig_handler( $sig ) { global $curChildPro ; switch ( $sig ) { case SIGCHLD: //当前进程数减一,同时控制段会启动一新进程 $curChildPro --; break ; } } //配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量 declare (ticks=1); //注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。 pcntl_signal(SIGCHLD, "sig_handler" ); //整个任务控制 for ( $i = 1; $i <= 5; $i ++) //while(true) { $curChildPro ++; $pid = pcntl_fork(); if ( $pid ) //父进程运行代码 { if ( $curChildPro >= $maxChildPro ) { pcntl_wait( $status ); } } else //子进程运行代码 { //子进程多次循环使用再退出 for ( $i =1; $i <10; $i ++) { echo '当前进程' . $curChildPro .PHP_EOL; echo '当前循环' . $i .PHP_EOL; echo '占用内存' .convert(memory_get_usage()) . PHP_EOL; sleep(1); } exit ; } } //主进程等待所有子进程完成后再退出 while ( $curChildPro ) { pcntl_wait( $status ); //各信号控制冲突,造成负数循环 //$curChildPro--; } |
标签:php