当前位置:首页 > PHP > 正文内容

php多进程,php多进程处理任务,php多进程应用场景

高老师7年前 (2018-03-31)PHP2048

php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo

//创建子进程
$pid=pcntl_fork();

//返回-1,创建失败,不会创建子进程,并引发PHP错误
if($pid==-1)
{
	exit('创建子进程失败!');
}
else if($pid)
{
	//父进程得到子进程号,这里是父进程执行的逻辑
	//为什么父进程得到?因为是父进程创建的子进程
}
else
{
	//子进程得到进程号为0,这里是子进程的逻辑
	//为什么子进程得到0,因为是父进程创建的它
}

解析:    

        pcntl_fork会创建一个子进程,当创建了子进程后,后面的执行的代码是并行的.父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。为什么?我在注释中已经注释了。

下面创建10个进程来执行网络请求任务

//创建10个进程去访问某个文章url
for ($i=0; $i <10 ; $i++) { 
	//创建子进程
	$pid=pcntl_fork();

	//返回-1,创建失败,不会创建子进程,并引发PHP错误
	if($pid==-1)
	{
		echo ('创建子进程失败!');
	}
	else if($pid)
	{
		//我是父亲进程逻辑模块
		//pcntl_wait($status);//如果开启阻塞,那么父进程只能等子进程执行完成,再执行,可设置子进程的sleep进行测试
		$id = getmypid(); 
		echo '我是主进程id:'.$id.',我是子进程id:'.$pid."\r\n";
	}
	else
	{
		//我是子进程逻辑模块
		$url='https://blog.20230611.cn/?id=158';
		sleep(1);
		file_get_contents($url);
		//我执行完成我就退出,如果不退出将会造成继续fork
		exit();
	}
}

解析:

        以上代码创建10个进程对我的url分别请求一次,然后退出进程。其中父进程中pcntl_wait()是为了等待子进程中断,防止子进程成为僵尸进程,如果你开启了它,那么父进程将会等待并行的子进程完成并退出才执行。需要注意的是子进程使用完成及时exit,否则继续fork系统开销很大。为了保证系统稳定最好使用pcntl_signal()处理进程管理

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/61.html

分享给朋友:

“php多进程,php多进程处理任务,php多进程应用场景” 的相关文章

php scoket,php webscoket,php webscoket 服务器

php scoket,php webscoket,php webscoket 服务器

项目需要使用websocket推送最新订单,客户服务器非linux不支持swoole,因此使用原生,直接上代码(1).PHP服务端<?php ini_set('error_reporting', E_ALL ^ E_NOTICE); ini_set...

PHP中的ArrayAccess用法详解

PHP中的ArrayAccess用法详解

php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class  studen...

Thinkphp Call Stack,PHP调用栈Call Stack的获取

Thinkphp Call Stack,PHP调用栈Call Stack的获取

ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

redis订阅和发布,redis消息订阅与发布, phpredis订阅和发布

Redis提供了发布订阅功能,可以用于消息的传输,Redis的发布订阅机制包括三个部分,发布者(publisher),订阅者(subscriber)和频道(channel)。 发布者和订阅者都是Redis客户端,Channel则为Redis服务器端,发布者将消息发送到某个的频道,订阅了这个...

php执行慢原因查找

php执行慢原因查找

今天帮朋友查询wordpress执行超级慢的原因,特此记录开启fpm的慢日志,记录执行超过30秒的脚本request_slowlog_timeout = 30 slowlog = var/log/slow.log查看日志[23-May-2019 17...

PHP yield  PHP协程,PHP协程用法学习

PHP yield PHP协程,PHP协程用法学习

【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1.  <?php   2.  $data = ['1', '2', &...