当前位置:首页 > 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 扩展,可以实现更高效的监控:

php 实现tailf

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 环境中使用时,需要确保输出缓冲和刷新机制正常工作

标签: phptailf
分享给朋友:

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现短信验证

php实现短信验证

PHP实现短信验证的步骤 选择合适的短信服务提供商 国内常见的短信服务提供商包括阿里云短信、腾讯云短信、云片等。注册账号并获取API密钥和签名模板是第一步。这些平台通常提供详细的开发文档和SDK。…

php实现多态

php实现多态

多态的概念 多态是面向对象编程的三大特性之一,指同一个方法在不同类中有不同实现方式。PHP通过继承和接口实现多态。 通过继承实现多态 父类定义方法,子类重写该方法实现不同行为: class Ani…

php 实现多继承

php 实现多继承

在PHP中,原生不支持多继承,但可以通过以下几种方法模拟实现类似多继承的功能: 使用 trait Trait是PHP 5.4引入的特性,允许在类中复用代码片段,可以视为一种轻量级的继承机制。一个类可…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…