:

thinkphp5日志文件权限的问题

song100e 发布于:2021-1-5 11:32 分类:ThinkPHP5  有 75 人浏览,获得评论 0 条 标签: ThinkPHP 

        由于 www 用户和 root (developer)用户(比如 command 的 cli 进程日志)都有可能对 log 文件进行读写。
如果是由 www 用户创建的 log 文件,不会出任何问题。但是如果是先由 root 用户创建的 log 文件,然后再到 www 用户角色去写,就会出问题了。因为一般默认创建的 log 文件的权限是  -rw-r--r-, 也就是 www 没有权限去写入 root 用户创建的 log 文件。网上的方法大体就是像下面代码一样在 mkdir 的时候修改目录的权限。但是只能修改文件夹的权限,并没有修改文件夹下具体的 .log 文件的权限。

//thinkphp/library/think/log/driver/File.php

$destination = $this->getMasterLogFile();
 
$path = dirname($destination);
if (PHP_SAPI != 'cli') {
     !is_dir($path) && mkdir($path, 0755, true);
}else{
     !is_dir($path) && mkdir($path, 0777, true) && chmod($path, 0777);
}


【解决办法】:修改文件:\thinkphp\library\think\log\driver\File.php 里的 write() 函数

protected function write($message, $destination, $apart = false, $append = false)
{
	...
	if (PHP_SAPI == 'cli') {
		$message = $this->parseCliLog($info);
	} else {
		// 添加调试日志
		$this->getDebugLog($info, $append, $apart);

		$message = $this->parseLog($info);
	}

	//return error_log($message, 3, $destination);

	/** 解决root生成的文件,www用户没有写权限的问题 by WbHuang 20190704 begin */
	if (!is_file($destination)) {
		$first = true;
	}

	$ret = error_log($message, 3, $destination);

	try {
		if (isset($first) && is_file($destination)) {
			chmod($destination, 0777);
			unset($first);
		}
	} catch (\Exception $e) { }
	return $ret;
	/** 解决root生成的文件,www用户没有写权限的问题 by WbHuang 20190704 end */
	...
}


赞助我,共同学习进步!