在php中每秒回显当前日期和时间以及磁盘上的可用空间
Posted
技术标签:
【中文标题】在php中每秒回显当前日期和时间以及磁盘上的可用空间【英文标题】:Echo current date and time and free space on disk every second in php 【发布时间】:2017-01-02 01:25:15 【问题描述】:我是 php 新手,我正在尝试获取当前日期和时间以及磁盘上的可用空间,并在网页上每秒更新一次。
对于我使用的日期和时间:date("d-m-Y H:i:s")
。
为了获得可用空间,我知道我可以使用将路径作为参数的diskfreespace()
函数。
就我而言,我正在尝试使用diskfreespace("C:")
。
它返回字节数,因为我有千兆字节的空间,所以我将字节数除以得到千兆字节数。
diskfreespace("C:") / pow(1024, 3)
虽然它只执行一次,但我希望该函数每秒执行一次并通过 echo
函数显示值。
然后我尝试使用 sleep() 为 1 秒的无限循环,但似乎存在问题,因为这些值不是每秒更新一次,而且页面似乎无法正确加载。
<?php
while(1)
echo "Current date and time: " . date("d-m-Y H:i:s");
echo "</br></br>Free space on C: disk " . (diskfreespace("C:") / pow(1024, 3)) . " Gb";
sleep(1);
?>
【问题讨论】:
我想它在循环中运行的 cpu 太高而永远无法输出缓冲区。 添加flush()
以(希望)刷新输出缓冲区并将数据发送到客户端。
1. “而且好像页面加载不正确” php.net/manual/en/function.ob-flush.php
我在我自己的电脑上测试这个,而不是在资源有限的共享主机上。
@EatPeanutButter 好吧,我正在使用 Chrome,并且有一个圆圈在旋转,就像在加载页面时一样,但它需要很多时间并且永远不会加载。它不显示任何内容。
【参考方案1】:
如果您使用Server Sent Events
,您可以连接到在无限循环中运行的 PHP 脚本,该循环将数据推送到 javascript 侦听器。
<?php
/*
diskspace_sse.php
*/
set_time_limit( 0 );
ini_set('auto_detect_line_endings', 1);
ini_set('max_execution_time', '0');
/* -- Edit to suit your location -- */
date_default_timezone_set( 'Europe/London' );
ob_end_clean();
/* -- set headers -- */
header('Content-Type: text/event-stream'); /* !important! */
header('Cache-Control: no-cache');
header('Access-Control-Allow-Credentials: true');
header('Access-Control-Allow-Methods: GET');
header('Access-Control-Expose-Headers: X-Events');
/* -- utility function to send formatted sse message -- */
if( !function_exists('sse_message') )
function sse_message( $evtname='gas', $data=null, $retry=1000 )
if( !is_null( $data ) )
echo "event:".$evtname."\r\n";
echo "retry:".$retry."\r\n";
echo "data:" . json_encode( $data, JSON_FORCE_OBJECT|JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS );
echo "\r\n\r\n";
/* -- How often to send messages -- */
$sleep=1;
$disk='c:';
while( true )
if( connection_status() != CONNECTION_NORMAL or connection_aborted() )
break;
/* Infinite loop is running - perform actions you need */
$payload=array(
'date' => date(DATE_COOKIE),
'diskspace' => disk_free_space($disk),
'totalspace'=> disk_total_space($disk),
'formatted_diskspace' => round( disk_free_space($disk) / pow( 1024,3 ), 2 ).'Gb',
'formatted_total' => round( disk_total_space($disk) / pow( 1024,3 ), 2 ).'Gb'
);
/* -- prepare sse message -- */
sse_message( 'diskspace', $payload );
/* -- Send output -- */
if( @ob_get_level() > 0 ) for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush();
@flush();
/* wait */
sleep( $sleep );
if( @ob_get_level() > 0 )
for( $i=0; $i < @ob_get_level(); $i++ ) @ob_flush();
@ob_end_clean();
?>
在您的 html 页面中
<div id='diskspace'></div>
<script type='text/javascript'>
function bindEvtSource()
var url='http://localhost/diskspace_sse.php';
if ( !!window.EventSource )
var evtSource = new EventSource( url );
evtSource.addEventListener( 'open', function(e)
console.log(e.type);
,false);
evtSource.addEventListener( 'error', function(e)
console.error('%o %s',e,e.type);
,false);
evtSource.addEventListener( 'diskspace', function(e)
var json=JSON.parse(e.data);
/* you could work with the json data here */
getobject('diskspace').innerHTML=e.data;
,false);
else
alert('Server Sent Events are not supported in this browser');
document.addEventListener( 'DOMContentLoaded', bindEvtSource, false );
</script>
您应该每秒收到有关磁盘空间使用情况的反馈,而页面加载时间不会(很少)减慢。
【讨论】:
我是 PHP 新手,虽然我在使用 JavaScript 之前还没有使用过 Ajax。从我读到的内容来看,SSE 在某种程度上类似于 Ajax,但更好,因为无论是否有来自服务器的新数据,它都不会因为在给定的时间间隔内轮询而产生开销。我缺乏一些基础知识,但我有点理解。我将不得不阅读更多关于它的信息并尝试一下。谢谢你的回答。 Ajax 有点不同——你发送一个请求,然后再发送响应。这是一次性的事情,因此为了获得持续的反馈,通常将 ajax 与setTimeout
一起使用,因此每 X 秒将发送/应答一个新请求。使用 SSE,您可以连接到 php 脚本(在本例中),它会将消息以 text/event-stream
的形式推送回 javascript 侦听器,而无需在客户端进行进一步的交互/函数调用。
errr - 我的意思是 setInterval
而不是 setTimeout
- 我的错误
我创建了 html 和 php 页面,确保将它们链接在一起。我看到 html 中有一个 var url。如果我打开 html 页面,我什么也看不到。如果我打开 php 页面,我会看到每秒以 JSON 格式回显的值。示例输出:pastebin.com/JbQUKLLZ。所以它似乎无法从 html 页面工作。【参考方案2】:
代码完成工作后,Echo 会显示结果。在您的情况下,它可能在控制台应用程序中工作,而不是在 Web 中。为了达到你的目标,你必须看看 ajax。在前端,您需要调用您的 php 代码并渲染结果。一秒钟后再做一次。
【讨论】:
【参考方案3】:检查this answer。
此外,您可能希望使用 AJAX 请求实现简单的轮询机制,而不是 PHP 中的无限循环。否则,根据您的服务器设置,您的无限循环可能会在一段时间后停止。见max_execution_time。
【讨论】:
以上是关于在php中每秒回显当前日期和时间以及磁盘上的可用空间的主要内容,如果未能解决你的问题,请参考以下文章