【问题标题】:Is there a function similar to setTimeout() (JavaScript) for PHP?是否有类似于 PHP 的 setTimeout() (JavaScript) 的函数?
【发布时间】:2011-03-27 00:17:20
【问题描述】:

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

【问题讨论】:

  • 已经很晚了。但我回答了你的问题。现在在 php 5.5 之后你可以很容易地实现setTimeOut()。请检查并接受它作为问题的答案。它可能会帮助其他人。

标签: php javascript settimeout


【解决方案1】:

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

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

【讨论】:

  • 这有点难以解释——我想要的只是暂停脚本:) 基本上我想做的是“恶作剧”我的一个朋友。我已经输入了你的名字,当你提交一个聊天室时是模拟的,为了让它更真实,我希望来自陌生人的消息,我的朋友正在“交谈”,如果你知道的话,会一一出现我的意思:)
  • 定时事件没有意义,因为脚本在服务器端运行?我没有遵循这个论点。当然,由于缺乏并发性,它们在 PHP 中的用处不大,但是让脚本在特定时间后或某个时刻执行某些操作是有价值的。
  • @Latze 这听起来像是您想在客户端使用 JavaScript 做的事情,不是吗?
  • @Latze Then sleep 或者,对于更细粒度的控制 usleep,是一个合适的解决方案。
  • @Artefacto 我认为 timed 事件绝对没有用,因为无法预测脚本的流程和执行速度,所以没有什么可以反对的。 Event 事件(如“在每个 mysql 查询之后”或“在输出第一个数据字节之前”)可能在并发可能时有用,但 timing 只有在存在据我所知,人与人之间的互动。
【解决方案2】:

sleep 函数可以将脚本暂停一段确定的时间。

另请参阅usleeptime_nanosleeptime_sleep_until

【讨论】:

【解决方案3】:

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

【讨论】:

  • 但是 php 具有使您的特定脚本成为事件驱动的工具。例如,通过控制台运行 php,您可能希望在不同时间安排多个事件,此时设置超时非常有意义。
【解决方案4】:

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

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

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

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

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

4) PHP 中的非阻塞超时是可能的。 它可以通过带有超时参数的stream_select()函数来实现(参见reactphp/event-loop StreamSelectLoop::run()是如何实现的)。

5) 有一些 PHP 扩展,例如 libeventlibevevent,它们允许实现计时器(如果你想硬核的话)

【讨论】:

    【解决方案5】:

    不是,但你可以试试tick count function

    【讨论】:

      【解决方案6】:

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

      我没有注意到这个问题是从 2010 年开始的,而 evtimer 类是在 2012-2013 年开始编码的。所以作为一个老问题的更新,现在有一个类可以做到这一点,类似于 javascripts settimeout/setinterval。

      【讨论】:

        【解决方案7】:

        警告:您应该注意,虽然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);
        ?>
        

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

        执行的函数!

        【讨论】:

          【解决方案8】:

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

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

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

          【讨论】:

            【解决方案9】:

            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 sn-p

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

            使用 Amphp 将上述 Javascript sn-p 转换为 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;
            });
            

            【讨论】:

              【解决方案10】:

              看看这个!

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

              【讨论】:

                猜你喜欢
                • 2011-10-26
                • 2013-12-11
                • 1970-01-01
                • 1970-01-01
                • 2019-06-04
                • 2011-08-01
                • 1970-01-01
                • 2014-03-08
                • 2012-07-22
                相关资源
                最近更新 更多