婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > php多進(jìn)程應(yīng)用場(chǎng)景實(shí)例詳解

php多進(jìn)程應(yīng)用場(chǎng)景實(shí)例詳解

熱門(mén)標(biāo)簽:長(zhǎng)春人工外呼系統(tǒng)服務(wù)商 廣州防封卡外呼系統(tǒng)多少錢(qián)一個(gè)月 怎么向銷(xiāo)售公司推銷(xiāo)外呼系統(tǒng) 廣東地市地圖標(biāo)注 哪里辦理400電話 高德地圖標(biāo)注家 江西手機(jī)自動(dòng)外呼防封系統(tǒng)是什么 外呼系統(tǒng)撥打暫時(shí)無(wú)法接通 仁和怎么申請(qǐng)400開(kāi)頭的電話

本文實(shí)例講述了php多進(jìn)程應(yīng)用場(chǎng)景。分享給大家供大家參考,具體如下:

pcntl介紹

擴(kuò)展介紹

php多進(jìn)程模塊依賴(lài)pcntl擴(kuò)展,官方手冊(cè)介紹:http://php.net/manual/zh/book.pcntl.php

Note:

1. 此擴(kuò)展在 Windows 平臺(tái)上不可用。
2. 進(jìn)程控制不能被應(yīng)用在Web服務(wù)器環(huán)境,當(dāng)其被用于Web服務(wù)環(huán)境時(shí)可能會(huì)帶來(lái)意外的結(jié)果。因此,不能再PHP Web開(kāi)發(fā)中使用多進(jìn)程。

安裝擴(kuò)展

# 通過(guò)pecl安裝pcntl擴(kuò)展
sudo pecl install pcntl
# 增加 extension=pcntl.so
sodo vim /etc/php.ini
# 檢查擴(kuò)展是否安裝成功
php -m | grep pcntl

處理文件

當(dāng)一個(gè)文件包含許多任務(wù)(每個(gè)任務(wù)一行),并且各任務(wù)之間不存在執(zhí)行的先后順序關(guān)系,可以將文件進(jìn)行分割(分割后的文件數(shù)量與進(jìn)程數(shù)一致),然后使用多進(jìn)程進(jìn)行處理。

例如,現(xiàn)在有10個(gè)郵箱賬號(hào)存儲(chǔ)在文件mailist.txt中,每次發(fā)送郵件需要耗時(shí)2s,則采用單進(jìn)程依次發(fā)送完這些郵件需要耗時(shí)20。
如果采用多進(jìn)程,例如3個(gè)進(jìn)程進(jìn)行處理,首先需要將文件按行數(shù)拆分成3個(gè)小文件,其中兩個(gè)文件是4條記錄,一個(gè)文件是2條記錄。每個(gè)進(jìn)程處理一個(gè)小文件,則不同進(jìn)程發(fā)送完郵件的耗時(shí)為8、8、6,總耗時(shí)取最大值為8s。

拆分文件

原始文件 maillist.txt

000000@163.com
111111@163.com
222222@163.com
333333@163.com
444444@163.com
555555@163.com
666666@163.com
777777@163.com
888888@163.com
999999@163.com

拆分操作

split -a 1 -l 4 maillist.txt task

拆分后的文件

taska

000000@163.com
111111@163.com
222222@163.com
333333@163.com

taskb

444444@163.com
555555@163.com
666666@163.com
777777@163.com

taskc

888888@163.com
999999@163.com

相關(guān)腳本

多進(jìn)程調(diào)用腳本 text_task.php

$cmds = [
  ['/Users/zhezhao/www/work/text_mail.php','a'],
  ['/Users/zhezhao/www/work/text_mail.php','b'],
  ['/Users/zhezhao/www/work/text_mail.php','c']
];
foreach ($cmds as $cmd){
  $pid = pcntl_fork();
  if($pid == -1){
    exit('create process failed');
  }
  if($pid > 0){
    pcntl_wait($status,WNOHANG);
  }else{
    pcntl_exec('/usr/bin/php',$cmd);
  }
}

多進(jìn)程執(zhí)行腳本 text_mail.php

require 'MailWork.php';
$name = $argv[1];
echo $name." start #".time().PHP_EOL;
$worker = new MailWork($name);
$res = $worker->text_mail($argc,$argv);
if($res === false){
  echo $worker->getLastError();
}else{
  echo $name." ".$res." works done # ".time().PHP_EOL;
}

輸出結(jié)果

c start #1504499765
b start #1504499765
a start #1504499765
b#mailto:444444@163.com
c#mailto:888888@163.com
a#mailto:000000@163.com
b#mailto:555555@163.com
a#mailto:111111@163.com
c#mailto:999999@163.com
c 2 works done # 1504499769
a#mailto:222222@163.com
b#mailto:666666@163.com
b#mailto:777777@163.com
a#mailto:333333@163.com
b 4 works done # 1504499773
a 4 works done # 1504499773

在text_task.php中創(chuàng)建了3個(gè)進(jìn)程(a、b、c),其中a和b處理的文件中有4條記錄,c處理的文件中有2條記錄。

通過(guò)輸出結(jié)果可以得到:

1. a、b、c 三個(gè)進(jìn)程同時(shí)開(kāi)始執(zhí)行,開(kāi)始時(shí)間戳1504499765
2. c最先完成,完成時(shí)間戳1504499769,耗時(shí)4s
3. a和c同時(shí)完成,完成時(shí)間戳1504499773,耗時(shí)8s

處理消息隊(duì)列

這是另外一種常見(jiàn)的常見(jiàn),我們將耗時(shí)操作放入消息隊(duì)列,通過(guò)腳本從消息隊(duì)列中取出并執(zhí)行記錄。如果通過(guò)單個(gè)進(jìn)程依次讀取并處理消息,容易使隊(duì)列中積累大量數(shù)據(jù),導(dǎo)致操作的延遲時(shí)間較長(zhǎng),這種場(chǎng)景可以通過(guò)多個(gè)進(jìn)程來(lái)讀取并處理消息。redis中的pop操作具有原子性,不會(huì)存在多個(gè)讀取到相同的隊(duì)列消息的情況。

多進(jìn)程調(diào)用腳本 redis_task.php

$redis = new Redis();
$redis->connect('192.168.1.10');
$task_key = 'task_list';
$task_list = [
  '000000@163.com',
  '111111@163.com',
  '222222@163.com',
  '333333@163.com',
  '444444@163.com',
  '555555@163.com',
  '666666@163.com',
  '777777@163.com',
  '888888@163.com',
  '999999@163.com',
];
foreach ($task_list as $task){
  $redis->lPush($task_key,$task);
}
$cmds = [
  ['/Users/zhezhao/www/work/redis_mail.php','a'],
  ['/Users/zhezhao/www/work/redis_mail.php','b'],
  ['/Users/zhezhao/www/work/redis_mail.php','c']
];
foreach ($cmds as $cmd){
  $pid = pcntl_fork();
  if($pid == -1){
    exit('create process failed');
  }
  if($pid > 0){
    pcntl_wait($status,WNOHANG);
  }else{
    pcntl_exec('/usr/bin/php',$cmd);
  }
}

多進(jìn)程執(zhí)行腳本 redis_mail.php

require 'MailWork.php';
$name = $argv[1];
echo $name." start #".time().PHP_EOL;
$worker = new MailWork($name);
$redis = new Redis();
$redis->connect('192.168.1.10');
$task_key = 'task_list';
while($redis->lLen($task_key)>0){
  $mailto = $redis->rPop($task_key);
  $worker->redis_mail($mailto);
}
echo $name." work done # ".time().PHP_EOL;

輸出結(jié)果

b start #1504499844
c start #1504499844
a start #1504499844
b#mailto:000000@163.com
a#mailto:111111@163.com
c#mailto:222222@163.com
b#mailto:333333@163.com
a#mailto:444444@163.com
c#mailto:555555@163.com
b#mailto:666666@163.com
a#mailto:777777@163.com
c#mailto:888888@163.com
c work done # 1504499850
a work done # 1504499850
b#mailto:999999@163.com
b work done # 1504499852

通過(guò)輸出結(jié)果可以得到

1. a、b、c三個(gè)進(jìn)程同時(shí)開(kāi)始執(zhí)行,時(shí)間戳為1504499844
2. a和c同時(shí)結(jié)束執(zhí)行,分別處理了3條記錄,時(shí)間戳為1504499850,耗時(shí)6s
3. b最后結(jié)束執(zhí)行,處理了4條記錄,時(shí)間戳為1504499852,耗時(shí)8s

master-worker模式

我們模擬Web服務(wù)器處理http請(qǐng)求的操作,對(duì)于每個(gè)請(qǐng)求創(chuàng)建一個(gè)進(jìn)程,用于處理請(qǐng)求內(nèi)容。

class WebServer
{
  private $list;
  public function __construct()
  {
    $this->list = [];
  }
  public function worker($request){
    $pid = pcntl_fork();
    if($pid == -1){
      return false;
    }
    if($pid > 0){
      return $pid;
    }
    if($pid == 0){
      $time = $request[0];
      $method = $request[1];
      $start = time();
      echo getmypid()."\t start ".$method."\tat".$start.PHP_EOL;
      sleep($time);
      $end = time();
      $cost = $end-$start;
      echo getmypid()."\t stop \t".$method."\tat:".$end."\tcost:".$cost.PHP_EOL;
      exit(0);
    }
  }
  public function master($requests){
    $start = time();
    echo "All request handle stop at ".$start.PHP_EOL;
    foreach ($requests as $request){
      $pid = $this->worker($request);
      if(!$pid){
        echo 'handle fail!'.PHP_EOL;
        return;
      }
      array_push($this->list,$pid);
    }
    while(count($this->list)>0){
      foreach ($this->list as $k=>$pid){
        $res = pcntl_waitpid($pid,$status,WNOHANG);
        if($res == -1 || $res > 0){
          unset($this->list[$k]);
        }
      }
      usleep(100);
    }
    $end = time();
    $cost = $end - $start;
    echo "All request handle stop at ".$end."\t cost:".$cost.PHP_EOL;
  }
}
$requests = [
 [1,'GET index.php'],
 [2,'GET index.php'],
 [3,'GET index.php'],
 [4,'GET index.php'],
 [5,'GET index.php'],
 [6,'GET index.php']
];
$server = new WebServer();
$server->master($requests);

輸出結(jié)果:

All request handle stop at 1504513048
18945    start GET index.php    at1504513048
18944    start GET index.php    at1504513048
18946    start GET index.php    at1504513048
18947    start GET index.php    at1504513048
18948    start GET index.php    at1504513048
18949    start GET index.php    at1504513048
18944    stop   GET index.php   at:1504513049   cost:1
18945    stop   GET index.php   at:1504513050   cost:2
18946    stop   GET index.php   at:1504513051   cost:3
18947    stop   GET index.php   at:1504513052   cost:4
18948    stop   GET index.php   at:1504513053   cost:5
18949    stop   GET index.php   at:1504513054   cost:6
All request handle stop at 1504513054    cost:6

如果依次處理請(qǐng)求,總耗時(shí)為1+2+3+4+5+6=21s。每個(gè)請(qǐng)求創(chuàng)建一個(gè)進(jìn)程的處理方式,總耗時(shí)是最耗時(shí)的請(qǐng)求操作6s。

多進(jìn)程最好在方法、函數(shù)或者文件中單獨(dú)使用,這樣邏輯更加清晰,也便于分析和維護(hù)。

附錄

郵件操作類(lèi):

MailWork.php

?php
/**
 * Created by PhpStorm.
 * User: zhezhao
 * Date: 2017/9/4
 * Time: 上午10:05
 */
class MailWork
{
  private $error;
  private $name;
  public function __construct($name)
  {
    $this->name = $name;
  }
  public function getLastError(){
    return $this->error;
  }
  public function checkEnv($argc)
  {
    if (substr(php_sapi_name(), 0, 3) !== 'cli') {
      $this->error ="This Programe can only be run in CLI mode";
      return false;
    }
    if($argc!=2){
      $this->error = 'wrong params';
      return false;
    }
    return true;
  }
  public function getFileName($argv){
    $filename = "task".$argv[1];
    if(!file_exists($filename)){
      $this->error = 'file does not exits';
      return false;
    }else{
      return $filename;
    }
  }
  public function sendMail($mailto)
  {
    sleep(2);
    echo $this->name."#mailto:".$mailto.PHP_EOL;
  }
  public function text_mail($argc,$argv){
    if(!$this->checkEnv($argc)){
      return false;
    }
    $filename = $this->getFileName($argv);
    if(!$filename){
      return false;
    }
    $fp = fopen($filename,'r');
    $counter = 0;
    while(!feof($fp)){
      $line = fgets($fp);
      $mailto = substr($line,0,strlen($line)-1);
      if(preg_match('/^\w+@\w+\.\w+$/',$mailto)){
        $this->sendMail($mailto);
        $counter++;
      }
    }
    return $counter;
  }
  public function redis_mail($mailto){
    if(preg_match('/^\w+@\w+\.\w+$/',$mailto)){
      $this->sendMail($mailto);
    }
  }
}

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《PHP進(jìn)程與線程操作技巧總結(jié)》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》、《PHP基本語(yǔ)法入門(mén)教程》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

您可能感興趣的文章:
  • PHP實(shí)現(xiàn)的多進(jìn)程控制demo示例
  • 深入探究PHP的多進(jìn)程編程方法
  • PHP多進(jìn)程之pcntl_fork的實(shí)例詳解
  • PHP使用pcntl_fork實(shí)現(xiàn)多進(jìn)程下載圖片的方法
  • PHP的pcntl多進(jìn)程用法實(shí)例
  • php中實(shí)現(xiàn)進(jìn)程鎖與多進(jìn)程的方法
  • Linux下實(shí)現(xiàn)PHP多進(jìn)程的方法分享
  • PHP多進(jìn)程編程總結(jié)(推薦)
  • 分享PHP-pcntl 實(shí)現(xiàn)多進(jìn)程代碼
  • php多進(jìn)程模擬并發(fā)事務(wù)產(chǎn)生的問(wèn)題小結(jié)
  • PHP多進(jìn)程通信-消息隊(duì)列使用

標(biāo)簽:文山 黔東 海北 湘西 惠州 梅河口 廈門(mén) 濮陽(yáng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《php多進(jìn)程應(yīng)用場(chǎng)景實(shí)例詳解》,本文關(guān)鍵詞  php,多,進(jìn)程,應(yīng)用,場(chǎng)景,實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《php多進(jìn)程應(yīng)用場(chǎng)景實(shí)例詳解》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于php多進(jìn)程應(yīng)用場(chǎng)景實(shí)例詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲欧洲精品一区二区三区| ●精品国产综合乱码久久久久| aa级大片欧美| 91黄色激情网站| 91精品婷婷国产综合久久性色| 精品国产乱码久久久久久免费| 久久精子c满五个校花| 综合久久久久久| 免费在线视频一区| 粉嫩一区二区三区在线看| 91黄色小视频| 久久久久综合网| 亚洲综合在线观看视频| 紧缚捆绑精品一区二区| 成人av影院在线| 日韩三级视频在线看| 国产精品久久久久久久久快鸭| 亚洲国产日产av| 国产一区二区免费视频| 在线观看av一区| 欧美成人a视频| 一区二区欧美视频| 国产不卡免费视频| 日韩一区二区三区观看| 亚洲日本成人在线观看| 激情六月婷婷久久| 欧美伊人久久久久久午夜久久久久| 久久女同精品一区二区| 视频一区欧美日韩| 91论坛在线播放| 国产精品国产三级国产有无不卡 | 337p粉嫩大胆噜噜噜噜噜91av | 91精彩视频在线观看| 久久婷婷国产综合精品青草| 日本网站在线观看一区二区三区| 91蝌蚪porny成人天涯| 国产亚洲欧美中文| 免费欧美在线视频| 欧美日韩亚洲综合在线 | av成人老司机| 2023国产一二三区日本精品2022| 天天影视色香欲综合网老头| 色香色香欲天天天影视综合网| 国产免费观看久久| 国产一区二区三区免费播放| 日韩欧美中文字幕制服| 日韩一区欧美二区| 欧美日韩五月天| 亚洲成a人在线观看| 欧美午夜视频网站| 亚洲一区二区三区免费视频| 在线视频你懂得一区| 亚洲精品自拍动漫在线| 色拍拍在线精品视频8848| 亚洲免费av高清| 91久久精品一区二区| 一区二区三区 在线观看视频| 91原创在线视频| 亚洲精品中文在线| 色综合久久66| 一区二区三区色| 精品视频免费在线| 日韩黄色在线观看| 欧美成人精品高清在线播放| 韩国午夜理伦三级不卡影院| 国产视频一区在线播放| 成人精品国产免费网站| 亚洲视频网在线直播| 日本韩国欧美在线| 日韩中文字幕一区二区三区| 欧美精品一区二区三区久久久| 国内精品伊人久久久久影院对白| 国产欧美日韩视频在线观看| 91老师片黄在线观看| 亚洲国产一区二区三区青草影视| 欧美日韩免费高清一区色橹橹| 日韩成人av影视| 久久尤物电影视频在线观看| av一区二区三区四区| 亚洲丰满少妇videoshd| 欧美成人国产一区二区| 成人91在线观看| 日韩精品成人一区二区在线| 国产视频一区二区在线| 色婷婷av一区二区| 日韩av电影免费观看高清完整版在线观看| 精品久久免费看| 99久久久久久99| 美国十次综合导航| 国产精品人妖ts系列视频| 欧美亚洲综合一区| 国产福利一区在线| 亚洲成人三级小说| 久久精品一区四区| 欧美日韩亚洲综合在线 | 久久麻豆一区二区| 日本黄色一区二区| 国产美女精品一区二区三区| 一区二区三区四区国产精品| 亚洲精品一区二区三区影院| 色伊人久久综合中文字幕| 久久66热re国产| 亚洲视频免费在线| 久久亚洲精华国产精华液| 欧美性色综合网| 国产91在线观看| 欧美aⅴ一区二区三区视频| 一区在线观看视频| 久久―日本道色综合久久| 欧美日本国产一区| 色老汉一区二区三区| 成人午夜视频免费看| 国产综合色产在线精品| 日韩国产精品久久久久久亚洲| 综合色中文字幕| 久久久精品国产免大香伊| 91精品国产综合久久福利| 91一区二区三区在线播放| 国产成人精品www牛牛影视| 久久电影国产免费久久电影| 亚洲午夜免费视频| 亚洲欧美一区二区不卡| 国产精品视频一二| 久久久久国产精品人| 91精品欧美久久久久久动漫| 欧美亚日韩国产aⅴ精品中极品| 粉嫩久久99精品久久久久久夜| 久久99热这里只有精品| 婷婷成人综合网| 亚洲一区二区精品视频| 一区二区在线观看视频在线观看| 国产精品伦一区| 中文一区二区在线观看| 国产午夜一区二区三区| 久久精品免视看| 久久久久久久网| 久久久国产精华| 国产免费成人在线视频| 欧美激情一区二区三区| 国产欧美日韩在线| 国产精品久久久一本精品 | 国产99久久久国产精品潘金网站| 久久国产精品一区二区| 精品系列免费在线观看| 蜜臀久久99精品久久久久久9 | 日韩一区二区三区三四区视频在线观看| 欧美色综合网站| 欧美在线一二三四区| 精品视频免费看| 欧美高清性hdvideosex| 日韩午夜激情免费电影| 欧美变态tickling挠脚心| 欧美不卡视频一区| 久久毛片高清国产| 中文字幕一区二区三区不卡| 亚洲精品写真福利| 亚洲国产乱码最新视频 | 精品国产乱子伦一区| 久久亚洲一级片| 一区在线观看免费| 天天色天天操综合| 国产美女视频一区| 91美女蜜桃在线| 欧美三级视频在线播放| 欧美一区三区二区| ww久久中文字幕| 亚洲欧美激情插| 日本免费新一区视频| 国产精品69毛片高清亚洲| 99久久婷婷国产精品综合| 欧美日韩国产小视频在线观看| 欧美电影免费观看高清完整版| 国产女人aaa级久久久级| 亚洲午夜视频在线| 国产一区二区伦理片| 91亚洲国产成人精品一区二区三 | 69p69国产精品| 久久精品视频免费| 亚洲国产视频在线| 国产精品1024| 在线视频一区二区三区| 久久久影视传媒| 亚洲午夜激情网页| 国产乱人伦偷精品视频不卡| 欧美性受xxxx黑人xyx| 2021国产精品久久精品| 亚洲综合一区在线| 国产激情91久久精品导航| 欧美日韩中文国产| 中文字幕一区二区日韩精品绯色| 日本女优在线视频一区二区 | 成a人片国产精品| 91精品在线免费| 亚洲日本va午夜在线电影| 精品在线视频一区| 日本韩国欧美三级| 欧美激情一区不卡| 久久国产婷婷国产香蕉| 91蝌蚪porny| 精品国产一区二区在线观看|