php定时执行操作及ob_flush()与flush()的使用

Posted zbokett

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php定时执行操作及ob_flush()与flush()的使用相关的知识,希望对你有一定的参考价值。

版权声明:本文为博主原创文章,未经博主允许不得转载。

http://blog.csdn.net/qq_38125058

一: 每隔30s执行一次,将字符串写入文件

// 30秒执行一次
    ignore_user_abort(true); //即使Client断开(如关掉浏览器),php脚本也可以继续执行.  
    set_time_limit(0); // 执行时间为无限制,php默认执行时间是30秒,可以让程序无限制的执行下去  
    $interval=30; //每隔30秒运行一次  
    do{  
        /**
        **要执行的操作 
        */ 
        // file_put_contents("D://log.log",123,FILE_APPEND);//记录日志
        sleep($interval); // 按设置的时间等待30秒循环执行      
        // 其他操作  
    }while(true);

注释:file_put_contents(“D://log.log”,$msg,FILE_APPEND);方法的作用是:将一个字符串写入文件。FILE_APPEND作用:如果文件已经存在,追加数据而不是覆盖。 
执行上述代码,可看到每隔30s在log.log文件中写入一个“123”的字符串。

二:每隔30s在页面显示字符串

// 30秒执行一次
ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.  
set_time_limit(0); // 执行时间为无限制,php默认执行时间是30秒,可以让程序无限制的执行下去  
$interval=30; // 每隔30秒运行一次  
do{  
    // 要执行的操作  
    echo "string";
    ob_flush();//把数据从PHP的缓冲(buffer)中释放出来。
    flush(); //把不在缓冲(buffer)中的或者说是被释放出来的数据发送到浏览器。
    sleep($interval); // 按设置的时间等待30秒循环执行      
    // 其他操作 
}while(true);

flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。顺序是先ob_flush(),然后flush(),它们的作用是刷新缓冲区。

buffer是一个内存地址空间,Linux系统默认大小一般为4096(1kb),即一个内存页。主要用于存储速度不同步的设备或者优先级不同的 设备之间传办理数据的区域。通过buffer,可以使进程这间的相互等待变少。 
当执行echo,print的时候,输出并没有立即通过tcp传给客户端浏览器显示, 而是将数据写入php buffer。php output_buffering机制,意味在tcp buffer之前,建立了一新的队列,数据必须经过该队列。当一个php buffer写满的时候,脚本进程会将php buffer中的输出数据交给系统内核交由tcp传给浏览器显示。所以,数据会依次写到这几个地方echo/pring -> php buffer -> tcp buffer -> browser

默认情况下,php buffer是开启的,而且该buffer默认值是4096,即1kb。你可以通过在php.ini配置文件中找到output_buffering配置.当echo,print等输出用户数据的时候,输出数据都会写入到php output_buffering中,直到output_buffering写满,会将这些数据通过tcp传送给浏览器显示。你也可以通过 ob_start()手动激活php output_buffering机制,使得即便输出超过了1kb数据,也不真的把数据交给tcp传给浏览器,因为ob_start()将php buffer空间设置到了足够大 。只有直到脚本结束,或者调用ob_end_flush函数,才会把数据发送给客户端浏览器。

在没有开启缓存时,脚本输出的内容都在服务器端处于等待输出的状态 ,flush()可以将等待输出的内容立即发送到客户端。 
开启缓存后,脚本输出的内容存入了输出缓存中 ,这时没有处于等待输出状态的内容,你直接使用flush()不会向客户端发出任何内容。而 ob_flush()的作用就是将本来存在输出缓存中的内容取出来,设置为等待输出状态,但不会直接发送到客户端 ,这时你就需要先使用 ob_flush()再使用flush(),客户端才能立即获得脚本的输出。

上述定时执行操作的代码程序并没有写结束判断语句,他会无限循环下去。

下面是改良方案:

三:30秒之后输出字符串”123”,循环停止。

    //30秒后执行一次
    ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.  
    set_time_limit(0); // 执行时间为无限制,php默认执行时间是30秒,可以让程序无限制的执行下去  
    $interval=30; // 每隔30秒运行一次  
    $status = 1;
    while ($status) {
        $status = 0;
        sleep($interval);
        echo "123";
        ob_flush();//把数据从PHP的缓冲(buffer)中释放出来。
        flush(); //把不在缓(buffer)中的或者说是被释放出来的数据发送到浏览器。  
    }
    exit();

个人感觉php定时执行任务的效率不是很高,所以不推荐使用。




以上是关于php定时执行操作及ob_flush()与flush()的使用的主要内容,如果未能解决你的问题,请参考以下文章

最详细的PHP flush()与ob_flush()的区别详解

PHP 缓冲区 ob_flush() 与 flush()

PHP IIS 环境 ob_flush()刷新缓冲区执行完才显示 解决办法,iis缓冲区原因

php函数ob_start(),解决header输出头报错问题

php ob_flush 和flush

ThinkPHP3.2.3 数据库备份与定时任务