繼上篇 2018年swoole實(shí)戰(zhàn)6-異步redis
本篇演示 swoole進(jìn)程管理模塊
創(chuàng)建子進(jìn)程
新建 process.php
<?php
$process = new swoole_process(function(swoole_process $pro) {
echo 'swoole創(chuàng)建進(jìn)程' . PHP_EOL;
}, false); // 如果設(shè)置為true货岭,終端就不會(huì)顯示標(biāo)準(zhǔn)輸出內(nèi)容
$pid = $process->start(); // 創(chuàng)建了一個(gè)子進(jìn)程
echo $pid . PHP_EOL; // 子進(jìn)程id
swoole_process::wait();
? process php process.php
67540
swoole創(chuàng)建進(jìn)程
調(diào)用外部程序
process.php
<?php
$process = new swoole_process(function(swoole_process $pro) {
$pro->exec("/usr/local/opt/php@7.1/bin/php", [__DIR__.'/http_server.php']);
}, false); // 如果設(shè)置為true,終端就不會(huì)顯示標(biāo)準(zhǔn)輸出內(nèi)容
$pid = $process->start(); // 創(chuàng)建了一個(gè)子進(jìn)程
echo $pid . PHP_EOL; // 子進(jìn)程id
swoole_process::wait();
http_server.php
<?php
$http = new swoole_http_server('0.0.0.0', 9502);
$http->on('request', function ($request, $response) {
$response->header("Content-Type", "text/html; charset=utf-8");
$time = date('Y-m-d H:i:s', time());
$response->end("<h1>{$time}--這是swoole提供的http服務(wù),修改代碼后要重啟服務(wù)才能生效</h1>");
});
$http->start();
? process php process.php
68526
[2018-07-27 16:38:53 @68526.0] TRACE Create swoole_server host=0.0.0.0, port=9502, mode=3, type=1
瀏覽器訪問(wèn) http://127.0.0.1:9502/
查看進(jìn)程樹(shù)
通過(guò) pstree 工具可以查看相關(guān)進(jìn)程的關(guān)系
brew install pstree # mac 安裝 pstree
ps aux | grep process.php # 獲取進(jìn)程id
pstree -p 69932 # 顯示進(jìn)程樹(shù)
多進(jìn)程的實(shí)戰(zhàn)案例
如果用php去抓取網(wǎng)頁(yè)內(nèi)容,傳統(tǒng)的方式是用一個(gè)for循環(huán),將url逐個(gè)遍歷赘理,假設(shè)每個(gè)url耗時(shí)1秒,6個(gè)url就需要耗時(shí)6s,這種方式效率太低了鞠呈。通過(guò)swoole的進(jìn)程管理模塊,我們可以實(shí)現(xiàn)多進(jìn)程抓取內(nèi)容右钾,每個(gè)進(jìn)程對(duì)應(yīng)負(fù)責(zé)一個(gè)url蚁吝,從而實(shí)現(xiàn)1秒完成抓取任務(wù)
新建 process_curl.php
<?php
$startTime = time();
echo "程序開(kāi)始執(zhí)行時(shí)間:" . date("H:i:s") . PHP_EOL;
$workers = [];
$urls = [
'http://www.zhihu.com',
'http://www.baidu.com',
'http://www.reibang.com',
'http://www.huxiu.com',
'http://www.qq.com',
];
for ($i = 0; $i < count($urls); $i++) {
// 每次開(kāi)啟一個(gè)子進(jìn)程
$process = new swoole_process(function (swoole_process $worker) use($i, $urls) {
$content = getContent($urls[$i]);
$worker->write($content . PHP_EOL);
}, true);
$pid = $process->start();
$workers[$pid] = $process;
}
foreach ($workers as $process) {
echo $process->read();
}
// 模擬獲取數(shù)據(jù), 耗時(shí)1秒
function getContent($url) {
sleep(1);
return $url . " 執(zhí)行完成..." . PHP_EOL;
}
$runTime = time() - $startTime;
echo "程序執(zhí)行時(shí)間為{$runTime}秒" . PHP_EOL;
執(zhí)行結(jié)果:
? process php process_curl.php
程序開(kāi)始執(zhí)行時(shí)間:17:13:54
http://www.zhihu.com 執(zhí)行完成...
http://www.baidu.com 執(zhí)行完成...
http://www.reibang.com 執(zhí)行完成...
http://www.huxiu.com 執(zhí)行完成...
http://www.qq.com 執(zhí)行完成...
程序執(zhí)行時(shí)間為1秒
如果覺(jué)得本文對(duì)你有所幫助旱爆,點(diǎn)個(gè)贊,或者賞杯咖啡錢窘茁,你的認(rèn)可對(duì)我很重要