PHP多进程初探 --- 利用多进程开发点儿东西吧
[原文地址:https://blog.ti-node.com/blog...]
干巴巴地叨逼叨了这么久,时候表演真正的技术了!
做个高端点儿的玩意吧,加入我们要做一个任务系统,这个系统可以在后台帮我们完成一大波(注意是一大波)数据的处理,那么我们自然想到,多开几个进程分开处理这些数据,同时我们不能执行了php task.php后终端挂起,万一一不小心关闭了终端都会导致任务失败,所以我们还要实现程序的daemon化。好啦,开始了!
首先,我们第一步就得将程序daemon化了!
// 设置umask为0,这样,当前进程创建的文件权限则为777
umask( 0 );
$pid = pcntl_fork();
if( $pid < 0 ){
exit('fork error.');
} else if( $pid > 0 ) {
// 主进程退出
exit();
}
// 子进程继续执行
// 最关键的一步来了,执行setsid函数!
if( !posix_setsid() ){
exit('setsid error.');
}
// 理论上一次fork就可以了
// 但是,二次fork,这里的历史渊源是这样的:在基于system V的系统中,通过再次fork,父进程退出,子进程继续
// 保证形成的daemon进程绝对不会成为会话首进程,不会拥有控制终端。
$pid = pcntl_fork();
if( $pid < 0 ){
exit('fork error');
} else if( $pid > 0 ) {
// 主进程退出
exit;
}
// 子进程继续执行
// 给进程重新起个名字
cli_set_process_title('php master process');
加入我们fork出5个子进程就可以搞定这些任务,那么fork出5个子进程,同时父进程要负责这5个子进程的状态等。
// 由于*NIX好像并没有(如果有,请告知)可以获取父进程fork出所有的子进程的ID们的功能,所以这个需要我们自己来保存
$child_pid = [];
// 父进程安装SIGCHLD信号处理器并分发
pcntl_signal( SIGCHLD, function(){
// 这里注意要使用global将child_pid全局化,不然读到去数组将为空,具体原因可以自己思考下
global $child_pid;
// 如果子进程的数量大于0,也就说如果还有子进程存活未 退出,那么执行回收
$child_pid_num = count( $child_pid );
if( $child_pid_num > 0 ){
// 循环子进程数组
foreach( $child_pid as $pid_key => $pid_item ){
$wait_result = pcntl_waitpid( $pid_item, $status, WNOHANG );
// 如果子进程被成功回收了,那么一定要将其进程ID从child_pid中移除掉
if( $wait_result == $pid_item || -1 == $wait_result ){
unset( $child_pid[ $pid_key ] );
}
}
}
} );
// fork出5个子进程出来,并给每个子进程重命名
for( $i = 1; $i <= 5; $i++ ){
$_pid = pcntl_fork();
if( $_pid < 0 ){
exit();
} else if( 0 == $_pid ) {
// 重命名子进程
cli_set_process_title('php worker process');
// 啦啦啦啦啦啦啦啦啦啦,请在此处编写你的业务代码
// do something ...
// 啦啦啦啦啦啦啦啦啦啦,请在此处编写你的业务代码
// 子进程退出执行,一定要exit,不然就不会fork出5个而是多于5个任务进程了
exit();
} else if( $_pid > 0 ) {
// 将fork出的任务进程的进程ID保存到数组中
$child_pid[] = $_pid;
}
}
// 主进程继续循环不断派遣信号
while( true ){
pcntl_signal_dispatch();
// 每派遣一次休眠一秒钟
sleep( 1 );
}
[原文地址:https://blog.ti-node.com/blog...]
PHP多进程初探 --- 利用多进程开发点儿东西吧的更多相关文章
- AI安全初探——利用深度学习检测DNS隐蔽通道
AI安全初探——利用深度学习检测DNS隐蔽通道 目录 AI安全初探——利用深度学习检测DNS隐蔽通道 1.DNS 隐蔽通道简介 2. 算法前的准备工作——数据采集 3. 利用深度学习进行DNS隐蔽通道 ...
- 利用NuSoap开发WebService(PHP)
利用NuSoap开发WebService(PHP) 分类: php 2010-09-08 12:00 5005人阅读 评论(1) 收藏 举报 webservicephpsoapstringencodi ...
- 利用JAX-WS 开发web服务
近日在学习Rogers Candenhead的第六版的<Java 入门经典>第22章.利用JAX-WS 开发web服务,简略总结而言主要包括以下几个步骤: 1.定义服务端点接口类: 主要就 ...
- Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)
Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...
- 利用WinDriver开发PCI设备驱动程序
摘要 WinDriver是Jungo公司出版的一个设备驱动程序开发组件,它可以大大加速PCI设备驱动程序的开发.作者在实际的项目中采用了WinDriver来开发设备驱动程序,取得了相当好的运行效果.从 ...
- 【高德API】如何利用MapKit开发全英文检索的iOS地图
原文:[高德API]如何利用MapKit开发全英文检索的iOS地图 制作全英文地图的展示并不困难,但是要制作全英文的数据检索列表,全英文的信息窗口,你就没办法了吧.告诉你,我有妙招!使用iOS自带的M ...
- 利用 MUI开发app, 如何实现侧滑菜单及其主体部分上下滑动
利用mui开发APP 之侧滑菜单主内容滚动问题 MUI作为开发者常用的框架之一,其号称最接近原生APP体验的高性能前端框架.因此利用mui开发移动APP,可以为开发者提供很大的便利和接近原生的体验. ...
- 利用python开发app实战
你说,我们的未来 被装进棺材,染不上尘埃 *** 我很早之前就想开发一款app玩玩,无奈对java不够熟悉,之前也没有开发app的经验,因此一直耽搁了.最近想到尝试用python开发一款app,goo ...
- 利用JavaFx开发RIA桌面应用-在线资料
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/52805751 1.前言 虽说java已经不是主流的桌面应 ...
随机推荐
- HDU 4405 Aeroplane chess (概率DP求期望)
题意:有一个n个点的飞行棋,问从0点掷骰子(1~6)走到n点须要步数的期望 当中有m个跳跃a,b表示走到a点能够直接跳到b点. dp[ i ]表示从i点走到n点的期望,在正常情况下i点能够到走到i+1 ...
- selenium清空默认文字
默认输入框 鼠标点击上去还有文案 直接用 clear不可以
- JQuery实现复制到剪贴板功能
在网页中实现复制到剪贴板功能,有两种方法, 第1种方法:使用JavaScript自带的方法,但是这种方法只能在IE下使用. document.execCommand("Copy") ...
- 动手分析安卓仿QQ联系人列表TreeView控件
因项目需要需要用到仿QQ联系人列表的控件样式,于是网上找到一个轮子(https://github.com/TealerProg/TreeView),工作完成现在简单分析一下这个源码. 一. 需要用 ...
- 二分图染色模板(P1330 封锁阳光大学)
二分图染色模板(P1330 封锁阳光大学) 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校 ...
- C#如何读写和创建INI文件(经典)转
C#如何读写和创建INI文件 分类: c#程序设计2011-11-27 20:42 4935人阅读 评论(2) 收藏 举报 inic#stringbuffernullfile 在做项目过程中,有时需要 ...
- django自带url模板标签的使用
django模板中url标签和view中的reverse(博客地址)功能相同,都是通过制定处理视图来返回一个url. 使用方法: {% url userEdit 12 %} 或者 {% url use ...
- Redis(五)-数据库
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以将制定的书存储在哪个字典中,这与关系书库实例中可以i创建多个数据库类似,所以可以将其中的每个字典 ...
- iOS 点击事件传递及响应
1.iOS中的事件 iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件这里我们只讨论iOS中的触摸事件. 1.1响应者对象(UIResponder) 在iOS中不是任何对象都能处理事 ...
- Cordova 开发环境搭建及创建第一个app
整理记录使用cordova创建app应用程序并将其部署至Android系统移动设备上操作过程,具体如下: 一.前期安装环境 1. 安装JDK(java开发工具包) 2. 安装gradle 3. 安装A ...