在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中每秒回显当前日期和时间以及磁盘上的可用空间的主要内容,如果未能解决你的问题,请参考以下文章

php / html为什么我不能在日期输入字段中回显变量日期?

显示当前时间

php:关于回显一个空变量

行不为空然后转到下一行以根据列中的当前日期粘贴数据

在 Laravel 中获取当前日期、时间和日期

如何使用视图在 php 中回显当前 Laravel 版本的版本?