剛執(zhí)行完composer update,核心workerman/webman-framework從1.6.9升級(jí)到1.6.14,項(xiàng)目啟動(dòng)后報(bào)錯(cuò),升級(jí)前是正常的。
根據(jù)日志我能看出來是我自定義的日志處理文件中使用了request()函數(shù)導(dǎo)致的,升級(jí)后不能這樣用了嗎?
我需要將日志根據(jù)請(qǐng)求創(chuàng)建在不同目錄中,現(xiàn)在如何實(shí)現(xiàn)呢?
D:\webman\WMProject>php windows.php
Fatal error: Uncaught Error: Typed static property Workerman\Worker::$eventLoopClass must not be accessed before initialization in D:\webman\WMProject\vendor\workerman\webman-framework\src\Context.php:75
Stack trace:
#0 D:\webman\WMProject\vendor\workerman\webman-framework\src\Context.php(63): Webman\Context::getKey()
#1 D:\webman\WMProject\vendor\workerman\webman-framework\src\Context.php(92): Webman\Context::getObject()
#2 D:\webman\WMProject\vendor\workerman\webman-framework\src\App.php(614): Webman\Context::get('Webman\\Http\\Req...')
#3 D:\webman\WMProject\vendor\workerman\webman-framework\src\support\helpers.php(323): Webman\App::request()
#4 D:\webman\WMProject\support\com\my\monolog\MonologHandler.php(44): request()
#5 D:\webman\WMProject\vendor\workerman\webman-framework\src\support\Log.php(93): support\com\my\monolog\MonologHandler->__construct(NULL, 10485760, 100, true, 420)
#6 D:\webman\WMProject\vendor\workerman\webman-framework\src\support\Log.php(77): support\Log::handler('support\\com\\pas...', Array, Array)
#7 D:\webman\WMProject\vendor\workerman\webman-framework\src\support\Log.php(55): support\Log::handlers(Array)
#8 D:\webman\WMProject\config\process.php(23): support\Log::channel()
#9 D:\webman\WMProject\vendor\workerman\webman-framework\src\Config.php(207): include('D:\\webman\\Pasis...')
#10 D:\webman\WMProject\vendor\workerman\webman-framework\src\Config.php(63): Webman\Config::loadFromDir('D:\\webman\\Pasis...', Array)
#11 D:\webman\WMProject\vendor\workerman\webman-framework\src\support\App.php(162): Webman\Config::load('D:\\webman\\Pasis...', Array)
#12 D:\webman\WMProject\windows.php(23): support\App::loadAllConfig(Array)
#13 {main}
config/log.php
use support\com\my\monolog\MonologHandler;
return [
// 日志保留天數(shù)(0代表永久保留)
'storage_day' => 180,
// 默認(rèn)日志通道
'default' => [
// 處理默認(rèn)通道的handler,可以設(shè)置多個(gè)
'handlers' => [
[
// 日志處理類
'class' => MonologHandler::class,
'constructor' => [
// 日志通道路徑
null,
// 單個(gè)日志文件大小 (默認(rèn) 10MB) 單位字節(jié)
10485760,
Monolog\Logger::DEBUG, // 日志級(jí)別
// 日志被當(dāng)前handler處理后是否接著向基類進(jìn)行傳遞
true,
// 寫文件權(quán)限
0644
],
// 日志格式化類及構(gòu)造函數(shù)參數(shù)
'formatter' => [
'class' => Monolog\Formatter\LineFormatter::class,
'constructor' => [null, 'Y-m-d H:i:s.u', true],
],
]
],
],
];
MonologHandler.php是自定義類,構(gòu)造函數(shù)如下
/**
* @param string $channelDirName 日志通道路徑
* @param int $maxFileSize 單個(gè)日志文件大小 (默認(rèn) 10MB)
* @param int $level 觸發(fā)此處理程序的最小日志記錄級(jí)別
* @param bool $bubble 日志被當(dāng)前handler處理后是否接著向基類進(jìn)行傳遞
* @param int|null $filePermission 寫文件權(quán)限 (默認(rèn) (0644) )
* @param bool $useLocking 寫日志時(shí)是否鎖定文件(默認(rèn) false)
*
* @throws Exception
*/
public function __construct($channelDirName = null, $maxFileSize = 10485760, $level = Logger::DEBUG, bool $bubble = true, int $filePermission = null, bool $useLocking = false)
{
// 請(qǐng)求對(duì)象
$request = request();
// 多應(yīng)用支持
if ($request && !empty($request->app)) {
$app = $request->app . DIRECTORY_SEPARATOR;
} else {
$app = 'cli' . DIRECTORY_SEPARATOR;
}
$this->runtimeLogPath = runtime_path() . DIRECTORY_SEPARATOR . 'logs' . DIRECTORY_SEPARATOR . $app . DIRECTORY_SEPARATOR;
$this->channelDirName = $channelDirName;
$dateDir = date('Ym') . DIRECTORY_SEPARATOR;
$filename = date('d') . '.log';
$fullFilePath = empty($channelDirName) ? $this->runtimeLogPath . $dateDir . $filename : $this->runtimeLogPath . $this->channelDirName . DIRECTORY_SEPARATOR . $dateDir . $filename;
$this->maxFileSize = (int)$maxFileSize;
if ($maxFileSize <= 0) {
throw new Exception('單個(gè)日志文件大小最小值為0!');
}
parent::__construct($fullFilePath, $level, $bubble, $filePermission, $useLocking);
}
Windows11,PHP8.3,workerman/webman最新版,workerman/webman-framework 1.6.14
等不上回復(fù)了,也沒時(shí)間深入逐行看代碼了,在MonologHandler.php類中對(duì)$request = request();外層增加了個(gè)try{}catch(){},先用著,先應(yīng)付著用