二十五、Swoole 基础学习笔记 - Swoole Process 管道通信

作者: 温新

分类: 【Swoole 系列】

阅读: 1613

时间: 2023-03-13 11:54:55

hi,我是温新,一名PHPer

文章基于 Swoole 5.0.1 版本编写。

学习目标:学习 Process 进程间通信多进程的使用

说明:本篇文章结合官方文档编写及参考网络资料编写,虽非全部原创,但也是结合了自己的理解,若转载请附带本文 URL,编写不易,持续编写更不易,谢谢!

管道通信

进程间的通信就是两个进程之间进行数据交换,管道是 Linux 进程间通信的方式之一。

所谓管道,是指用于连接一个读进程和一个写进程以实现他们之间的通信的一个共享文件。Linux下一切皆文件,所以本质上看管道也是一种文件,但又有所不同,就像是一块固定大小的缓冲区。

管道通信的过程就是:写进程将消息写入管道,读进程在将消息读出来,完成通信。

管道的局限性:

  • 1、它是半双工的,即数据一个管道上的数据只能在一个方向上流动,如果要实现双向通信,就必须在两个进程之间建立两个管道。也就是数据单向流动,一端写,一端读;
  • 2、管道只能在具有公共祖先的两个进程之间使用。

pipe 通信基础案例

<?php
// 24-swoole-process-pipe-1.php

$process = new Swoole\Process('process_callback', true);

function process_callback($worker) {
	// 将数据写入管道
	$worker->write('pipe message');
}

$process->start();
// 读取管道中的数据
echo '管道信息:' . $process->read();

多进程执行任务

该案例将模拟多个进程读取网页数据

<?php
// 24-swoole-process-pipe-2.php

// 子进程执行任务
$workers = [];

// 要获取的数据 URL
$urls = [
	'https://baidu.com',
	'https://qq.com',
	'https://sina.com.cn',
	'https://baidu.com?search=php',
	'https://baidu.com?search=linux',
	'https://baidu.com?search=laravel',
];

// 创建多个进程用于处理任务
for ($i = 0; $i < 6; $i++) {
	$process = new Swoole\Process(function ($worker) use ($i, $urls) {
		echo '子进程 ' . $worker->pid . ' 执行 ' . $urls[$i] . PHP_EOL;

		// 获取远程内容
		$content = curl_data($urls[$i]);
		// 将内容写入管道
		$worker->write($content);
	});

	// 子进程 PID
	$pid = $process->start();
	// 子进程对象写入数组
	$workers[$pid] = $process;
}

// 子进程执行结束后,读取管道中的数据内容
foreach ($workers as $process) {
	// 若子进程没有往管道中写入数据,主进程读取时会出现阻塞
	echo $process->pid . ' ' .  $process->read();
}


/**
 * 模拟 CURL 获取内容
 * 
 * @param  string $url 
 * @return string
 */
function curl_data($url) {
	// return file_get_contents($url);

	// 延迟 1 秒,模拟远程获取内容所消耗的时间
	sleep(1);
	return $url . ' success ' . PHP_EOL;
}

输出结果:

$php 24-swoole-process-pipe-2.php 
子进程 79538 执行 https://baidu.com
子进程 79539 执行 https://qq.com
子进程 79540 执行 https://sina.com.cn
子进程 79541 执行 https://baidu.com?search=php
子进程 79542 执行 https://baidu.com?search=linux
子进程 79543 执行 https://baidu.com?search=laravel

# 读取管道中的数据
79538 https://baidu.com success 
79539 https://qq.com success 
79540 https://sina.com.cn success 
79541 https://baidu.com?search=php success 
79542 https://baidu.com?search=linux success 
79543 https://baidu.com?search=laravel success 

本篇文章到此结束,我是温新,下篇文章继续学习 Swoole。

请登录后再评论