文档章节

php 多进程工作

 有段故事
发布于 2017/06/21 16:11
字数 743
阅读 12
收藏 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,他的父进程都死掉了,他们肯定也丢了。如果该功能访问量特别高的话,就需要另辟蹊径了。

 

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 294
码字总数 53959
作品 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 多进程管理器--MultiWorker

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

月影又无痕
2017/08/21
138
0
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

没有更多内容

加载失败,请刷新页面

加载更多

Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
0
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
14
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
0
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
2
0
rabbitmq学习(二)

生产者消费者初级案列 ChannelUtils package com.hensemlee.rabbitmq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Connecti......

hensemlee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部