在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
分享提纲: 1. 概述 2.安装(只支持Linux) 3. 代码实验多进程pcntl_fork 4. 具体解释
1. 概述PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展,有时间在ubuntu下玩了下。
2. 安装(只支持Linux)2.1) 首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是 创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令 # mkdir php # cd php # apt-get source php5 # cd php5-(WHATEVER_RELEASE)/ext/pcntl # phpize # ./configure (注一) # make # make install
phpize 命令是用来准备 PHP 外挂模块的编译环境的。
成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。
3. 代码实验多进程 pcntl_fork
1 <?php 2 //测试php的多进程 3 4 while(1)//循环采用3个进程 5 {/*{{{*/ 6 //declare(ticks=1); 7 $bWaitFlag= FALSE; // 是否等待进程结束 8 //$bWaitFlag = TRUE; // 是否等待进程结束 9 $intNum= 3; // 进程总数 10 $pids= array(); // 进程PID数组 11 for($i= 0; $i<$intNum; $i++) 12 { 13 $pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息 14 /*if($pids[$i])//父进程 15 { 16 //echo $pids[$i]."parent"."$i -> " . time(). "\n"; 17 } 18 */ 19 if($pids[$i] == -1) 20 { 21 echo"couldn't fork". "\n"; 22 } 23 elseif(!$pids[$i]) 24 { 25 sleep(1); 26 echo"\n"."第".$i."个进程 -> ". time(). "\n"; 27 //$url=" 抓取页面的例子 28 //$content = file_get_contents($url); 29 //file_put_contents('message.txt',$content); 30 //echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n"; 31 exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程 32 } 33 if($bWaitFlag) 34 { 35 pcntl_waitpid($pids[$i], $status, WUNTRACED);echo"wait $i -> ". time() . "\n"; 36 } 37 } 38 sleep(1); 39 }/*}}}*/
保存为fork.php 在命令行运行 php fork.php 运行结果:
4. 具体解释pcntl函数还有一些功能没实验,例如进程状态,根据相应状态进行一些处理,运用多进程可以增加处理数据的效 率。在网上看到的fork的解释: fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但 是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值 是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。 ---------------------------------------------- fork前父进程的东西子进程可以继承,而在fork后子进程没有任何和父进程的继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的。可以完全看成两个进程。 ---------------------------------------------- 在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。 ---------------------------------------------- fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid。而且根据上面”corand”兄的提示,父子进程并行,打印语句的 先后完全看系统的调度算法。打印的内容控制则靠pid变量来控制。因为我们知道fork()向父进程返回了派生子进程的pid,是个正整数;而派生子进程 的pid变量并没有被改变。这一区别使得我们看到了他们的不同输出。 ---------------------------------------------- 1,派生子进程的进程,即父进程,其pid不变; PHP有个pcntl_fork的函数可以实现多进程,但要加载pcntl拓展,而且只有在linux下才能编译这个拓展,有时间在ubuntu下玩了下。
2. 安装(只支持Linux)2.1) 首先在ubuntu下编译pcntl.so,我的ubuntu下找不到pcntl的包,于是 创建一个文件夹下载了整个PHP包,在里面找到了pcntl包运行如下命令 # mkdir php # cd php # apt-get source php5 # cd php5-(WHATEVER_RELEASE)/ext/pcntl # phpize # ./configure (注一) # make # make install
phpize 命令是用来准备 PHP 外挂模块的编译环境的。
成功的安装将建立 extname.so 并放置于 PHP 的外挂模块目录中 (预设存放于 /usr/lib/php/modules/ 内) 。
3. 代码实验多进程 pcntl_fork
1 <?php 2 //测试php的多进程 3 4 while(1)//循环采用3个进程 5 {/*{{{*/ 6 //declare(ticks=1); 7 $bWaitFlag= FALSE; // 是否等待进程结束 8 //$bWaitFlag = TRUE; // 是否等待进程结束 9 $intNum= 3; // 进程总数 10 $pids= array(); // 进程PID数组 11 for($i= 0; $i<$intNum; $i++) 12 { 13 $pids[$i] = pcntl_fork();// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息 14 /*if($pids[$i])//父进程 15 { 16 //echo $pids[$i]."parent"."$i -> " . time(). "\n"; 17 } 18 */ 19 if($pids[$i] == -1) 20 { 21 echo"couldn't fork". "\n"; 22 } 23 elseif(!$pids[$i]) 24 { 25 sleep(1); 26 echo"\n"."第".$i."个进程 -> ". time(). "\n"; 27 //$url=" 抓取页面的例子 28 //$content = file_get_contents($url); 29 //file_put_contents('message.txt',$content); 30 //echo "\n"."第".$i."个进程 -> " ."抓取页面".$i."-> " . time()."\n"; 31 exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程 32 } 33 if($bWaitFlag) 34 { 35 pcntl_waitpid($pids[$i], $status, WUNTRACED);echo"wait $i -> ". time() . "\n"; 36 } 37 } 38 sleep(1); 39 }/*}}}*/
保存为fork.php 在命令行运行 php fork.php 运行结果:
4. 具体解释pcntl函数还有一些功能没实验,例如进程状态,根据相应状态进行一些处理,运用多进程可以增加处理数据的效 率。在网上看到的fork的解释: fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但 是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,但只有一点不同,如果fork成功,子进程中fork的返回值 是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。 ---------------------------------------------- fork前父进程的东西子进程可以继承,而在fork后子进程没有任何和父进程的继承关系了。在子进程里创建的东西是子进程的,在父进程创建的东西是父进程的。可以完全看成两个进程。 ---------------------------------------------- 在程序段里用了fork();之后程序出了分岔,派生出了两个进程。具体哪个先运行就看该系统的调度算法了。 ---------------------------------------------- fork()函数复制了当前进程的PCB,并向父进程返回了派生子进程的pid。而且根据上面”corand”兄的提示,父子进程并行,打印语句的 先后完全看系统的调度算法。打印的内容控制则靠pid变量来控制。因为我们知道fork()向父进程返回了派生子进程的pid,是个正整数;而派生子进程 的pid变量并没有被改变。这一区别使得我们看到了他们的不同输出。 ---------------------------------------------- 1,派生子进程的进程,即父进程,其pid不变; |
2022-08-15
2022-08-17
2022-11-06
2022-08-17
2022-07-18
请发表评论