在使用php-resque队列时使用到PHP进程的相关内容总结

PHP的轻量消息队列php-resque使用说明 项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品。消息队列说白了就是一个最简单的先进先出队列,队列... 阅读详情

好文章:
http://www.jianshu.com/p/08bcf724196b
http://www.jb51.net/article/71232.htm
https://www.pureweber.com/article/php-multi-process-programming-preview/
http://rainyluo.net/post/php_mutilcurl

问题:多进程执行任务的方法
子进程执行任务,如何返回消息给父进程
父进程阻塞模式,非阻塞模式
父进程,子进程挂掉怎么处理

多进程优点:

  1. 使用多进程。子进程结束,内核负责回收资源。
  2. 使用多进程,子进程异常退出不会导致整个进程Thread退出,父进程还有机会重建流程
    via鸟哥的博客:http://www.laruence.com/2009/06/11/930.html
    守护进程: 主要的方法
    下方文章来源:https://www.pureweber.com/article/php-multi-process-programming-preview/
这个代码只能跑单进程,然后fork值fork出一个子进程,其实可以多fork几个出来。如果想实现多进程php-resque本身初始化的时候需要指定  COUNT= 值
	public function work($interval = 5)
	{
		$this->updateProcLine('Starting');
		$this->startup();

		while(true) {
			if($this->shutdown) {
				break;
			}

			// Attempt to find and reserve a job
			$job = false;
			if(!$this->paused) {
				$job = $this->reserve();
			}

			if(!$job) {
				// For an interval of 0, break now - helps with unit testing etc
				if($interval == 0) {
					break;
				}
				// If no job was found, we sleep for $interval before continuing and checking again
				$this->log('Sleeping for ' . $interval, true);
				if($this->paused) {
					$this->updateProcLine('Paused');
				}
				else {
					$this->updateProcLine('Waiting for ' . implode(',', $this->queues));
				}
				usleep($interval * 1000000);
				continue;
			}

			$this->log('got ' . $job);
			Resque_Event::trigger('beforeFork', $job);
			$this->workingOn($job);

			$this->child = $this->fork();

			// Forked and we're the child. Run the job.
			if ($this->child === 0 || $this->child === false) {
				$status = 'Processing ' . $job->queue . ' since ' . strftime('%F %T');
				$this->updateProcLine($status);
				$this->log($status, self::LOG_VERBOSE);
				$this->perform($job);
				if ($this->child === 0) {
					exit(0);
				}
			}

			if($this->child > 0) {
				// Parent process, sit and wait
				$status = 'Forked ' . $this->child . ' at ' . strftime('%F %T');
				$this->updateProcLine($status);
				$this->log($status, self::LOG_VERBOSE);

				// Wait until the child process finishes before continuing
				pcntl_wait($status);
				$exitStatus = pcntl_wexitstatus($status);
				if($exitStatus !== 0) {
					$job->fail(new Resque_Job_DirtyExitException(
						'Job exited with exit code ' . $exitStatus
					));
				}
			}

			$this->child = null;
			$this->doneWorking();
		}

		$this->unregisterWorker();
	}
$parentPid = getmypid(); // 这就是传说中16岁之前的记忆
$pid = pcntl_fork(); // 一旦调用成功,事情就变得有些不同了   $pid 为子进程Id和0

0为子进程, >0 位子进程ID??  //不知道怎么描述这句话、、反正执行的结果如下

if ($pid == -1) {
    die('fork failed');
} else if ($pid == 0) {
    $mypid = getmypid(); // 用getmypid()函数获取当前进程的PID
    echo 'I am child process. My PID is ' . $mypid . ' and my father's PID is ' . $parentPid . PHP_EOL;
} else {
    echo 'Oh my god! I am a father now! My child's PID is ' . $pid . ' and mine is ' . $parentPid . PHP_EOL;
}
输出
I am child process. My PID is 6065 and my fathers PID is 6064
Oh my god! I am a father now! My childs PID is 6065 and mine is 6064

这里如果在父进程和子进程中都sellp(10); 可以查看到两个进程 6064 和 6065
这里写图片描述

再强调一下,pcntl_fork()调用成功以后,一个程序变成了两个程序:一个程序得到的 p i d 变 量 值 是 0 , 它 是 子 进 程 ; 另 一 个 程 序 得 到 的 pid变量值是0,它是子进程;另一个程序得到的 pid变量值是0,它是子进程;另一个程序得到的pid的值大于0,这个值是子进程的PID,它是父进程。在下面的分支语句中,由于$pid值的不同,运行了不同的代码。再次强调一下:子进程的代码和父进程的是一样的。所以就要通过分支语句给他们分配不同的任务。

一般来说,在父进程结束之前回收挂掉的子进程就可以了。在pcntl扩展里面有一个pcntl_wait()函数,它会将父进程挂起,直到有一个子进程退出为止。如果有一个子进程变成了僵尸的话,它会立即返回。所有的子进程都要回收,所以多等等也没关系啦!

父进程先挂了
如果父进程先挂了怎么办?会发生什么?什么也不会发生,子进程依旧还在运行。但是这个时候,子进程会被交给1号进程,1号进程成为了这些子进程的继父。1号进程会很好地处理这些进程的资源,当它们结束时1号进程会自动回收资源。所以,另一种处理僵尸进程的临时办法是关闭它们的父进程

// 定义一个处理器,接收到SIGINT信号后只输出一行信息
function signalHandler($signal) {
    if ($signal == SIGINT) {
        echo 'signal received' . PHP_EOL;
    }
}
// 信号注册:当接收到SIGINT信号时,调用signalHandler()函数
pcntl_signal(SIGINT, 'signalHandler');
while (true) {
    sleep(1);
    // do something
    pcntl_signal_dispatch(); // 接收到信号时,调用注册的signalHandler()
}

关于函数方法:

getmygid() - 获取当前 PHP 脚本拥有者的 GID
getmyuid() - 获取 PHP 脚本所有者的 UID
get_current_user() - 获取当前 PHP 脚本所有者名称
getmyinode() - 获取当前脚本的索引节点(inode)
getlastmod() - 获取页面最后修改的时间
posix_getpid()   返回当前进程 id

pcntl_fork()  	pcntl_fork()函数成功执行时会在父进程返回子进程的进程id(pid),因为系统的初始进程init进程的pid为1,后来产生进程的pid都会大于此进程,所以我们可以通过判断pcntl_fork()的返回值大于1来确实当前进程是父进程;而在子进程中,此函数的返回值会是固定值0,我们也可以通过判断pcntl_fork()的返回值为0来确定子进程;

posix_kill() bool posix_kill ( int $pid , int $sig ) // 向进程id为$pid的进程发送$sig信号,

pcntl_waitpid(-1, $status, WNOHANG) $status

pcntl_signal (int $signo , callback $handler) 安装一个信号处理器;
			$signo是待处理的信号常量,callback是其处理函数

pcntl_wait() 父进程在pcntl_wait()将自己阻塞,等待子进程运行完了才接着运行。

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )  // 挂起当前进程的执行直到进程号为$pid的进程退出(如果$pid为-1,则等待任意一个子进程); 

PHP内常见的信号常量有:			
SIGCHLD     子进程退出成为僵尸进程会向父进程发送此信号
SIGHUP      进程挂起
SIGTEM      进程终止
...         // 其他请在手册中查看



pcntl_signal_dispatch () 调用每个等待信号通过pcntl_signal()安装的处理器


这里写图片描述

利用redis和php-resque实现后台任务 在PHP的页面编程过程中,我们总遇到这样一个问题,即是PHP是一个顺序执行的过程,只能在一个任务完成后接着去实现下一个任务,而这其中存在一个问题,就是假如其中一个任务耗费大量时间的时候,我们可能就必须要等待。借助redis可以将耗时任务放到后台去执行,从而减少等待时间。 阅读详情

相关推荐

php-resque:php-resque 是一个 Redis 支持的 PHP 库,用于创建后台作业,将它们放在多个队列中,并在以后处理它们

php-resque php-resque(发音为“ rescue”)是Redis支持的库,用于创建后台作业,将这些作业放在多个队列中并在以后进行处理。 内容 日志记录 事件/挂钩系统 配置选项 Redis 贡献者 背景 这个版本的 php-resque 基于最初由chrisboulton完成的工作,他移植了由GitHub创建的同名ruby 版本。 重写之前的工作背后的原因是为了更好地支持工作服务器的水平扩展,并提高作业容错能力,以创建一个非常高可用的系统。 与 Monolog 集成意味着可以实现非常详细的日志记录,这使得解决分布式系统中的错误变得更加容易。 一个广泛的事件/挂钩系统可以实现更深入的集成和统计信息收集。 此版本提供以下功能: 工人可以分布在多台机器之间。 对内存泄漏有弹性(作业在分叉进程上运行)。 预期并记录失败。 日志记录使用 Monolog。 能够将

php 多进程 消息队列,PHP多进程通信-消息队列使用

帝国CMS技术互助群:540946827 一帮大神带你装逼带你飞!还有漂亮的妹纸陪你玩哦!向消息队列发送数据和获取数据的测试

weixin_32457139的博客 182

四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹

之前买了一批5路灰度传感器,想用这传感器进行循迹,无奈网上和官方的资料提供的还是比较少,这里还是做一下当初的学习记录。

weixin_51651698的博客 6万+

解决进程结束Process finished with exit code 1的问题

今天下载了别人的一份代码,跑起来的时候出现了下面结果。 Process finished with exit code 1 通常情况下我们知道代码返回0是正常运行结束,而返回-1是错误结束,因此返回1且不报错的情况极少,但确实没有正常运行。 漫长的debug路程。。。 1、通过将中的Exception改为Throwable,然后debug,查看是否能显示报错。 try{ //你的代码 }catch (Exception e) { e.printStackTrace(); Log.printLi

snow__mei的博客 10万+

【前端HTML生成条形码——MQ】

本文将展示前端HTML如何根据用户输入内容生成对应的条形码,附HTML和JS代码。代码如下(示例):

weixin_42588676的博客 1955

基于微信小程序的答题系统

学习视频:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!5812)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_83330193的博客 498

PHP-Resque:一个可靠、灵活的后台任务队列

PHP-Resque 是一款基于 Redis 的可靠、灵活的任务队列系统。它使您能够轻松地在后台处理耗时较长的操作,从而提高应用程序的响应速度和用户体验。 ## 什么是 PHP-Resque? PHP-Resque 是一个开源的、跨平台的任务队列系统,最初由 GitHub 的 Chris Boulton 创建。它是一个用 PHP 编写的库,旨在与 Resque 相集成,Resque 是一个...

gitblog_00007的博客 843

OpenStack [ compute_id ] 设计上的小缺陷

而 nova 代码中硬编码(或默认配置)将 compute_id 放在 site-packages 目录,属于 设计上的小缺陷—— 把 “库安装目录” 和 “运行时数据目录” 混在一起了,才导致需要临时调整这个目录的权限。# 配置项说明:node_identity_file 是 nova 用于指定节点标识文件路径的官方配置项,优先级高于代码中的默认路径。自定义 compute_id 路径,指向 /var/lib/nova/ 目录下的 compute_id 文件;

求知若渴,虚心若愚。 491

消息队列服务器 轻量,PHP的轻量消息队列php-resque使用说明

消息队列处理后台任务带来的问题项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品。消息队列说白了就是...

weixin_35476604的博客 632

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2017

代码复现3—VLN-CE

运行训练完后在 data文件下会自动生成一个“checkpoints”文件,文件下包含任务文件“seq2seq”,该文件下会包括训练出来的权重和评估结果。数据集下载完后路径提取:data/scene_datasets/mp3d/{scene}/{scene}.glb。注意这里下载的数据集并不是所有的matterport3d,只需要一部分,包含90个场景,大小压缩后约16G。在“eval”时,会在data文件下生成videos文件,里面存放的是可视化的轨迹视频。

qq_44100524的博客 3198

PHP-resque使用经验总结

一、前言 公司项目里面用到了推送等第三方库,为了更快速的响应,决定将推送功能放入消息队列中处理。那么,如何做消息队列呢?通过网上资料,找到以下几种方案: 1)PHP+redis自己做消息队列 2)PHP-Resque 3)MemcacheQ 4)RabbitMQ 最后我们选了第二种方案,因为PHP-Resque是现成的框架,比第一种方案要方便,第二是由于我们的消息队列服务要求比较轻量级,PHP-Resque刚好满足我们的要求。 那么,开始了。 二、环境搭建 有关PHP-resque的原理

希望我的博客,能帮上你解决学习中工作中所遇到的问题 890

扩充两个三维体积:ITK实现

在医学图像处理中,经常需要进行 3D 体积的操作,比如合并、分割等。而 ITK (Insight Segmentation and Registration Toolkit) 是一个常用的开源库,可以用于实现各种医学图像处理算法。这篇文章将介绍如何使用 ITK 实现扩充两个三维体积的操作。不过以上代码已经足够简单明了地演示了如何使用 ITK 实现扩充两个三维体积的操作。首先,我们需要准备两个三维体积的数据。这里假设这两个体积大小相同,并且已经加载到内存中了。来读取和保存体积数据,使用了。

CodeVorter的博客 204

PHP Resque 使用教程

PHP Resque 使用教程 PHP Resque 是基于 Redis 的后台任务队列库,灵感来源于 Ruby 版的 Resque。它允许你创建背景任务并稍后处理这些任务,广泛应用于异步处理场景。下面我们将详细介绍如何理解和操作这个开源项目。 1. 项目目录结构及介绍 以下是对 php-resque 项目主要目录结构的说明: bin: 包含脚本用于启动作业调度器(resque-schedule...

gitblog_01067的博客 1071

Cadence OrCAD Capture软件启动过程卡死且无法恢复的解决方法

如下图所示Cadence OrCAD Capture软件在启动后出现卡死的现象,且等待后无法自动恢复,需要强行关闭,再次启动依然卡死。

fydar的博客 4042

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

php-resque消息队列

参考:http://www.thinkphp.cn/extend/888.html tp3.2集成php-resque消息队列 推送,发送短信等第三方库,找到以下几种方案: 1)PHP+redis自己做消息队列 2)PHP-Resque 3)MemcacheQ 4)RabbitMQ 集成方法 https://github.com/5ini99/...

静如雪的博客 2078

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

php resque队列常驻,php-resque 队列简单使用

一、安装php-resque进入项目根目录,composer安装php-resquecomposer require chrisboulton/php-resque二、常用方法1、连接 redis//setBackend($server, $database = 0)Resque::setBackend('127.0.0.1:6379');2、向队列中添加工作//enqueue($queue...

weixin_29769523的博客 558

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

php的消息队列框架resque的使用小结

前段时间在开发一个量化交易系统,这是一个类似股票交易软件的系统:股票价格变化后要实时在终端(APP)的行情价格页面实时更新,如果用户是在持仓页面,还要计算持仓盈亏及预付款比例,因为有一个强制平仓机制(当预付款比较低于30%时系统要自动触发强制平仓),因为行情波动非常快(有些产品一秒钟内价格会变化五六次),所以当某个产品的价格变化时,要触发一系统的行情推送(通过长连接)及盈亏计算操作。 因为价格变动非常快,如果使用同步操作的话,很容易造成阻塞,所以用异步消息队列是比较好的选择,在网上查了一番,决定用resqu

风柏杨的技术博客 1712

php-resque 队列简单使用

一、安装php-resque 进入项目根目录,composer安装php-resque composer require chrisboulton/php-resque 二、常用方法 1、连接 redis // setBackend($server, $database = 0) Resque::setBackend('127.0.0.1:6379'); ...

weixin_30500105的博客 300

PHP Resque Scheduler 使用教程

PHP Resque Scheduler 使用教程 项目介绍 PHP Resque Scheduler 是一个基于 Redis 的任务调度扩展,它允许你通过延迟或定时方式执行任务。它是 Resque 项目的一部分,Resque 是一个基于 Redis 的后台任务系统,而 Resque Scheduler 则在此基础上增加了任务调度的功能。 项目快速启动 安装 首先,你需要通过 Composer 安...

gitblog_00085的博客 858

推荐一款高效、可靠的PHP任务队列库:php-resque-ex

推荐一款高效、可靠的PHP任务队列库:php-resque-ex 如果你正在寻找一个易于使用且功能强大的PHP任务队列库,那么不妨试试。 什么是php-resque-ex? php-resque-ex是一款基于Redis的PHP任务队列库。它允许你在后端异步执行耗时较长的任务,例如发送电子邮件、处理图片等,从而提高你的应用程序的响应速度和用户体验。 php-resque-ex能用来做什么? php...

gitblog_00016的博客 585

使用Redis+php-resque实现消息队列

一、Redis安装 1. 获取源码 shell># cd /usr/local/src shell># wget http://download.redis.io/releases/redis-2.6.16.tar.gz shell># tar -zxvf redis-2.6.16.tar.gz shell># cd redis-2.6.16 2. 编译、安装 shell>#

lifushan123的专栏 2592

php-resque-dashborad,PHP的轻量消息队列php-resque使用说明

消息队列处理后台任务带来的问题项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品。消息队列说白了就是...

weixin_31830691的博客 197

php-resque-dashborad,php-resque使用说明

项目中经常会有后台运行任务的需求,比如发送邮件时,因为要连接邮件服务器,往往需要5-10秒甚至更长时间,如果能先给用户一个成功的提示信息,然后在后台慢慢处理发送邮件的操作,显然会有更好的用户体验。为了实现类似的需求,Web项目中一般的实现方法是使用消息队列(Message Queue),比如MemcacheQ,RabbitMQ等等,都是很著名的产品。消息队列说白了就是一个最简单的先进先出队列,队列...

weixin_32721919的博客 149
上一篇: php队列 php-resque+redis使用详解
下一篇: 屏蔽Slow network is detected. Fallback font will be used while loading: http://font-path.extension
o王o
博客等级 码龄13年 32粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值