运行 带循环的 EvPeriodic

Running EvPeriodic with a loop

我正在尝试 运行 EvPeridoc 定期(每 15 分钟,即 900 秒)将数据记录到文件中。

<?php
$tolog = '';
$w = new EvPeriodic(fmod(Ev::now(), 900), 900, NULL, function($w, $revents)
{
    file_put_contents("log.txt", $tolog . PHP_EOL, FILE_APPEND | LOCK_EX);
});
Ev::run(Ev::RUN_NOWAIT);
echo "Started periodic @ " . date("Y-m-d h:i:sa") . PHP_EOL;
for (;;) {
    $tolog = "Update @ " . date("Y-m-d h:i:sa");
}

周期性从不触发,但应用程序进入 for 循环。 如果我将行 Ev::运行(Ev::RUN_NOWAIT); 更改为 Ev::运行() ; 然后脚本永远不会到达循环。

所以问题是我如何通过管道传输此代码才能每 15 分钟触发一次日志记录例程?

编辑: 只是为了澄清 - 该脚本末尾的无限循环生成要记录的数据(并将值分配给 $tolog gloabl 变量)。我希望 EvPeriodic 做的是每 15 分钟获取一次该(全局)变量并将其附加到文件中。

根据对该问题的评论,不可能同时使用无限循环(在我的生产应用程序中是流式 http 循环)和 Evperiodic。我通过使用 IPC 解决了这个问题,结果不得不 运行 单独脚本中的 EvPeriodic 代码。

主应用程序

<?php
$socket  = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '127.0.0.1', 15000);
socket_listen($socket);
socket_set_nonblock($socket);
$tolog= '';
for (;;){
        $tolog = "Update @ " . date("Y-m-d h:i:sa");
        if (($newc = socket_accept($socket)) !== false) {
                socket_write($newc, $tolog, strlen($tolog));
                socket_close($newc);
        }
}

具有 EvPeriodic 轮询主应用程序的 'client' 应用程序

<?php
$w = new EvPeriodic(fmod(Ev::now(), 15), 15, NULL, function($w, $revents){
        $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        socket_connect($sock, '127.0.0.1', 15000);
        $line = trim(socket_read($sock, 1024));
        file_put_contents("/var/log/cohocompanies.log", $line . PHP_EOL, FILE_APPEND | LOCK_EX);
        socket_close($sock);
});
Ev::run();