PHP中是否有类似setTimeout()(JavaScript)的函数?

t2a7ltrp  于 2023-04-19  发布在  PHP
关注(0)|答案(9)|浏览(210)

这个问题说明了一切-是否有一个函数与 PHPJavaScript 函数**setTimeout()**功能相同?我搜索了 * php.net *,似乎找不到任何...

s4n0splo

s4n0splo1#

没有办法延迟当前脚本中的部分代码的执行。这也没有多大意义,因为PHP脚本的处理完全在服务器端进行,你只会延迟脚本的整体执行。有sleep(),但这只会使进程暂停一段时间。
当然,您可以使用cron作业等方式安排PHP脚本在特定时间运行。

oalqel3c

oalqel3c2#

有一个sleep函数,它将脚本暂停一段确定的时间。
参见usleeptime_nanosleeptime_sleep_until

gmol1639

gmol16393#

PHP不是事件驱动的,所以setTimeout没有多大意义。你当然可以模仿它,事实上,有人已经写了一个Timer class你可以使用。但是在你开始在PHP的服务器端以这种方式编程之前,我会小心的。

34gzjxbg

34gzjxbg4#

关于PHP中的计时器,我想注意几点:

1)PHP中的计时器在长时间运行的脚本(守护进程,也许还有CLI脚本)中使用是有意义的。所以 * 如果你不是在开发那种应用程序,那么你就不需要计时器 *。
**2)定时器可以是阻塞的和非阻塞的。**如果您使用的是sleep(),那么它是阻塞定时器,因为您的脚本只是冻结了指定的时间。对于许多任务,阻塞定时器是可以的。例如,每10秒发送一次统计信息。阻塞脚本是可以的:

while (true) {
    sendStat();
    sleep(10);
}

3)非阻塞计时器仅在事件驱动的应用程序中有意义,如websocket-server。在此类应用程序中,事件可以随时发生(例如传入连接),因此您不能使用sleep()阻止您的应用程序为了达到这个目的,有一些事件循环库,比如reactphp/event-loop,它允许您以非阻塞方式处理多个流,并且还具有计时器/间隔功能。
**4)PHP中可以实现非阻塞超时。**可以通过带timeout参数的stream_select()函数实现(参见reactphp/event-loop StreamSelectLoop::run()中的实现)。
5)有PHP扩展libeventlibevevent允许定时器实现(如果你想去硬核)

km0tfn4u

km0tfn4u5#

不一定,但你可以试试tick count function

szqfcxe2

szqfcxe26#

http://php.net/manual/en/class.evtimer.php很可能就是你要找的,你可以在set interval期间有一个函数调用,类似于javascript中的setInterval。它是一个pecl扩展,如果你有whm/cpanel你可以通过pecl software/extension installer页面轻松安装它。
我没有注意到这个问题是从2010年开始的,evtimer类是在2012-2013年开始编码的。所以作为一个老问题的更新,现在有一个类可以做类似于javascript的settimeout/setinterval。

uelo1irk

uelo1irk7#

**警告:**您应该注意,虽然sleep命令可以使PHP进程挂起或“睡眠”一段给定的时间,但通常会在用户界面中实现视觉延迟。

由于PHP是一种服务器端语言,只需将其执行输出(通常以HTML的形式)写入Web服务器响应:以这种方式使用休眠通常只会停止或延迟响应。
话虽如此,sleep确实有实际的用途。延迟执行可以用来实现回退方案,例如在连接失败后重试请求时。一般来说,如果你需要在PHP中使用setTimeout,你可能做错了什么。

**解决方案:**如果您还想在PHP中实现setTimeout,明确回答您的问题:假设setTimeout有两个参数,一个表示要运行的函数,另一个表示时间量(以毫秒为单位)。下面的代码实际上可以满足您问题中的要求:

<?php
// Build the setTimeout function.
// This is the important part.
function setTimeout($fn, $timeout){
    // sleep for $timeout milliseconds.
    sleep(($timeout/1000));
    $fn();
}

// Some example function we want to run.
$someFunctionToExecute = function() {
    echo 'The function executed!';
}

// This will run the function after a 3 second sleep.
// We're using the functional property of first-class functions
// to pass the function that we wish to execute.
setTimeout($someFunctionToExecute, 3000);
?>

上述代码的输出将是3秒的延迟,然后是以下输出:
函数已执行!

smdnsysy

smdnsysy8#

如果你需要在执行一些php代码后做一个动作,你可以用echo来做

echo "Success.... <script>setTimeout(function(){alert('Hello')}, 3000);</script>";

因此在客户端(浏览器)中一段时间后,您可以做其他事情,例如重定向到另一个php脚本或回显警报

kulphzqa

kulphzqa9#

在PHP版本〉5.5中有一个Generator类,它提供了一个名为yield的函数,可以帮助您暂停并继续执行下一个函数。

generator-example.php

<?php
    function myGeneratorFunction()
    {
        echo "One","\n";
        yield;

        echo "Two","\n";
        yield;

        echo "Three","\n";
        yield;
    }

    // get our Generator object (remember, all generator function return
    // a generator object, and a generator function is any function that
    // uses the yield keyword)
    $iterator = myGeneratorFunction();

输出

One

如果要在第一个yield之后执行代码,则添加以下行

// get the current value of the iterator
    $value = $iterator->current();

    // get the next value of the iterator
    $value = $iterator->next();

    // and the value after that the next value of the iterator
    // $value = $iterator->next();

现在您将得到输出

One
Two

如果你每分钟都看到setTimeout()会创建一个事件循环。

在PHP中有很多库,例如amphp是一个流行的库,它提供了事件循环来异步执行代码。

Javascript代码片段

setTimeout(function () {
    console.log('After timeout');
}, 1000);

console.log('Before timeout');

使用Amphp将上面的Javascript代码段转换为PHP

Loop::run(function () {
    Loop::delay(1000, function () {
        echo date('H:i:s') . ' After timeout' . PHP_EOL;
    });
    echo date('H:i:s') . ' Before timeout' . PHP_EOL;
});

相关问题