php伪多进程

今天的例子主要是在cli模式下

多进程就是把一个任务分成好多个任务来做,试想一下如果你要给1个用户发短信发短信的时间可能需要0.1秒,时间很短,但是如果是1W个用户呢,10W个呢?当然数量级上去了,时间肯定也就上去了,但是有没有方法尽量让时间短点呢?那么我们来想想多线程的事吧。这种应用其实应该也挺多的,比如邮件的分发、远程服务的调用、计算量的计算任务等等。

那么这样我们现在假定要给1W个用户发短信假定发一条短信需要1秒,那么理论上至少需要1W秒才能完成。短信成功与否也不一定。我们的目标是发送时间尽量短点。

<?php

$pid = pcntl_fork();
if ($pid == -1) {
  die('could not fork');
} else if ($pid) {
  // we are the parent

  echo "我是父进程\n";
  sleep(2);
  echo "父进程结束\n";
} else {
  echo "我是子进程!\n";
  sleep(5);
  echo "子进程结束\n";
  exit;
  // we are the child
}

先试试上面的代码对pcntl_fork有点了解注意这个函数只能在*nix下可以用,并且php需要支持pcntl扩展pcntl_pork

 

发短信的代码就是

<?php
$j=0;
//为什么要用循环呢,假如机器不够牛逼,开10000个进程说不定就挂了,
//所以这里只开了100个进程,最好不要太多
while($j<100){
  for($i=1;$i<100;$i++){
    $pid = pcntl_fork();

    if ($pid == -1) {
      die('could not fork');
    } else if ($pid) {
      //parent

    } else {

      send_sms($i);
      exit;
      // we are the child
    }
  }
  //这里是假定我知道子进程都结束差不多了可以派发新的进程了具体实现自己去研究研究,比如可以使用数据库
  sleep(1);
  $j++;
}
function send_sms($z){
  //模拟发短信 也可以是其他任务

  sleep(1);
  echo "第".$z."条短信完成!\n";
}

这样本来需要10000秒时间才能完成的任务就变成了100秒,我只是写了个大致的东西,大家可以根据自己的需求去实现不同的功能

本文固定链接: http://www.qaforcode.net/archives/598 | 猪哥每日一贴

该日志由 趴在树上的猪 于2012年12月26日发表在 php 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: php伪多进程 | 猪哥每日一贴
关键字: , ,
【上一篇】
【下一篇】

php伪多进程:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter

浙公网安备 33010602001905号