zoukankan      html  css  js  c++  java
  • 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无刷新上传图片和文件
    wamp(win1064位家庭版+apache2.4.20+php5.5.37+mysql5.5.50)环境搭建
    linux下常见解压缩命令
    nginx虚拟主机配置小结
    Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持
    iframe 高度自适应/以及在ie8中空白问题
    小程序-调用公共js对象方法/ app.js
    小程序-tabbar相关样式设置
    微信小程序连接无法跳转/ can not navigate to tabBar page错误
    微信小程序-tabBar无法显示问题解析
  • 原文地址:https://www.cnblogs.com/zbokett/p/8338196.html
Copyright © 2011-2022 走看看