分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

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

发布时间:2023-09-06 01:38责任编辑:顾先生关键词:暂无标签

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

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()的使用

原文地址:https://www.cnblogs.com/zbokett/p/8338196.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved