文档章节

php多进程应用

旋转木马-千里马
 旋转木马-千里马
发布于 2015/12/29 17:20
字数 1419
阅读 268
收藏 5

码上生花,ECharts 作品展示赛正式启动!>>>

         PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?
Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。


常用的PCNTL函数  
1. pcntl_alarm ( int $seconds )  
设置一个$seconds秒后发送SIGALRM信号的计数器  
2. pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )  
为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
3. pcntl_exec ( string $path [, array $args [, array $envs ]] )  
在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。 
4. pcntl_fork ( void )  
为当前进程创建一个子进程,并且先运行父进程,返回的是子进程的PID,肯定大于零。在父进程的代码中可以用 pcntl_wait(&$status)暂停父进程知道他的子进程有返回值。注意:父进程的阻塞同时会阻塞子进程。但是父进程的结束不影响子进 程的运行。  
父进程运行完了会接着运行子进程,这时子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子 进程)。在子进程的代码块中最好有exit语句,即执行完子进程后立即就结束。否则它会又重头开始执行这个脚本的某些部分。  
注意两点:  
1. 子进程最好有一个exit;语句,防止不必要的出错;  
2. pcntl_fork间最好不要有其它语句,例如:
5. pcntl_wait ( int &$status [, int $options ] )  
阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:  
1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;  
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。 
6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )  
功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait 一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。 
子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。 
7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )  
取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。 
8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )  
设置进程的优先级。 
9. posix_kill  
可以给进程发送信号
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit, 它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它 已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外, 僵尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进 程结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。 但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。 任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。          

© 著作权归作者所有

旋转木马-千里马
粉丝 16
博文 83
码字总数 85714
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
workman 和swoole 区别 和异同

workerman workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室...

执杖天涯
2019/03/07
190
0
PHP多进程编程骨架 - PHPForker

PHPForker是一个PHP多进程编程骨架,借鉴了Workerman诸多优良编程思想,剥离了其中的网络事件库抽象部分,集中围绕多进程编程,为了便于直观的调试以及保持最轻的多进程骨架,所以简单的内嵌...

blogdaren
2018/10/20
1K
2
Websocket和PHP Socket编程

谈谈php中使用websocket-实例 http://blog.csdn.net/xueling022/article/details/52902358 本来是搜一些html5 websocket资料看的,结果被引去看了php的socket编程。下面是一些简单的例子,在...

mickelfeng
2014/10/28
207
2
PHP多进程处理并行处理任务实例(转,备用)

本文目的 本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步。 PHP多进程 通过pcntlXXX系列函数使用多进程功能。注意:pcntlXXX只能运行在php C...

osc_w1ib22jk
2018/02/04
5
0
PHP多进程学习(一)__来初步了解一下PHP多进程及简单demo

php是一门单进程弱类型的语言,PHP处理多并发主要是依赖服务器或PHP-FPM的多进程及它们进程的复用,多进程的作用优点大家可以去网上了解,PHP实现多进程在实际项目中意义也是不容小觑的。比如...

osc_ytd6v7iq
2018/01/30
9
0

没有更多内容

加载失败,请刷新页面

加载更多

Web前端 - Vue

<!-- id标识vue作用的范围 --><div id="app"> <!-- {{}} 插值表达式,绑定vue中的data数据 --> {{ message }}</div><script src="vue.min.js"></script><script> // 创建一个......

osc_7dwwmolq
25分钟前
9
0
至联云讲解《看IPFS数据存储优势》

近期,Youtube在与新冠病毒疫情错误信息做斗争的同时,也造成了一些“附带损害”,导致一些无辜的内容被错误删除。 Youtube删除了五段视频,其中两段是关于有争议的药物羟氯喹,另一段是关于...

雨中的IPFS
26分钟前
28
0
LNMPA 中PHP 连接MySQL,公网访问

一、前言 本文承接上一篇文章Centos 7 nginx+php 实现公网访问,实现LNMPA的环境配置。 在前文中,【4.3 修改端口】涉及了修改nginx 端口的问题,这里做一个补充。 问题说明: LNMPA 中的是A...

osc_i7pg9ead
27分钟前
8
0
puppet部署及应用

简介 puppet是一种Linux、Unix、windows平台的集中配置管理系统,使用自有的puppet描述语言,可管理配置文件、用户、cron任务、软件包、系统服务等。puppet把这些系统实体称之为资源,puppe...

osc_3grma05a
29分钟前
15
0
[ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

使用navicate12运行sql文件出错 报错: [ERR] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci' 1 报错原因: 生成转储文件的数据库版本为8.0,要导入sql文件的数据库版本为5.6,因为是高版本导...

osc_2wq8ft8d
30分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部