码迷,mamicode.com
首页 > Web开发 > 详细

PCNTL--PHP进程控制扩展学习笔记

时间:2015-04-19 19:41:58      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:服务器   异步   pnctl   

  PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。

  目前该扩展只能运行在*unix下,PCNTL现在使用了ticks作为信号处理的回调机制,ticks在速度上远远超过了之前的处理机制。 这个变化与“用户ticks”遵循了相同的语义。您可以使用declare() 语句在程序中指定允许发生回调的位置。这使得我们对异步事件处理的开销最小化。在编译PHP时 启用pcntl将始终承担这种开销,不论您的脚本中是否真正使用了pcntl。

  在学习PCNTL前,请确保PHP已经安装了该扩展:

[root@laiji ~]# php -m|grep pcntl
pcntl

  学习实例:

<?php
$pid=pcntl_fork();//在当前进程当前位置产生分支(子进程)
if($pid==-1){
  die(‘could not fork--lailaiji@163.com‘);//无法创建子进程
}elseif($pid){//当PID大于0时,进入父进程处理逻辑
  var_dump("parent");
  var_dump($status,‘status‘);
}else{//当PID等于0时,进入子进程处理逻辑
  for($i=0;$i<50;$i++){
    echo $i.‘-‘;
  }
  var_dump("child exit");
  exit();//最好加上这句,否则子进程还会往下走
}
//最后运行
echo "\n---------------\n";
for($j=0;$j<200;$j++){
  echo $j."+";
}

?>

  为什么会需要进行PID值的判断呢?是因为在pcntl_fork()运行之后,fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号,而子进程得到的是0。换句话说,就是产生子进程与父进程都会继续执行后面相同的代码,因此需要区别当前运行的进程属性。

  我们运行后发现,先会进来执行parent分支,但是对于哪个进程先结束却是依赖于LINUX系统的进程运行过程,你可以为进程设置优先级(pcntl_setpriority — 修改任意进程的优先级)。常常我们父进程需要依赖子进程都运行完成后才能结束,因此在父进程需要等待子进程,使用的PCNTL函数:pcntl_wait — 等待或返回fork的子进程状态。

  父进程依赖子进程完成的代码为:

<?php
$pid=pcntl_fork();
if($pid==-1){
  die(‘could not fork‘);
}elseif($pid){
  var_dump("parent");
  pcntl_wait($status);
  var_dump($status,‘status‘);
}else{
  #pcntl_alarm(3);
  sleep(15);
  var_dump(‘chlid‘);
  for($i=0;$i<50;$i++){
    echo $i.‘-‘;
  }
  var_dump("child exit");
  exit();
}
echo "\n---------------\n";
for($j=0;$j<200;$j++){
  echo $j."+";
}

?>

运行后,在父进程需要等待15秒后的子进程完成了,才会运行到最后一步。

本文出自 “快乐似水” 博客,请务必保留此出处http://lailaiji.blog.51cto.com/1790290/1635717

PCNTL--PHP进程控制扩展学习笔记

标签:服务器   异步   pnctl   

原文地址:http://lailaiji.blog.51cto.com/1790290/1635717

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!