关于进程的概念不在叙述
在这里 我将使用 swoole创建的进程的方法 去说明 swoole如何使用进程提高某些业务的效率
首先 先介绍swoole关于进程的使用
创建一个文件 process.php
这个文件 可以理解成是一个父进程
接下来就是创建进程 所创建的进程 都是属于这个父进程的 所以 大家都是子进程!

启动这个子进程
![]()
那么接下来 我们要在这个子进程中 去开启http服务
先贴上完整代码
<?php
/**
* 第二个参数设置为true 输出内容将不是打印屏幕,而是写入到主进程管道 管道理解成 进程之间的桥梁
* false则会输出到命令行上
* 此时 该文件为 父进程
*/
//创建子进程
$process = new swoole_process(
function (swoole_process $pro) {
//此时的输出不会显示出来 因为开启重定向子进程的标准输入和输出
// echo 1;
//父进程执行某些操作 比如 执行开启某个服务 这里开启http服务为例子
$pro->exec("/www/server/php/72/bin/php", [__DIR__ . '/../Http/http_server.php']);
}, true
);
//启动子进程
$pid = $process->start();
//获取子进程的id 此时进程的pid 对应 netstat -anp|grep 9503 产生的id
echo $pid . PHP_EOL;
/**
* 结束的时候 回收子进程
*/
swoole_process::wait();
在子进程中 去执行 开启http的服务 调用的是进程中的属性 exec
http服务的端口号为9503
回到终端 我们开启这个进程 并输出 此时的子进程的进程号

然后 查看 http的进程号 http的端口为9503 所以在终端执行命令
netstat -anp |grep 9503
可以看到 我们输出的子进程id 对应http的服务的进程号

这就是swoole对进程的使用!
知道原理之后 我们现在举个例子 通过这个例子 明白 进程多少对业务处理的速度有多大的影响
假设 我们需要对10个网站 进行请求 编写一个php脚本 通过循环 一次请求
也就是说 循环10次以后 输出结果 假设 请求一个网站 需要1秒 那么 等这个脚本执行结束 耗时10秒
如果我们利用swoole的进程 循环过程中 每次创建一个进程 那么耗时 是否缩短为原来的十分之一?
首先 我们先看最原始的处理方式
<?php
/**
* 假设要访问10个url
* 如果是同步的话 一个url 假设要1秒 那么就需要一共 10秒
*
* 现在创建异步 是个url 所消耗的时间 只需要同步的十分之一
*/
//记录开始时间
echo "start".date("H:i:s").PHP_EOL;
$urls = [
"http://www.baidu.com",
"http://www.sina.com",
"http://www.qq.com",
"http://www.baidu.com?search=zzs1",
"http://www.sina.com?search=zzs2",
"http://www.sina.com?search=zzs3",
"http://www.sina.com?search=zzs4",
"http://www.sina.com?search=zzs5",
"http://www.sina.com?search=zzs6",
"http://www.sina.com?search=zzs7",
];
//这是通常处理的方法 也就是同步的处理方式----- 此时消耗10秒
foreach ($urls as $url){
$content[] = curlData($url);
}
var_dump($content);
/**
* 模拟请求上面的url
* @param $url
*/
function curlData($url){
sleep(1);
return $url."success".PHP_EOL;
}
//记录开始时间
echo "finish".date("H:i:s").PHP_EOL;
我在脚本的开始位置 加上开始时间 尾部加上结束时间 创建一个方法 用来模拟请求 假设每次请求网站为1秒
然后运行这个脚本

可以看到 耗时10秒 完成10个网站的请求
那么如果用swoole的进程去实现呢
<?php
/**
* 假设要访问10个url
* 如果是同步的话 一个url 假设要1秒 那么就需要一共 10秒
*
* 现在创建异步 是个url 所消耗的时间 只需要同步的十分之一
*/
//记录开始时间
echo "start".date("H:i:s").PHP_EOL;
$works = [];
$urls = [
"http://www.baidu.com",
"http://www.sina.com",
"http://www.qq.com",
"http://www.baidu.com?search=zzs1",
"http://www.sina.com?search=zzs2",
"http://www.sina.com?search=zzs3",
"http://www.sina.com?search=zzs4",
"http://www.sina.com?search=zzs5",
"http://www.sina.com?search=zzs6",
"http://www.sina.com?search=zzs7",
];
/**
* 创建子进程 进行处理
* 循环6次 每次创建子进程 进程中进行curl请求 消耗1秒
*/
for($i = 0;$i<10;$i++){
//创建
$process = new swoole_process(function (swoole_process $worker) use($i,$urls){
//进行模拟请求 将$i当作下标 依次请求url
$content = curlData($urls[$i]);
//将内容输入到管道 这是方法1
//echo $content.PHP_EOL;
//将内容输入到管道 这是方法2
$worker->write($content.PHP_EOL);
},true);
//开启
$pid = $process->start();
$works[$pid] = $process;
}
//此时是将进程内容输入到管道中 因此在这里进行获取管道内容
foreach($works as $work){
//读取输入到管道里面的信息
echo $work->read();
}
/**
* 模拟请求上面的url
* @param $url
*/
function curlData($url){
sleep(1);
return $url."success".PHP_EOL;
}
//记录开始时间
echo "finish".date("H:i:s").PHP_EOL;
稍微解释一下代码
首先我根据网站的数量 进行for循环 在每次循环过程中去创建一个进程
进程负责去调用请求网站的方法 之后 开启这个进程 并将 请求网站之后的结果 写入到管道之中
通过读取管道的数据 来获取请求网站的结果
同样也在头尾各自加上了时间
那么检测一下效果吧

可以看到 用时1秒 缩短为原来的十分之一!!!
关于swoole的进程 就先介绍到这里 后续会继续更新更进阶的用法
感兴趣的朋友可以关注我!
有不清楚的欢迎在评论区留言!
来源:CSDN
作者:张芝山
链接:https://blog.csdn.net/zhangzeshan/article/details/103550820