通过其他功能中断功能

时间:2016-02-16 13:05:55

标签: php function symfony loops for-loop

我有一个symfony作业,它有两个功能: 发射和停止。 我的启动功能将从数据库导入联系人,例如4比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()
{

}

2 个答案:

答案 0 :(得分:2)

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

1:

在launch()

上保存具有进程ID的文件

在stop()上你可以检查是否存在并通过id

终止进程

2:

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

停止时设置此数据库条目

答案 1 :(得分:1)

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

您可以在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/