文档章节

php 多进程工作

 有段故事
发布于 2017/06/21 16:11
字数 743
阅读 11
收藏 0
点赞 0
评论 0

遇到的情况:邀请粉丝时候如果粉丝特别多,而且每邀请一个粉丝都需要调用一次极光推送接口和一次站内信接口,如果直接按照php完整的周期,时间太长,因此需要在邀请粉丝的时候分开一个进程进行专门的邀请粉丝的处理,父进程依然执行他的工作并告知前台成功,而子进程需要大量的跑邀请粉丝的工作。

一:准备工作

linux环境安装php 的扩展pcntl,使用phpize安装,如果是docker容器化环境,那么需要修改php 的Dockerfile文件进行重新build。

二:测试

$pid = pcntl_fork();

if ($pid == -1) {
    throw new Exception('fork子进程失败!');
} elseif ($pid > 0) {
    echo '我是主进程'.$pid.'<br>';
    // 保持30秒,确保能被ps查到
} else {
    $pids = posix_getpid();//获取自己的进程pid
    $data['message']='dajingyao';
    $data['sub']='-1';
    M('test')->add($data);
    posix_kill($pids, 9);//杀死进程,可是实际上执行该代码后,进程成了僵尸进程了
    exit(0);//子进程要exit否则会进行递归多进程,父进程不要exit否则终止多进程
}

pcntl_fork()函数生成子进程,返回的$pid 如果$pid==-1 那么此时创建子进程失败。如果$pid不是-1,那么会出现两个$pid,两个pid 分别代表两个线程,$pid==0 这个进程为子进程,$pid为一个大于0的进程为主进程。由于需要主进程去交差,子进程跑任务,主进程需要先结束,所以不需要主进程等待结果,就做如上设计。

三:问题

由于主进程没有等待子进程完成任务,这样会导致每次请求都会生成一个子进程,请求量大的话,便会出现大量的进程。

测试一下,ps -ef | grep httpd 显示如下:

可以看到一个主线程6967以及其派生出来的四个daemon进程(这个与httpd.conf配置文件有关系)。

执行刚才写好的php代码。再次在linux中输入命令:ps -ef | grep httpd

可以看到进程守护进程13638生成了一个子进程14551子进程。[httpd] <defunct>便是僵尸进程,也可以说是进入Z状态的进程。这个就是使用posix_kill($pids, 9);生成的僵尸进程,这些子进程kill不掉,只有KILL掉他的父亲才可以消失。但是他的父亲又都是httpd为了使处理速度更快而生产成的几个守护进程,KILL掉这几个守护进程,还得需要重新生成,与此同时这些僵尸进程根据项目中不会产生大量的,只需要定期清理即可。最简单的清理方法,重启apache,他的父进程都死掉了,他们肯定也丢了。如果该功能访问量特别高的话,就需要另辟蹊径了。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 277
码字总数 51824
作品 0
东城
Jexus V5.8.0 发布,跨平台 ASP.NET WEB 服务器

Jexus Web Server V5.8.0已于12月10日正式发布,下载地址:http://www.linuxdot.net/ 。 Jexus v5.8.0有如下的更新: 1,为反向代理增加了日志功能和安全检测功能。 2,网站配置文件新增 Ho...

yunei
2015/12/13
3.2K
50
PHP线程安全与非线程安全的区别

  从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系统是采用多线程的工作方式。如果在IIS...

coat
2013/08/26
0
0
PHP版本中线程安全和非线程安全的区别

Windows版的PHP从版本5.2.1开始有Thread Safe(c之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的...

Yamazaki
2011/10/18
0
0
PHP线程安全和非线程安全的区别

Windows版的PHP从版本5.2.1开始有Thread Safe(c之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 从2000年10月20日发布的第一个Windows版的PHP3.0.17开始的都是线程安全的...

eric_zhang
2011/06/23
0
0
PHP 多进程管理器--MultiWorker

MultiWorker PHP多进程管理器 Multiworker是纯PHP实现的多进程管理器,使用master-worker进程模型,适用于命令行下的多进程调度、并发处理、工作进程崩溃自动恢复、单实例限制。 项目主页 ht...

月影又无痕
2017/08/21
138
0
PHP版本VC6与VC9、Thread Safe与None-Thread Safe

如果你在apache1或者apache2下使用PHP,你应该选择VC6的版本 如果你在IIS下使用PHP应该选择VC9的版本 VC6的版本使用visual studio6编译 VC9使用Visual Studio 2008编译,并且改进了性能和稳定...

十七亮
2012/11/26
0
0
multiprocess基于swoole的多进程管理组件

multiprocess基于swoole的多进程管理组件 月随人2017-12-062 阅读 PHP多进程 multiprocess [readme in english] 基于swoole的脚本管理,用于多进程和守护进程管理; 可轻松让普通脚本变守护进...

月随人
2017/12/06
0
0
Linux服务及安全管理第九周作业【Linux微职位】

1、请描述一次完整的http请求处理过程; (1)建立或处理连接:接收请求或拒绝请求; (2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程; (3)处理请求:对请求报文...

akatsuki1023
2017/09/25
0
0
PHP FastCGI进程管理器PHP-FPM的架构

一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程. 每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加. 每个worker进程支持在运...

eechen
2015/12/08
10.5K
49
基于 swoole 的多进程管理工具 - multiprocess

multiprocess 基于swoole的脚本管理,用于多进程和守护进程管理; 可轻松让普通脚本变守护进程和多进程执行; 进程个数可配置,可以根据配置一次性执行多条命令; 子进程异常退出时,主进程收...

peigreet
2017/12/02
91
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
0
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
0
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部