是否应该重用现有的PHP循环?

是否应该重用现有的PHP循环?,php,asynchronous,event-driven,reactphp,Php,Asynchronous,Event Driven,Reactphp,单个ReactPHP循环应该用于如下所示的多个目的,还是应该创建一个新循环并用于每个目的?如果重复使用,循环显然已经在运行,那么如何确保在完全配置之前(例如在我的process示例中(即$process->start($loop)和$process->stdout->on(…))之间)不会无意中执行循环呢 您应该只使用一个循环,并在应用程序中共享它。我通常做的是首先确保一切都已设置好,然后启动循环。例如,您可以使用事件调度器(如PSR-14)来实现这一点 感谢WyriHaximus,通常情况下,

单个ReactPHP循环应该用于如下所示的多个目的,还是应该创建一个新循环并用于每个目的?如果重复使用,循环显然已经在运行,那么如何确保在完全配置之前(例如在我的
process
示例中(即
$process->start($loop)
$process->stdout->on(…)
)之间)不会无意中执行循环呢


您应该只使用一个循环,并在应用程序中共享它。我通常做的是首先确保一切都已设置好,然后启动循环。例如,您可以使用事件调度器(如PSR-14)来实现这一点

感谢WyriHaximus,通常情况下,我总是先设置然后启动,但我需要启动一个计时器并在某些事件发生后执行一些子进程。感谢指向PSR-14事件调度器的指针。这就是ReactPHP的工作原理:您正在响应事件。事件循环的设计目的是,只要您给它一些事情做,它就会一直运行。因此,在运行时向其添加新内容(如子进程)是完全有效和预期的行为。事实上,套接字服务器在内部将所有新的传入连接添加到事件循环中,以便能够对其进行读写。PSR-14就是一个例子,做最适合您的架构和愿景的事情。
<?php

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server('127.0.0.1:8080', $loop);

$socket->on('connection', function (React\Socket\ConnectionInterface $connection) use($loop) {
    $connection->on('data', function ($data) use ($connection, $loop) {

        $loop->addTimer(10, function() {
            syslog(LOG_INFO, 'Do something upon non-repeating timer completion');
        });

        $process = new \React\ChildProcess\Process($cmd);
        $process->start($loop);
        $process->stdout->on('data', function ($chunk) {
            syslog(LOG_INFO, 'Do something with $chunk');
        });

    });
});

$loop->run();