PHP多进程API

创建子进程

  1. @params void
  2. @returns int
  3. int pcntl_fork(void)
  4. 成功时,在父进程执行线程内返回产生的子进程PID,在子进程执行线程内返回0,失败时,在父进程上下文返回-1,不会创建子进程,并且会引发一个php错误

获取当前进程id

  1. @params void
  2. @returns int
  3. int posix_getpid(void)
  4. 返回进程id,类型为整型

父进程等待子进程退出

  1. @params $status
  2. @params $option
  3. @return bool
  4. int pcntl_wait(int &$status[,int $options=0])
  5. 该函数等同于以-1作为参数pid的值并且没有options参数来调用pcntl_waitpid()的函数

进程退出状态

  1. @params $status
  2. @return bool
  3. bool pcntl_wifexited(int $status)

进程退出码

  1. @params $status
  2. @return int
  3. int pcntl_wexitstatus(int $status)

简单PHP多进程示例

  1. function process_execute($input) {
  2. $pid = pcntl_fork(); //创建子进程
  3. if ($pid == 0) {//子进程
  4. $pid = posix_getpid();
  5. echo "* Process {$pid} was created, and Executed:\n\n";
  6. eval($input); //解析命令
  7. exit;
  8. } else {//主进程
  9. $pid = pcntl_wait($status, WUNTRACED); //取得子进程结束状态
  10. if (pcntl_wifexited($status)) {
  11. echo "\n\n* Sub process: {$pid} exited with {$status}";
  12. }
  13. }

通过调用php创建子进程接口完成一个子进程的创建,pcntl_fork返回值为0证明进入到子进程内,非0则进入到父进程内部,-1则父进程创建子进程失败。

多个子进程初级版本示例

  1. foreach ($clusterList as $key=>$value) {
  2. $pid = pcntl_fork();//创建子进程
  3. if($pid == 0) {//子进程
  4. //do something
  5. } else if($pid == -1) {
  6. //fork error occured
  7. } else {
  8. pcntl_wait($status);
  9. }
  10. }

该实现方式主要逻辑为循环创建一个子进程,并且父进程等待子进程完成退出后,再继续创建下一个子进程

缺点:无法真正体现多进程,实际上时串行的创建子进程

多个子进程优化版本示例

  1. foreach ($clusterList as $key=>$value) {
  2. $pid = pcntl_fork();//创建子进程
  3. if($pid == 0) {//子进程
  4. //do something
  5. } else if($pid == -1) {
  6. return false;
  7. }
  8. }
  9. for (;;) {
  10. $ret = pcntl_waitpid(-1,$status,WNOHANG);
  11. if ($ret == -1) {
  12. // error occured
  13. } else if ($ret == 0) {
  14. //all child are existed
  15. break;
  16. } else {
  17. //check sub process exit status
  18. $extFlag = pcntl_wifexited($status);
  19. if(!$extFlag){
  20. //exited unnormally
  21. }else {
  22. $extCode = pcntl_wexitstatus($status);
  23. //exited normally
  24. }
  25. }
  26. }

该逻辑通过for循环不断获取子进程的退出状态,直到所有的子进程都退出,真正实现多进程处理。

php多进程编程实现与优化的更多相关文章

  1. 浅谈自底向上的Shell脚本编程及效率优化

    作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...

  2. PHP多进程编程实例

    这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...

  3. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  4. Linux下的多进程编程

    1.进程 1.1进程的定义 <计算机操作系统>这门课对进程有这样的描述:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统 ...

  5. Android 多进程编程 15问15答!

    ps:阅读本文 需要对android 多进程编程有一定了解. 1.Android中总共有几种方式进行IPC? 答:一共有两种,一种是binder 还有一种是socket.Binder 大家用的比较多. ...

  6. 嵌入式linux多进程编程

    嵌入式linux多进程编程 在主程序显示文本菜单.提供例如以下服务.要求每一个服务都通过生成子进程来提供. 服务包含:日历信息显示,日期信息显示,推断闰年服务,文件复制功能,数字排序功能.退出功能. ...

  7. Linux高性能server规划——多进程编程

    多进程编程 多进程编程包含例如以下内容: 复制进程影映像的fork系统调用和替换进程映像的exec系列系统调用. 僵尸进程以及怎样避免僵尸进程 进程间通信(Inter-Process Communic ...

  8. php多进程编程详解

    php多进程编程 前言 php单进程存在的问题: 多核处理器未充分利用,而单处理器通常需要等待其他操作完成之后才能再继续工作. 任何现代操作系统都可在幕后执行多任务,这意味着在很短时间内,计算机可以调 ...

  9. 【转】Python多进程编程

    [转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...

随机推荐

  1. 在弹框中获取foreach中遍历的id值,并传递给地址栏。

    1.php有时候我们需要再弹框中获取foreach中遍历的数据(例如id),在弹框中点击按钮并传递给地址栏跳转.那么应该怎么做呢. 2. 点击取现按钮,如果没有设置密码->弹框 3. 点击去设置 ...

  2. 探索canvas画布绘制技术

    图片来自KrzysztofBanaś 下面我们开始尝试研究不同的绘图风格和技术 - 边缘平滑,贝塞尔曲线,墨水和粉笔,笔和印章和图案 -等等.事实证明,网上没有太多关于此的内容.在下面的示例中,您请大 ...

  3. GIS平台结构设计

    前言: WebGIS由于技术发展和功能定位的原因,一般在进行架构设计的时候更多地考虑是否容易实现.用户交互.数据传输方便.渲染效果等方面,对强GIS的应用考虑得少,所以架构上与桌面的GIS平台很不一样 ...

  4. SSH反向代理转发至内网msf

    前言 买了个便宜的 vps , 在上面装 msf 也装不上,于是想着把端口映射到内网来. 正文 拓扑如下: 首先在内网主机 B ssh -fCNR 7281:localhost:5000 root@C ...

  5. 一、ionic 图片轮播问题

    使用ion-slide可以实现图片轮播,但是如果在html中仅仅增加ion-slide是远远不够的,会出现两个问题:图片加载不出来和图片轮播至最后一个不轮播的问题 1.如何解决图片加载不出来的问题 i ...

  6. spring boot(3)-Rest风格接口

    Rest接口 虽然现在还有很多人在用jsp,但是其实这种动态页面早已过时,现在前端流行的是静态HTML+ rest接口(json格式).当然,如果是单台服务器,用动态还是静态页面可能没什么很大区别,但 ...

  7. TPS和事务响应时间的关系、计算公式 (转)

    例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车1.请问1秒钟最多能进几辆车?   TPS=102.每辆车需要多长时间进行响应?   reponse time = 13.改成20辆车,每秒能进 ...

  8. 服务器编程入门(13) Linux套接字设置超时的三种方法

    摘要:     本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...

  9. cmd pyhton

    在cmd中运行python解释器: 1.同时执行多条指令,可在多条指令中间使用 & 连接 >>> print('123') &print('223') 123 223

  10. 掷骰子游戏窗体实现--Java初级小项目

    掷骰子 **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰 ...