gpt4 book ai didi

linux - 管理 php 守护进程

转载 作者:IT王子 更新时间:2023-10-29 00:35:04 25 4
gpt4 key购买 nike

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

守护进程在操作系统启动后自动启动,并作为没有 php-fpm 池的 cli 应用程序工作。因此守护进程生态系统的基本思想是在没有 php-fpm 池(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;
}

问题。

由于无法从 Web 获得 PCNTL 函数,因此我通过 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

最佳答案

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

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

关于linux - 管理 php 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27325746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com