通过其他函数中断一个函数



我有一个symfony工作,它有两个功能:启动和停止。我的启动功能将从数据库中导入联系人,例如 4 x 4 并向他们发送消息。

public function launchAction()
{
    $offset = 0;
    $limit = 4;
    $sizeData /= $limit;
    for( $i = 0; $i < $sizeData; $i++)
    {
        $contacts = $repository->getListByLimit($offset, $limit);
        $sender->setContacts($contacts);
        $sender->send();
        $offset += $limit;
    }
}

当我启动启动功能时,例如需要 20 秒才能导入消息并将其发送给所有联系人但是如果我想停止它,停止功能怎么能中断启动功能

public function stopAction()
{
}

我不会完全回答,但给你两个提示它是如何工作的

1:

在启动时保存具有进程 ID 的文件((

在 stop(( 上,您可以检查是否存在并通过 id 杀死进程

阿拉伯数字:

在 launch(( 上,您可以检查循环中的特定 db 条目,以便在存在值时中断

在停止时设置此数据库条目

如果您的唯一目的是能够停止脚本,我认为您不需要完整的事件循环实现。您可以侦听本地套接字,并在收到数据时中断。

例如,您可以在launchAction中运行它

public function launchAction()
{
    $offset = 0;
    $limit = 4;
    $sizeData /= $limit;
    // Init IPC connection
    $server = stream_socket_server("tcp://127.0.0.1:1337", $errno, $errorMessage);
    if ($server === false) {
        throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
    }
    for( $i = 0; $i < $sizeData; $i++)
    {
        // Check our socket for data
        $client = @stream_socket_accept($server);
        if ($client) {
            // Read sent data
            $data = fread($client, 1024);
            // Probably break
            if ($data === 'whatever') {
                break;
            }
        }
        $contacts = $repository->getListByLimit($offset, $limit);
        $sender->setContacts($contacts);
        $sender->send();
        $offset += $limit;
    }
    // Close socket after sending all messages
    fclose($client);
}

stopAction可以点击套接字来终止连接,如下所示:

public function stopAction()
{
    $socket = stream_socket_client('tcp://127.0.0.1:1337');
    fwrite($socket, 'whatever');
    fclose($socket);
}

如果您在同一台计算机上运行这两个函数,这应该有效。另请注意,PHP 只能侦听尚未被占用的套接字。因此,您可能需要更改端口号。如果您启动第二个进程以并行发送消息,则新进程将无法绑定到同一套接字。

一篇很棒的博客文章解释了一些细节 https://www.christophh.net/2012/07/24/php-socket-programming/

但是,如果您希望开始一个长时间运行的过程,我建议您查看ReactPHP,这是一个出色的事件循环实现,可以在几种不同的设置上运行。它还包括计时器和其他有用的库。

您可能想看看这个博客文章系列,以了解 https://blog.wyrihaximus.net/2015/01/reactphp-introduction/

最新更新