成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

swoole_process實現(xiàn)多進程

dayday_up / 1338人閱讀

摘要:首先,確保安裝的版本大于實例說明本例里待消費的是三個命令,會分別創(chuàng)建一個子進程來消費。通過管道發(fā)數(shù)據(jù)到子進程。,重定向子進程的標準輸入和輸出。

簡介

swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。

首先,確保安裝的swoole版本大于1.7.2:

$ php --ri swoole

swoole

swoole support => enabled
Version => 1.10.1
實例說明

本例里待消費的是三個shell命令,會分別創(chuàng)建一個子進程來消費。消費的時候故意sleep了1秒,以便直觀看到效果。

process_t1.php

start();
    $process->write($cmd); //通過管道發(fā)數(shù)據(jù)到子進程。管道是單向的:發(fā)出的數(shù)據(jù)必須由另一端讀取。不能讀取自己發(fā)出去的

    echo $rec = $process->read();//同步阻塞讀取管道數(shù)據(jù)
}

//子進程創(chuàng)建成功后要執(zhí)行的函數(shù)
function my_process(swoole_process $worker){
    sleep(1);//暫停1s

    $cmd = $worker->read();

    // $return = exec($cmd);//exec只會輸出命令執(zhí)行結(jié)果的最后一行內(nèi)容,且需要顯式打印輸出

    ob_start();
    passthru($cmd);//執(zhí)行外部程序并且顯示未經(jīng)處理的、原始輸出,會直接打印輸出。
    $return = ob_get_clean();
    if(!$return) $return = "null";
    
    $worker->write($return);//寫入數(shù)據(jù)到管道
}

//子進程結(jié)束必須要執(zhí)行wait進行回收,否則子進程會變成僵尸進程
while($ret = swoole_process::wait()){// $ret 是個數(shù)組 code是進程退出狀態(tài)碼,
    $pid = $ret["pid"];
    echo PHP_EOL."Worker Exit, PID=" . $pid . PHP_EOL;
}

$end_time = microtime(TRUE);
echo sprintf("use time:%.3f s
", $end_time - $start_time);

命令行里運行:

$ php process_t1.php  

Linux
Sat Apr 21 15:29:55 CST 2018
root

Worker Exit, PID=672

Worker Exit, PID=674

Worker Exit, PID=676
use time:3.080 s

大家會覺得很奇怪,為什么開了三個子進程,還是用了3秒,應該是1秒左右才對呀。

原因是父進程讀取子進程返回的數(shù)據(jù)的時候,是同步阻塞讀取:

 echo $rec = $process->read();//同步阻塞讀取管道數(shù)據(jù)

導致的后果就是父進程依次等待每個進程處理完并返回了內(nèi)容,才走下一次循環(huán)。

解決方案1:
使用swoole_event_add將管道加入到事件循環(huán)中,變?yōu)楫惒侥J剑?/p>

// echo $rec = $process->read();//同步阻塞讀取管道數(shù)據(jù)

//使用swoole_event_add將管道加入到事件循環(huán)中,變?yōu)楫惒侥J?swoole_event_add($process->pipe, function($pipe) use($process) {
    echo $rec = $process->read();
    
    swoole_event_del($process->pipe);//socket處理完成后,從epoll事件中移除管道
});

執(zhí)行結(jié)果:

Worker Exit, PID=686

Worker Exit, PID=687

Worker Exit, PID=688
use time:1.060 s
Linux
Sat Apr 21 15:37:14 CST 2018
root

大家會發(fā)現(xiàn),use time數(shù)據(jù)并不是最后打印出來的。已經(jīng)是異步的了。 實際執(zhí)行時間1s左右。

解決方案2:
先不獲取子進程返回值,循環(huán)結(jié)束后統(tǒng)一返回:

foreach ($cmds as $cmd) {
    $process = new swoole_process( "my_process", true);

    $process->start();
    $process->write($cmd); //通過管道發(fā)數(shù)據(jù)到子進程

    $process_arr[] = $process;
}

foreach ($process_arr as $process){
    echo $rec = $process->read();
}

執(zhí)行結(jié)果:

Linux
Sat Apr 21 15:52:24 CST 2018
root

Worker Exit, PID=694

Worker Exit, PID=693

Worker Exit, PID=695
use time:1.061 s
函數(shù)原型
swoole_process::__construct(callable $function, $redirect_stdin_stdout = false, $create_pipe = true);

第一個參數(shù)是子進程創(chuàng)建成功后要執(zhí)行的函數(shù)。
$redirect_stdin_stdout,重定向子進程的標準輸入和輸出。啟用此選項后,在子進程內(nèi)輸出內(nèi)容將不是打印屏幕,而是寫入到主進程管道(例如用echo打印的內(nèi)容也寫入管道)。讀取鍵盤輸入將變?yōu)閺墓艿乐凶x取數(shù)據(jù)。默認為阻塞讀取。
$create_pipe,是否創(chuàng)建管道,啟用$redirect_stdin_stdout后,此選項將忽略用戶參數(shù),強制為true。如果子進程內(nèi)沒有進程間通信,可以設(shè)置為 false

注意:swoole_process在最新的1.8.0版本已經(jīng)禁止在Web環(huán)境中使用了,所以也只能支持命令行。這時候如果要做并發(fā),multi-curl是不錯的選擇。

進程常駐后臺

如果跑的服務需要一直常駐后臺,可以在$process->start();前面加上:

swoole_process::daemon();

服務會在后臺運行。

更多示例 多進程獲取網(wǎng)頁狀態(tài)碼
 $url) {
    $process = new swoole_process(function(swoole_process $worker) use ($url){
        $code = getHttpCode($url);
        $worker->write($code);
    }, true);
    $process->start();

    swoole_event_add($process->pipe, function($pipe) use($process, $url) {
        echo sprintf("%s code: %s
", $url, $process->read());
        swoole_event_del($pipe);
    });
}

echo "ok.
";

while($ret = swoole_process::wait()){
    // echo PHP_EOL."Worker Exit, PID=" . $ret["pid"] . PHP_EOL;
}

/**
 * 獲取網(wǎng)頁http code
 */
function getHttpCode($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
//        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "HEAD");
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //不驗證證書
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //不驗證證書
    curl_setopt ($ch, CURLOPT_TIMEOUT_MS, 1000);//超時時間
    curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    return (string)$info["http_code"];
}

運行:

$ php process_get.php
ok.
http://www.52fhy.com code: 403
http://www.52fhy.com/1 code: 404
https://www.baidu.com code: 200
https://www.52fhy.com code: 403
 
使用消息隊列通信
push($url.": ".$code);
    }
    $worker->push("exit");
}, false, false); //不創(chuàng)建管道
$process->useQueue(1, 2); //使用消息隊列。消息隊列通信方式與管道不可共用。消息隊列不支持EventLoop,使用消息隊列后只能使用同步阻塞模式非阻塞
$process->start();

while(1){
    $ret = $process->pop();
    if($ret == "exit") break;
    echo sprintf("%s
", $ret);
}

echo "ok.
";

while($ret = swoole_process::wait()){
    echo PHP_EOL."Worker Exit, PID=" . $ret["pid"] . PHP_EOL;
}

/**
 * 獲取網(wǎng)頁http code
 */
function getHttpCode($url){
   //省略
}

運行:

$ php process_get_queue.php
https://www.baidu.com: 200
http://www.52fhy.com: 403
http://www.52fhy.com/1: 404
https://www.52fhy.com: 403
ok.

Worker Exit, PID=1222
參考

1、Process
https://wiki.swoole.com/wiki/...
2、swoole_process->read
https://wiki.swoole.com/wiki/...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/28640.html

相關(guān)文章

  • PHP進程系列筆記(五)

    摘要:消息隊列更常見的用途是主進程分配任務,子進程消費執(zhí)行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...

    qianfeng 評論0 收藏0
  • 使用 swoole_process 實現(xiàn) PHP 進程

    摘要:本文使用與完成一個的進程池,并且支持動態(tài)創(chuàng)建新進程。接著遍歷所有的進程,并且加入中,設(shè)置可讀事件,用于接收子進程的空閑信號。最后每隔一秒向進程投遞任務。由于只模擬了十次任務,則第十個任務完成之后在父進程中發(fā)送使所有子進程退出。 swoole_process 主要是用來代替 PHP 的 pcntl 擴展。我們知道 pcntl 是用來進行多進程編程的,而 pcntl 只提供了 fork 這...

    Andrman 評論0 收藏0
  • Swoole 源碼分析——進程管理 Swoole_Process

    摘要:清空主進程殘留的定時器與信號。設(shè)定為執(zhí)行回調(diào)函數(shù)如果在回調(diào)函數(shù)中調(diào)用了異步系統(tǒng),啟動函數(shù)進行事件循環(huán)。因此為了區(qū)分兩者,規(guī)定并不允許兩者同時存在。 前言 swoole-1.7.2 增加了一個進程管理模塊,用來替代 PHP 的 pcntl 擴展。 PHP自帶的pcntl,存在很多不足,如 pcntl 沒有提供進程間通信的功能 pcntl 不支持重定向標準輸入和輸出 pcntl 只...

    pepperwang 評論0 收藏0
  • swoole——從入門到放棄(三)

    摘要:從入門到放棄三一進程子進程創(chuàng)建成功后要執(zhí)行的函數(shù)重定向子進程的標準輸入和輸出。默認為阻塞讀取。是否創(chuàng)建管道,啟用后,此選項將忽略用戶參數(shù),強制為。 swoole——從入門到放棄(三) 一、進程 swoole_process SwooleProcess swoole_process::__construct(callable $function, $redirect_stdin...

    王笑朝 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<