【问题标题】:Managing php daemon管理 php 守护进程
【发布时间】:2014-12-05 22:31:03
【问题描述】:

如何在不将简单 cli 运行时更改为 php-fpm 的情况下从 Web 管理我的守护程序?

该守护进程在操作系统启动后自动启动,并作为没有 php-fpm 池的 cli-application 工作。所以daemon生态的基本思想是不用php-fpm pool(CLI-SAPI)。

服务器配置:

  1. Debian 7
  2. Apache 2.2
  3. php5-fpm (v 5.4.35) — mod_fastcgi
  4. daemon.php
  5. daemon_manager.php — 从命令行启动|停止|重新启动|杀死 daemon.php 的管理脚本。
  6. daemon_manager_web.php — 用于从浏览器管理守护程序的管理员脚本。

daemon.php 是一个常规的 php 守护进程,如下所示:

<?php
    declare(ticks=1);
    ini_set("max_execution_time", "0");
    ini_set("max_input_time",     "0");
    set_time_limit(0);
    /* Catching signals */
    function sig_handler($signo) {
        switch ($signo) {
            case SIGQUIT:
            case SIGTERM:
                // some work
        pcntl_wait($status);
                break;
            //...
        }
    }

    pcntl_signal(SIGTERM, 'signal_handler');
    pcntl_signal(SIGQUIT, 'signal_handler');

    $newpid = pcntl_fork();
    if ($newpid == -1) {
        throw new Exception('Cannot fork porcess');
    } elseif ($newpid) {
        print "Starting daemon under pid=$newpid\n";
        // ...
        exit;
    }

问题。

由于 PCNTL 函数不能从 Web 获得,我通过 exec()、shell_exec() 等函数来管理守护进程。但是当我在浏览器中使用 daemon_manager_web.php 停止并再次启动守护进程时,它通常会启动,但可以在 php-fpm 池下运行。

重启前的进程列表:

$ ps aux | grep php
root      5952  0.0  2.9  69008 14952 pts/0    S    14:24   0:00 php /var/www/daemon.php

$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
      Loaded: loaded (/etc/init.d/php5-fpm)
      Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
     Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/php5-fpm.service
              ├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
              ├ 9562 php-fpm: pool www
              ├ 9605 php-fpm: pool www
              └ 9633 php-fpm: pool www

从浏览器重启后的进程列表:

$ service php5-fpm status
php5-fpm.service - LSB: starts php5-fpm
      Loaded: loaded (/etc/init.d/php5-fpm)
      Active: active (running) since Fri, 05 Dec 2014 11:28:25 +0200; 11h ago
     Process: 1003 ExecStart=/etc/init.d/php5-fpm start (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/php5-fpm.service
              ├ 1627 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
              ├ 4987 php-fpm: pool www
              ├ 5040 php-fpm: pool www
              ├ 9432 php-fpm: pool www
              └ 9492 /usr/bin/php /var/www/daemon.php 

【问题讨论】:

  • 您正在使用 HTTP 启动一个守护进程?这没有任何意义,通过 CLI 启动脚本,如果必须通过套接字和信号与它“对话”。
  • 如果我想使用套接字管理守护进程,那么我必须创建套接字服务器并打开一些端口以与之通信。我认为它不安全。此方案还添加了另一个抽象的“谈话”层,不适合。

标签: linux daemon php apache2.2


【解决方案1】:

您应该以任何方式通过 Apache 启动守护程序。正确的方法是启动一个守护进程(例如,由supervisord 管理,我在生产中使用它有很好的记录)和opening a file socket(AF_UNIX),你在上面执行@987654323 @ 和空闲等待一些触发处理的输入。这样,“接口”(在 Apache 上)只是连接到套接字并写入。

关于这个话题,我发现用 PHP 编写守护进程非常乏味,您可能想选择一个库来为您处理细节(不能推荐任何),或者甚至是更适合事件循环的其他工具典型的守护进程(node.js?)

【讨论】:

  • 那么我应该打开文件套接字并在守护进程中使用 socket_select() 吗?或者我需要创建一个守护进程管理器(例如 supervisord)?您能告诉我更多有关沟通过程的信息吗?
  • @Slam 是的,你会在你的守护进程中打开套接字并在其中执行while(true),并一直使用socket_select() 检查套接字。您的客户端代码(在 Apache 中运行)将 fsockopen() 该套接字并写入它。
猜你喜欢
  • 2023-03-12
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
  • 2011-11-07
  • 2012-01-13
  • 2010-10-19
相关资源
最近更新 更多