如何每5秒做一次php函数循环

时间:2015-10-17 10:04:29

标签: php

我正在制作一个php函数,每秒使用php更新其他语言,只有纯PHP代码。

     <p> Follow us on: </p>
              <ul>
                <li><a href="#"><i class="fa fa-facebook-official fa-2x"></i></a> </li>
                <li><a href="#"><i class="fa fa-twitter-square fa-2x"></i></a> </li>
</ul>

我希望它每秒返回一个值。喜欢每秒更新一次。

6 个答案:

答案 0 :(得分:3)

 public void GeneratePO1()
        {
            // get the datatable from Viewstate
            DataTable myDS = (DataTable)ViewState["BomData"];

            //create a new datatable to store New Selected Items
            DataTable dt = new DataTable();

            //clone the schme of the Orginal Datatble to new one
            dt = myDS.Clone();

            //Loop through each gridviewrows to find the Rows where checkbox column is checked
            foreach (GridViewRow di in tbl_bom.Rows)
            {
                CheckBox chkBx = (CheckBox)di.FindControl("chk_select");

                if (chkBx != null && chkBx.Checked)
                {
                    //get the uniqueID of that row
                    int skudetpk = int.Parse((di.FindControl("lbl_skudetpk") as Label).Text);

                    //create a new datarow for dt
                    DataRow dr = dt.NewRow();

                    //query the orginal datatable and put it in new data row
                    dr = myDS.Select("SkuDet_pk=" + skudetpk + "").Single();//Error occurs here

                    //import the datarow to datatable
                    dt.ImportRow(dr);

                }
            }

            Session["ItemforPO"] = dt;
        }

使用睡眠功能让执行睡眠5秒

如果使用setInterval并使用ajax执行操作

会更好

答案 1 :(得分:2)

sleep()函数是您正在寻找的函数:

while (true) {
    my_function(); // Call your function
    sleep(5);
}
  1. while循环始终为true
  2. 在循环中调用您的函数
  3. 等待5秒钟(睡眠)
  4. 返回循环的开头
  5. 顺便说一下,如果您通过Web协议(HTTP,HTTPS等)执行脚本,那么PHP中的无限循环不是逻辑用例,因为您将获得timeout。合理用例可以是定期数据库更新程序或Web爬网程序。

    如果您坚持使用Web协议执行脚本,则可以使用php myscript.php通过命令行执行此类脚本,或使用set_time_limit替代(但不推荐)方式扩展限制。

答案 2 :(得分:2)

对于应用程序服务器(不是Web服务器),最佳实践是使用事件循环模式而不是睡眠。这使您能够在需要时运行多个计时器(睡眠正在阻塞,因此在此期间其他任何东西都无法运行)。另一方面,Web服务器实际上不应执行任何长时间运行的脚本。

虽然其他语言为您提供了事件循环的开箱即用的功能(例如,使用setInterval的node / js),但PHP却没有,因此您必须使用众所周知的库或自行创建。 React PHP是PHP中广泛使用的事件循环。

这是事件循环的一种肮脏的“ hello world”实现方式

define("INTERVAL", (5 * 1000000) ); // 5 seconds in microseconds

function exp() { // Your function to run every 5 seconds
    echo "something\n";
}

function checkForStopFlag() { // completely optional
    // Logic to check for a program-exit flag
    // Could be via socket or file etc 
}

function start() {
    $active = true;
    $nextTime   = microtime(true) + INTERVAL; // Set initial delay

    while($active) {
        usleep(1000); // optional, if you want to be considerate

        if (microtime(true) >= $nextTime) {
            exp();
            $nextTime = microtime(true) + INTERVAL;
        }

        // Do other stuff (you can have as many other timers as you want)           

        $active = checkForStopFlag();
    }
}

start();

在现实世界中,您会在课堂上用所有的哨子和铃铛很好地封装它。

有关线程的字词:

PHP在后台是单线程的(任何OS线程都必须由程序员手动管理,这会带来很大的学习难度)。因此,事件循环中的每个任务都将承担随后的任务。另一方面,例如,Node在后台管理OS线程,从而消除了程序员的“烦恼”(这是很多争论的话题)。因此,当您调用setInterval()时,引擎将发挥其魔力,以便您的其他javascript可以同时运行。

最后的快速注释: 可以说,如果您只想让一个函数每5秒钟执行某项操作,那么这种模式就显得过大了。但是在开始需要并发计时器的情况下,sleep()将不是正确的工具。

答案 3 :(得分:1)

在PHP中创建它是不可取的,尝试通过计算从数据库获得的时间与当前时间之间的差异来在客户端进行。 你可以在JS中这样做:

setInterval(function(){
      // method to be executed;
    },5000);  // run every 5 seconds

答案 4 :(得分:1)

假设exp()是你的函数

function exp(){
 //do something
}

现在我们开始一个do-while循环

$status=TRUE;

do { 

   exp(); // Call your function
   sleep(5);   //wait for 5 sec for next function call

   //you can set $status as FALSE if you want get out of this loop.

   //if(somecondition){
   //    $status=FALSE:
   //}

} while($status==TRUE); //loop will run infinite

我希望这个有用:)

答案 5 :(得分:0)

$t0  = microtime(true);
$i   = 0;
do{     
    $dt = round(microtime(true)-$t0);
    if($dt!= $i){
        $i = $dt;
        if(($i % 5) == 0) //every 5 seconds
            echo $i.PHP_EOL;
    }   
}while($dt<10); //max execution time