当前位置:首页 > PHP

php 实现tailf

2026-02-14 11:02:39PHP

实现 PHP 的 tail -f 功能

PHP 可以通过文件操作和循环实现类似 Linux tail -f 的功能,实时监控文件末尾的新增内容。

基本实现方法

使用 fopenfseek 和循环读取文件末尾内容:

$file = 'path/to/your/file.log';
$handle = fopen($file, 'r');

// 定位到文件末尾
fseek($handle, 0, SEEK_END);

while (true) {
    // 检查文件是否被修改
    clearstatcache();
    $currentSize = filesize($file);

    if ($currentSize > ftell($handle)) {
        // 读取新增内容
        $data = fread($handle, $currentSize - ftell($handle));
        echo $data;
        flush();
    }

    usleep(100000); // 暂停0.1秒
}

优化版本

添加文件旋转检查和错误处理:

function tail($file) {
    $handle = fopen($file, 'r');
    $lastPos = 0;
    $fileInode = fileinode($file);

    while (true) {
        clearstatcache();
        $currentInode = fileinode($file);

        // 检查文件是否被旋转
        if ($currentInode != $fileInode) {
            fclose($handle);
            $handle = fopen($file, 'r');
            $fileInode = $currentInode;
            $lastPos = 0;
        }

        $currentSize = filesize($file);

        if ($currentSize < $lastPos) {
            // 文件被截断
            $lastPos = 0;
        }

        if ($currentSize > $lastPos) {
            fseek($handle, $lastPos);
            while (!feof($handle)) {
                $line = fgets($handle);
                if ($line !== false) {
                    echo $line;
                    flush();
                }
            }
            $lastPos = ftell($handle);
        }

        usleep(100000);
    }
}

tail('path/to/your/file.log');

使用 inotify 扩展(更高效)

如果服务器支持 inotify 扩展,可以实现更高效的监控:

if (!extension_loaded('inotify')) {
    die('inotify extension not loaded');
}

$file = 'path/to/your/file.log';
$inotify = inotify_init();
$watch = inotify_add_watch($inotify, $file, IN_MODIFY);

$fp = fopen($file, 'r');
fseek($fp, 0, SEEK_END);

while (true) {
    $events = inotify_read($inotify);
    if ($events) {
        $data = fread($fp, 8192);
        echo $data;
        flush();
    }
    usleep(100000);
}

注意事项

  1. 脚本会无限运行,需要手动终止
  2. 确保 PHP 有权限读取目标文件
  3. 在生产环境中使用时,应考虑添加超时和错误处理机制
  4. 对于大文件,可能需要调整读取缓冲区大小
  5. 在 Web 环境中使用时,需要确保输出缓冲和刷新机制正常工作

php 实现tailf

标签: phptailf
分享给朋友:

相关文章

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart…

php实现推送

php实现推送

PHP 实现推送功能的方法 PHP 实现推送功能可以通过多种方式完成,包括 WebSocket、Server-Sent Events (SSE)、长轮询或第三方推送服务。以下是几种常见的方法: 使…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…