zoukankan      html  css  js  c++  java
  • (一)初步了解一下PHP多进程及简单demo

    要实现PHP的多进程,需要用到函数pcntl_fork,那么就需要开启扩展 pcntl和 posix

    入门须知

    • 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
    • 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
    • 僵尸进程危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
    • 已经产生的僵尸进程,解决方法:kill掉父进程,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源。

    切记!切记!切记!

    • PHP多进程一般应用在PHP_CLI命令行中执行php脚本,不要在web访问时使用。
    • 通过pcntl_XXX系列函数使用多进程功能。注意:pcntl_XXX只能运行在php CLI(命令行)环境下,在web服务器环境下,会出现无法预期的结果,请慎用!
    • 鸟哥提醒:也就是说, 打消你在PHP Web开发中使用多进程的念头吧

    demo

    pcntl_fork() — 在当前进程当前位置产生分支(子进程)。

    译注:fork是创建了一个子进程,父进程和子进程 都从fork的位置开始向下继续执行,不同的是父进程执行过程中,得到的fork返回值为子进程 号大于0,而子进程得到的是0

    posix_getpid() 获取当前进程id. pid 是process identity 缩写
    <?php
        $ppid = posix_getpid();
        $pid = pcntl_fork();
        if ($pid == -1) {
            echo 'fork子进程失败!';
        } elseif ($pid > 0) {
            echo "我是父进程,我的进程id是{$ppid}.";
            echo "
    ";
            sleep(20); // 保持20秒,确保能被ps查到
        }else{
            $cpid = posix_getpid();
            echo "我是{$ppid}的子进程,我的进程id是{$cpid}.";
            echo "
    ";
            sleep(20); // 保持20秒,确保能被ps查到
        }

    执行命令   php /www/index.php
      我是父进程,我的进程id是50.
      我是50的子进程,我的进程id是51.

  • 相关阅读:
    家长如何助力孩子适应小学生活
    一年级线上家长会
    gdb常用调试命令
    二叉树-后序遍历
    机器人
    Oracle创建只读账号的详细步骤
    ORACLE RAC日常运维-调整RAC+DG环境redo大小
    Redis 延迟分析
    oracle dataguard 重启步骤
    catalog start with + switch database to copy的妙用
  • 原文地址:https://www.cnblogs.com/zxqblogrecord/p/11949890.html
Copyright © 2011-2022 走看看