Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-杀死由pcntl_fork启动的子进程_Php_Linux_Posix - Fatal编程技术网

PHP-杀死由pcntl_fork启动的子进程

PHP-杀死由pcntl_fork启动的子进程,php,linux,posix,Php,Linux,Posix,我使用pcntl_fork启动子进程,通过SMTP发送电子邮件 子进程使用PEAR邮件包发送电子邮件,但问题是,如果远程服务器不响应,则不管php.ini中设置了什么时间限制,该进程都会一直运行,等待响应 为了解决这个问题,我使用pcntl_报警函数在30秒后触发一个函数,如果子进程仍在运行,该函数将终止该子进程 function handlesig($sig) { global $pid,$node,$resend; posix_kill($pid,SIGKILL);

我使用pcntl_fork启动子进程,通过SMTP发送电子邮件

子进程使用PEAR邮件包发送电子邮件,但问题是,如果远程服务器不响应,则不管php.ini中设置了什么时间限制,该进程都会一直运行,等待响应

为了解决这个问题,我使用pcntl_报警函数在30秒后触发一个函数,如果子进程仍在运行,该函数将终止该子进程

function handlesig($sig) {
    global $pid,$node,$resend;
    posix_kill($pid,SIGKILL);
    mysql_query("insert into log (event) values ('Timed out!')");
}
当我杀死子进程时,虽然系统上留下了一个已失效的进程


我是否应该使用一个不同的信号来强制子进程在不等待连接的情况下死亡(因为连接永远不会结束),并避免建立失效的进程?

此问题的正常解决方案是使用配置良好的本地主机中继。 我通常做的是使用后缀设置本地主机释放

然后我会将电子邮件发送到本地中继,中继将其排队并尽快发送给收件人

将其发送到本地中继的好处是,您可以将其配置为转发电子邮件和其他回复

对于您关于失效的问题,据我所知,SIGKILL是关闭进程的一种非常困难的方法,您尝试过(SIGSTOP或SIGTSTP)吗


这样,家长就不会等待孩子的响应,你也不会有僵尸。在email_script.php中,处理您的电子邮件发送并将响应记录到一个文件中,您可以从父脚本或其他脚本中分析该文件。

如果您有僵尸孩子,这意味着您没有等待他们。不是PHP专家,但系统调用是
waitpid(2)
。e、 g.电话

waitpid(-1, NULL, WNOHANG);
时不时地,或每当您收到
SIGCHILD
。每次呼叫将收获最多一个僵尸。如果没有退出的孩子,WNOHANG会让它立即返回,而不是阻塞


wait
手册页有一个很好的注释部分,介绍了这一切是如何工作的。

要完成Peter的anwser,请查看

杀戮后只需这样做:
pcntl_waitpid($pid)

您需要如上所述等待它,或者使用

使子进程与父进程分离。我直接通过PHP发送的原因是,我可以获得响应并适当地处理它,以获得成功/软反弹/硬反弹。SIGTERM和SIGKILL是我知道的唯一信号,而SIGTERM不起作用,所以我使用了SIGKILL。我将尝试SIGSTOP/SIGTSTP.Hmm,我个人会在两个单独的脚本中执行此操作。一个用于通过本地smtp服务发送用于处理反弹的secound,这是一种自动弹出/获取脚本,用于处理反弹和成功。其中一个原因是将邮件发送到smtp的php脚本没有阻止web服务器child。例如,如果您最多有20个孩子,并且每个孩子都开始连接到外部源,则在再次释放孩子之前,没有其他服务可用。
waitpid(-1, NULL, WNOHANG);