首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由pcntl_fork启动的PHP杀伤子进程

问由pcntl_fork启动的PHP杀伤子进程
EN

Stack Overflow用户
提问于 2009-11-12 17:51:25
回答 5查看 11.8K关注 0票数 8

我正在使用pcntl_fork启动子进程,以便通过SMTP发送电子邮件。

子进程使用PEAR Mail package发送电子邮件,但问题是,如果远程服务器没有响应,无论php.ini中设置了什么时间限制,进程都会一直运行,等待响应。

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

代码语言:javascript
复制
function handlesig($sig) {
    global $pid,$node,$resend;
    posix_kill($pid,SIGKILL);
    mysql_query("insert into log (event) values ('Timed out!')");
}

但是,当我杀除子进程时,我在系统上留下了一个失效的进程。

有没有一个我应该使用的不同的信号,它仍然会强制子进程在不等待连接的情况下死亡(因为连接永远不会完成),并避免建立失效的进程?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-21 14:54:47

如上所述,您需要等待它,或者使用posix_setsid使子进程与父进程分离

票数 7
EN

Stack Overflow用户

发布于 2009-12-11 10:50:58

如果你有僵尸孩子,这意味着你不会为他们wait。不是PHP专家,但系统调用是waitpid(2)。例如,呼叫

代码语言:javascript
复制
waitpid(-1, NULL, WNOHANG);

时不时地,或者每当你得到SIGCHILD的时候。每一次呼叫最多会收获一个僵尸。如果没有退出的子级,WNOHANG使其立即返回,而不是阻塞。

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

票数 4
EN

Stack Overflow用户

发布于 2009-12-18 20:49:59

要完成Peter的anwser,请看pcntl_waitpid

只需在kill之后执行此操作:pcntl_waitpid($pid)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1721124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档