Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用循环运行EV_Php_Libev - Fatal编程技术网

Php 使用循环运行EV

Php 使用循环运行EV,php,libev,Php,Libev,我正在尝试运行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_NOWA

我正在尝试运行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");
}

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

主应用程序

<?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);
        }
}

为什么要同时使用EVP和无限循环?我非常确定无限循环正在阻止事件循环的重新进入,我不知道为什么它首先需要存在。基本上,如果你使用EvPeriodic,你应该在循环中做任何事情,或者如果真的需要,使用额外的EvPeriodic。我运行无限循环的原因是它应该包含计算和生成需要每15分钟记录的数据的逻辑。然后将其分配给(全局?)变量$tolog,周期循环从该变量记录到文件。(旁白,上面的代码无法访问$tolog,但这是旁白)。要作为非全局变量访问该变量,您应该能够使用
use($tolog)
捕获它。但是我仍然不认为EvPeriodic可以运行一个中断来实现一些已经不是异步的东西,并且本机PHP代码也不是异步的。如果你真的想这样做,我想你可能必须研究光纤或放大器或类似的。不过,我会告诉管理员,我不是EvPeriodic的专家,所以我也可能是错的。@ChrisHaas-我想你是对的,我只是无法让它以我尝试的任何方式运行。将任何一个循环放在另一个循环中只会使预期的逻辑复杂化。顺便说一句,我不能让周期运行在所有运行_NOWAIT,但它运行与运行_一次。。。
<?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();