因爲www用戶和root用戶(好比command的cli進程日誌)都有可能對log文件進行讀寫。php
若是是由www用戶建立的log文件,不會出任何問題。thinkphp
可是若是是先由root用戶建立的log文件,而後再到www用戶角色去寫,就會出問題了app
由於通常默認建立的log文件的權限是 -rw-r--r-函數
也就是www沒有權限去寫入root用戶建立的log文件。this
網上的方法大致就是像下面代碼同樣在mkdir的時候修改目錄的權限 調試
//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); }
可是上面只能修改文件夾的權限,並無修改文件夾下具體的.log文件的權限。日誌
【解決辦法】:code
修改文件:\thinkphp\library\think\log\driver\File.php裏的write()函數blog
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 Werben 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 Werben 20190704 end */ ... }