资讯专栏INFORMATION COLUMN

PHP多进程系列笔记(四)

Cc_2011 / 2646人阅读

摘要:本节主要讲解常用函数和进程池的概念,也会涉及到守护进程的知识。所以任何时候,建议预先创建好进程,也就是使用进程池的方式实现。

本节主要讲解Posix常用函数和进程池的概念,也会涉及到守护进程的知识。本节难度较低。

Posix常用函数 posix_kill

向指定pid进程发送信号。成功时返回 TRUE , 或者在失败时返回 FALSE

bool posix_kill ( int $pid , int $sig )

$sig=0,可以检测进程是否存在,不会发送信号。

示例:

//向当前进程发送SIGUSR1信号
posix_kill ( posix_getpid (),  SIGUSR1 );
注:通过 kill -l 可以看到Linux下所有的信号常量。
posix_getpid

返回当前进程id。

posix_getppid

返回父进程id。

posix_setsid

设置新会话组长,脱离终端。成功时返回session id,失败返回 -1。写守护进程(Daemon) 用到该函数。下面引用Workerman源代码里的一段示例:

function daemonize(){
    umask(0);
    $pid = pcntl_fork();
    if (-1 === $pid) {
        die("fork fail");
    } elseif ($pid > 0) {
        exit(0);
    }
    
    if (-1 === posix_setsid()) {
        die("setsid fail");
    }
    
    // Fork again avoid SVR4 system regain the control of terminal.
    $pid = pcntl_fork();
    if (-1 === $pid) {
        die("fork fail");
    } elseif (0 !== $pid) {
        exit(0);
    }
}

如果程序需要以守护进程的方式执行,在业务代码之前调用该函数即可。


防盗版声明:本文系原创文章,发布于公众号飞鸿影的博客(fhyblog)及博客园,转载需作者同意。


进程池

什么是进程池? 其实是很简单的概念,就是预先创建一组子进程,当有新任务来时,系统通过调配该组进程中的某个子进程完成此任务。

前面几节的示例里我们都是使用这种方式,预先创建好进程,而不是动态创建。

引入《Linux高性能服务器编程》的一段话,描述动态创建进程的缺点:

动态创建进程(或线程)比较耗费时间,这将导致较慢的客户响应。

动态创建的子进程通常只用来为一个客户服务,这样导致了系统上产生大量的细微进程(或线程)。进程和线程间的切换将消耗大量CPU时间。

动态创建的子进程是当前进程的完整映像,当前进程必须谨慎的管理其分配的文件描述符和堆内存等系统资源,否则子进程可能复制这些资源,从而使系统的可用资源急剧下降,进而影响服务器的性能。

所以任何时候,建议预先创建好进程,也就是使用进程池的方式实现。

像我们熟知的php-fpm还支持最大创建多少个进程、初始创建多少个进程这种方式,大家感兴趣可以研究研究。

(未完待续)


欢迎关注公众号及时获取最新文章推送!


推荐!每月仅需$2.5,即可拥有配置SSD的VPS!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28924.html

相关文章

  • PHP进程系列笔记(五)

    摘要:消息队列更常见的用途是主进程分配任务,子进程消费执行。子进程前面加了个,这是为了防止父进程还未往消息队列中加入内容直接退出。 前面几节都是讲解pcntl扩展实现的多进程程序。本节给大家介绍swoole扩展的swoole_process模块。 swoole多进程 swoole_process 是swoole提供的进程管理模块,用来替代PHP的pcntl扩展。 首先,确保安装的swoole...

    qianfeng 评论0 收藏0
  • PHP进程系列笔记(一)

    摘要:用于创建子进程。该函数阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。注意处需要注意子进程需要防止子进程也进入循环。如果没有,最终创建的子进程不只个。 本系列文章将向大家讲解pcntl_*系列函数,从而更深入的理解进程相关知识。 PCNTL在PHP中进程控制支持默认是关闭的。您需要使用 --enable-pcntl 配置选项重新编译PHP的 CGI或CLI版本...

    ddongjian0000 评论0 收藏0
  • PHP进程系列笔记(二)

    摘要:任何进程在退出前使用退出都会变成僵尸进程用于保存进程的状态等信息,然后由进程接管。这时候就算手动结束脚本程序也无法关闭这个僵尸子进程了。那么子进程结束后,没有回收,就产生僵尸进程了。本小节我们通过安装信号处理函数来解决僵尸进程问题。 上一篇文章讲解了pcntl_fork和pcntl_wait两个函数的使用,本篇继续讲解PHP多进程相关新知识。 僵尸(zombie)进程 这里说下僵尸进程...

    CatalpaFlat 评论0 收藏0
  • PHP 进程系列笔记(三)

    摘要:本节讲解几个多进程的实例。新开终端,我们使用命令查看进程可以看到个进程个主进程,个子进程。使用命令结束子进程,主进程会重新拉起一个新的子进程。 本节讲解几个多进程的实例。 多进程实例 Master-Worker结构 下面例子实现了简单的多进程管理: 支持设置最大子进程数 Master-Worker结构:Worker挂掉,Master进程会重新创建一个

    focusj 评论0 收藏0
  • Swoole笔记(一)

    摘要:修复添加超过万个以上定时器时发生崩溃的问题增加模块,下高性能序列化库修复监听端口设置无效的问题等。线程来处理网络事件轮询,读取数据。当的三次握手成功了以后,由这个线程将连接成功的消息告诉进程,再由进程转交给进程。此时进程触发事件。 本文示例代码详见:https://github.com/52fhy/swoo...。 简介 Swoole是一个PHP扩展,提供了PHP语言的异步多线程服务器...

    SHERlocked93 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<