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

时间:2010-08-08 18:00:10

标签: php javascript settimeout

这个问题有点说 - 是否有一个函数与 PHP 函数 setTimeout()一样用于 PHP ?我搜索了 php.net ,我似乎找不到任何......

10 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:11)

sleep函数,它会在一段确定的时间内暂停脚本。

另请参阅usleeptime_nanosleeptime_sleep_until

答案 2 :(得分:10)

无法延迟执行当前脚本中的部分代码。这也没有多大意义,因为PHP脚本的处理完全在服务器端进行,你只会延迟脚本的整体执行。有sleep(),但这只会暂停一段时间。

当然,您可以使用cron作业等安排PHP脚本在特定时间运行。

答案 3 :(得分:8)

不是,但您可以尝试tick count function

答案 4 :(得分:7)

我想在PHP中注意关于计时器的一些事情:

1)PHP中的计时器在长时间运行的脚本中使用时很有意义(守护进程,也许在CLI脚本中)。所以如果您没有开发那种应用程序,那么您就不需要计时器

2)定时器可能会阻塞且无阻塞。如果您正在使用sleep(),那么它就是阻塞计时器,因为您的脚本只是冻结了一个指定的时间。 对于许多任务,阻止计时器是好的。例如,每10秒发送一次统计信息。可以阻止脚本:

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

3)非阻塞计时器仅在事件驱动的应用程序中有意义,例如websocket-server。在此类应用程序中,事件可以随时发生(例如传入连接),因此您不能使用sleep()(显然)阻止您的应用程序。 为此,有一些事件循环库,如reactphp/event-loop,它允许您以非阻塞方式处理多个流,并且还具有计时器/间隔功能。

4)PHP中的非阻塞超时是可能的。 它可以通过具有超时参数的stream_select()函数来实现(请参阅reactphp/event-loop StreamSelectLoop::run()中的实现方式)。

5)有libeventlibevevent这样的PHP扩展,允许定时器实现(如果你想去硬核)

答案 5 :(得分:3)

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

由于PHP是服务器端语言,只是将其执行输出(通常以HTML的形式)写入Web服务器响应:以这种方式使用sleep通常只会停止或延迟响应。

话虽如此,睡眠确实有实用的目的。延迟执行可用于实现退避方案,例如在连接失败后重试请求时。一般来说,如果你需要在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.
function someFunctionToExecute(){
    echo 'The function executed!';
}

// This will run the function after a 3 second sleep =>
// We're using an anonymous function to wrap the function
// which we wish to execute.
setTimeout(function(){
   someFunctionToExecute();
}, 3000);
?>

上述代码的输出将是三秒延迟,然后是以下输出:

  

执行的功能!

答案 6 :(得分:3)

http://php.net/manual/en/class.evtimer.php可能就是你要找的东西,你可以在设定的时间间隔内调用一个函数,类似于javascript中的setInterval。它是一个pecl扩展,如果你有whm / cpanel,你可以通过pecl软件/扩展安装页面轻松安装它。

我没有注意到这个问题是从2010年开始的,而evtimer课程在2012 - 2013年开始编码。因此,对旧问题的更新,现在有一个类可以执行类似于javascripts settimeout / setinterval。

答案 7 :(得分:2)

如果您在执行某些PHP代码后需要执行操作,则可以使用echo

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

所以在客户端(浏览器)中经过一段时间后,您可以执行其他操作,例如重定向到另一个PHP脚本或回显警报

答案 8 :(得分:0)

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

enter image description here

答案 9 :(得分:0)

看看这个!

<?php

set_time_limit(20);

while ($i<=10)
{
        echo "i=$i ";
        sleep(100);
        $i++;
}

?>

输出: i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10