要确保在子目录下调用LogManager类时,保存的日志信息都在同一个文件中,可以通过以下几种方法来实现:
方法1:使用绝对路径
在创建LogManager对象时,指定日志文件的绝对路径。这样无论在哪个子目录调用,日志文件路径始终是固定的。
修改代码
将日志文件路径改为绝对路径,例如:
php复制
$logFile = '/path/to/your/logfile/LogManager.txt'; // 绝对路径
$gblogManager = new LogManager($logFile);
示例
假设你的项目结构如下:
复制
/project
/subdir
script.php
LogManager.php
LogManager.txt
在subdir/script.php中调用LogManager时:
php复制
require '../LogManager.php'; // 引入父目录中的LogManager.php

$logFile = DIR . '/../LogManager.txt'; // 使用绝对路径
$gblogManager = new LogManager($logFile);

// 记录日志
$gblogManager->log();

// 获取总访问次数
$totalVisits = $gblogManager->getTotalVisits();
echo "总访问次数: $totalVisits\n";
方法2:使用DIR动态生成路径
在LogManager类中,使用DIR动态生成日志文件的路径。这样无论在哪个目录调用,日志文件路径始终基于LogManager.php文件的位置。
修改LogManager.php
将日志文件路径改为基于DIR的相对路径:
php复制
<?php
class LogManager
{
private $logFile;

public function __construct($logFile)
{
    // 使用__DIR__动态生成日志文件路径
    $this->logFile = __DIR__ . '/' . $logFile;
}

// 记录日志
public function log()
{
    $timestamp = date('Y-m-d H:i:s');
    $ipAddress = $_SERVER['REMOTE_ADDR'];
    $requestUri = $_SERVER['REQUEST_URI'];
    $scriptName = basename($_SERVER['SCRIPT_NAME']); // 获取当前脚本文件名

    $logEntry = "$timestamp | $ipAddress | $requestUri | $scriptName\n";

    file_put_contents($this->logFile, $logEntry, FILE_APPEND);
}

// 获取总访问次数
public function getTotalVisits()
{
    if (!file_exists($this->logFile)) {
        return 0;
    }

    $logContent = file_get_contents($this->logFile);
    $lines = explode("\n", $logContent);

    return count($lines) - 1; // 减去最后一行的空行
}

}
调用示例
在子目录中调用时,只需指定日志文件的相对路径:
php复制
require '../LogManager.php'; // 引入父目录中的LogManager.php

$logFile = 'LogManager.txt'; // 相对路径,基于LogManager.php的位置
$gblogManager = new LogManager($logFile);

// 记录日志
$gblogManager->log();

// 获取总访问次数
$totalVisits = $gblogManager->getTotalVisits();
echo "总访问次数: $totalVisits\n";
方法3:配置文件
将日志文件路径存储在一个配置文件中,然后在LogManager类中读取配置文件中的路径。这样可以在一个地方集中管理日志文件路径,便于维护。
创建配置文件config.php
php复制
<?php
return [
'logFile' => DIR . '/LogManager.txt', // 绝对路径或基于DIR的相对路径
];
修改LogManager.php
从配置文件中读取日志文件路径:
php复制
<?php
require 'config.php'; // 引入配置文件

class LogManager
{
private $logFile;

public function __construct()
{
    $config = require 'config.php'; // 加载配置文件
    $this->logFile = $config['logFile'];
}

// 记录日志
public function log()
{
    $timestamp = date('Y-m-d H:i:s');
    $ipAddress = $_SERVER['REMOTE_ADDR'];
    $requestUri = $_SERVER['REQUEST_URI'];
    $scriptName = basename($_SERVER['SCRIPT_NAME']); // 获取当前脚本文件名

    $logEntry = "$timestamp | $ipAddress | $requestUri | $scriptName\n";

    file_put_contents($this->logFile, $logEntry, FILE_APPEND);
}

// 获取总访问次数
public function getTotalVisits()
{
    if (!file_exists($this->logFile)) {
        return 0;
    }

    $logContent = file_get_contents($this->logFile);
    $lines = explode("\n", $logContent);

    return count($lines) - 1; // 减去最后一行的空行
}

}
调用示例
在子目录中调用时,无需指定日志文件路径:
php复制
require '../LogManager.php'; // 引入父目录中的LogManager.php

$gblogManager = new LogManager();

// 记录日志
$gblogManager->log();

// 获取总访问次数
$totalVisits = $gblogManager->getTotalVisits();
echo "总访问次数: $totalVisits\n";
推荐方法
推荐使用方法2(使用DIR动态生成路径),因为它简单且灵活,不需要硬编码绝对路径,同时也能确保日志文件路径的正确性。