gpt4 book ai didi

javascript - 如何使用php函数 "file_get_contents"和服务器发送事件来监控服务器上文件的修改?

转载 作者:行者123 更新时间:2023-11-30 10:01:48 25 4
gpt4 key购买 nike

我想使用Server Sent Event对服务器上的一个文件进行实时监控,下面是javascript和php代码

$(function(){
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("./monitor_server_side.php");
var update = 0;
source.onmessage = function(e){
$('#monitor').html(e.data);
update++;
$('#update-time').html("updated " + update + " times");
};
source.onerror = function(e){
console.log(e);
}
}
else {
$('#no-update-warning').text("no update");
}
});


<?php
session_start();
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if(!isset($_SESSION['test']))
$_SESSION['test'] = 0;
$_SESSION['test']++;
if(isset($_SESSION['file_path']))
{
$time = date('r');
$file_path = $_SESSION['file_path'];
echo file_get_contents($_SESSION['file_path']);
}
flush();
?>

但是,如果我修改了$_SESSION['file_path']的文件内容,网页上显示的内容并没有更新。

如果我使用 w3schools.com 提供的以下 php 代码,一切顺利

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>

最佳答案

首先,SSE 是一个非常简单的协议(protocol),但您必须使用它需要的 7 个字节。因此,在您的 file_get_contents() 调用前加上 “data:” 并在其后缀加上 “\n\n”。除了 flush() 之外,还执行 ob_flush() 除非您可以 100% 确定 PHP 输出缓冲已关闭。

难题的另一部分是 PHP 脚本永远运行。对于文件监控脚本,您希望将其包装在 while(1){...} 循环中,并在该循环中放置某种 sleep 。

您需要注意 PHP session 是锁定的。所以(因为您的 PHP 脚本现在将永远运行)您想要从 session 中读取您需要的内容,然后通过调用 session_write_close(); 释放它。确保在进入 while(1){...} 循环之前执行此操作。

作为最后的改进,您只想在数据发生变化时发送数据,因此存储之前的字符串,与它进行比较,如果相同则跳过输出并直接进入 sleep .

这是完成所有这些修复后的代码:

<?php
session_start();
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
if(!isset($_SESSION['test']))
$_SESSION['test'] = 0;
$_SESSION['test']++;
if(!isset($_SESSION['file_path'])){
echo "data:Bad session\n\n";
exit;
}

$file_path = $_SESSION['file_path']
session_write_close();

$prev = '';

while(1)
{
$s = file_get_contents($file_path);
if($s != $prev){
echo "data:{$s}\n\n";
@ob_flush();@flush();
}
sleep(5); //Poll every 5 secs
}

关于javascript - 如何使用php函数 "file_get_contents"和服务器发送事件来监控服务器上文件的修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31228232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com