php多进程pcntl学习(补漏)

  上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。

 1 <?php
 2 $ppid = getmygid();
 3 $pid = pcntl_fork();
 4 if ($pid == -1){
 5     die(‘fork failed‘);
 6 }else if($pid == 0){
 7     $mypid = getmygid();
 8     echo ‘I am child process. My PID is ‘ . $mypid . ‘ and my father is‘,$ppid.PHP_EOL;
 9     exit(); //关闭子进程 ,需要配合pcntl_wait使用 , 否则通过ps aux | grep php - >[php] <defunct> 僵尸进程
10 }else{
11     echo ‘Oh my god! I am a father now! My child is‘. $pid . ‘ and mine is ‘ . $ppid . PHP_EOL;
12     //pcntl_wait($status); //回收子进程,避免僵尸进程
13 }
14 //使主进程挂起
15 sleep(100);

  执行命令可以看见,子进程变为僵尸进程

  

  僵尸进程虽然不占什么内存,但是很碍眼,院子里一堆躺着的僵尸怎么都觉得怪怪的。(别忘了它们还占用着PID)

  把12行的注释打开,重新执行脚本测试 ps aux | grep php 可以发现子进程退出后就被回收了.顺便说下,通过信号也是能够做到的

  pcntl_signal(SIGCHLD, SIG_IGN);  //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。

  参考:http://www.jb51.net/article/56301.htm

时间: 2024-10-12 17:02:46

php多进程pcntl学习(补漏)的相关文章

php多进程pcntl学习-僵尸进程

上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程. <?php$ppid = getmygid();$pid = pcntl_fork();if ($pid == -1){ die('fork failed');}else if($pid == 0){ $mypid = getmygid(); echo 'I am child process

php多进程pcntl学习

pcntl在windows下无法使用,linux编译php时加上参数--enable-pcntl 即可.第一次使用pcntl模块,遇到了一些坑也慢慢填上了,这里简单记录下. 1. 子进程之间变量无法共享. 2. 子进程完成,记得加上exit(),子进程退出,否则会有坑. 1 <?php 2 $pid_dir = __DIR__.'/pid_files/'; 3 4 for ($i=0;$i<3;$i++){ 5 $pid = pcntl_fork(); 6 if ($pid == -1){ 7

php多进程pcntl学习(二)

多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中. 下面实例,开10个进程结合redis集合,做一些简单的任务处理. 1 <?php 2 for ($i=0;$i<10;$i++){//开10个进程 3 $ret = pcntl_fork(); //生成进程 4 5 if ($ret == 0){ 6 7 $redis = new Redis(); 8 $redis->connect('127.0.0.

php多进程pcntl学习(采集新浪微博)

上面2篇文都简明了多进程中一些需要注意的地方,这次用多进程配合curl_mulit_*来做新浪微博的采集. 先把知识点和值得注意的坑列出 /* 需求:开3个进程,并且模拟多线程来采集新浪微博用户信息,cookie用本博客模拟登陆微博文章生成的cookie 知识要点: 1.需要把抓去过的 url放在容器里,请求前比对下即可避免重复抓取.(此程序没有判断,本人比较懒,哎) 2.容器不能为变量,开多个进程会出现问题,因为进程之间数据独立,无法共享.可以使用shmop共享内存实现(cli不支持模式APC

PCNTL--PHP进程控制扩展学习笔记

PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断. 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果. 目前该扩展只能运行在*unix下,PCNTL现在使用了ticks作为信号处理的回调机制,ticks在速度上远远超过了之前的处理机制. 这个变化与"用户ticks"遵循了相同的语义.您可以使用declare() 语句在程序中指定允许发生回调的位置.这使得我们对异步事件处理的开销最小化.在编译PHP时 启用pcnt

python学习笔记(threading性能压力测试)

又是新的一周 延续上周的进度 关于多进程的学习 今天实践下 初步设计的接口性能压力测试代码如下: 1 #!/usr/bin/env python 2 # -*- coding: utf_8 -*- 3 4 import threading 5 import requests 6 import time 7 import re 8 from time import sleep 9 10 # -------接口性能测试配置------- 11 method = "post" 12 # 接口

python基础知识的学习和理解

参考链接:https://github.com/yanhualei/about_python/tree/master/python_learning/python_base python基础知识笔记 Flask aiohttp的学习和理解 assert() asyncio的学习和理解 continue_break学习和理解 cprofile代码效率分析 datatime dict字典学习与理解 django_project eval() filter() gevent协程的学习和理解 http服

前端网站集合

原网址https://segmentfault.com/a/1190000007062464 内容精简 资源这么多,多看看多学习再总结肯定是好的.多读读就算看重了不算浪费时间,毕竟一千个读者就有一千个林黛玉,还有温故而知新,说不定多读一些内容,就发现惊喜了呢.不过,在此也精简一些内容,就1~2项,只供参考.更多内容细看分类. 知乎:程序员应该如何注意身体健康? js:JavaScript 标准参考教程 js:JavaScript 秘密花园 Es6:ECMAScript 6入门 Es6:深入浅出E

win32多线程编程

关于多线程多进程的学习,有没有好的书籍我接触的书里头关于多线程多进程部分,一是<操作系统原理>里面讲的相关概念   一个是<linux基础教程>里面讲的很简单的多线程多进程编程,再就是<VC开发>里头讲一点总觉得自己学的不透彻,多线程多进程这部分没啥信心    <win32多线程程序设计>华中科技大学出版社2001-1版本