繁体   English   中英

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

[英]Is there a function similar to setTimeout() (JavaScript) for PHP?

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

sleep功能,它可以将脚本暂停一段确定的时间。

另见usleeptime_nanosleeptime_sleep_until

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

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

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

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

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

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) 有 PHP 扩展,libeventlibevevent允许定时器实现(如果你想成为硬核)

不是真的,但你可以试试滴答计数功能

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

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

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

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

话虽如此,睡眠确实有实际用途。 延迟执行可用于实现回退方案,例如在连接失败后重试请求时。 一般来说,如果你需要在 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);
?>

上面代码的输出会延迟三秒,然后输出如下:

函数执行了!

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

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

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

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

生成器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;
});

在此处输入图片说明

看一下这个!

<?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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM