首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在运行线程时使用pcntl_signal关闭php进程

在运行线程时使用pcntl_signal关闭php进程
EN

Stack Overflow用户
提问于 2015-04-18 00:26:20
回答 1查看 1.3K关注 0票数 1

当运行线程时,在pcntl_signal中注册的函数永远不会被触发。

代码语言:javascript
复制
<?php
declare(ticks = 1);

class Task extends Thread {
    public function run () {
        while (1) sleep(1); // run forever
    }
}

function shutdown () { // never runs :(
    echo "Good bye!\n"; exit;
}

pcntl_signal(SIGTERM, 'shutdown');

$task = new Task;
$task->start();

然后,在航站楼:

代码语言:javascript
复制
# kill -TERM 123

当没有线程时,工作正常:

代码语言:javascript
复制
<?php
declare(ticks = 1);

class Task {
    public function run () {
        while (1) sleep(1); // run forever
    }
}

function shutdown () {
    echo "Good bye!\n"; exit;
}

pcntl_signal(SIGTERM, 'shutdown');

$task = new Task;
$task->run();

如何在运行线程时发送SIGTERM时执行一些代码?我使用的是: php-5.6.7,p线程-2.0.10,debian-7

EN

回答 1

Stack Overflow用户

发布于 2015-07-03 00:28:25

在试图加入线程时,主线程忽略了已注册的信号。这在本质上是在$task->start()之后发生的。

你必须做两件事:

  1. 想办法让你的主线程对信号做出反应。
  2. 停止线程的执行,这样它就不会阻止exit

至于1,您可以将主线程放在一个无休止的sleep循环中。虽然PHP是sleep,但它仍然可以对信号作出反应。

第二,您可以在kill函数中使用shutdown线程。

在代码中

$task->start()

代码语言:javascript
复制
for (;;) {
    sleep(PHP_INT_MAX);
}

更改后的shutdown函数:

代码语言:javascript
复制
function shutdown ()
{
    echo "Good bye!\n";
    $GLOBALS['task']->kill();
    exit;
}

注意:不要在现实世界中使用kill。找到一种让线程自行优雅终止的方法。

适切信号

我不建议使用declare(ticks = 1),因为它不利于性能。尝试使用派遣()代替,例如,在sleep之后。

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

https://stackoverflow.com/questions/29711473

复制
相关文章

相似问题

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