具体原因没有找到,怀疑是workerman的bug。
需求是workerman 里的业务逻辑代码需要写日志,贪图方便,用echo var_dump输出。
但是workerman默认不记录。
logFile默认在Workerman上一级目录里。stdoutFile默认是/dev/null 也即是不保存
所以,自己写了一个方法,直接写入文件。追加到原先的日志里。
以下代码加到Events.php的Events类后面:
/**
* 打印日志
* @return void
*/
if (!function_exists('_do_log')) {
function _do_log($msg, $type='默认')
{
$str = date('Y-m-d H:i:s') . PHP_EOL
. '类型:' . $type . PHP_EOL
. arraytostr($msg) . PHP_EOL;
file_put_contents('./Applications/make_speed/'.date('Y-m-d').'log.log', $str, FILE_APPEND);
}
}
// 数组转合适的字符串输入
function arraytostr($data)
{
$str = '';
if (is_array($data)) {
$str .= '[';
foreach ($data as $key => $value) {
if (is_array($value)) {
$str .= $key .' => '.arraytostr($value).',';
} else {
$str .= $key .' => '.$value.',';
}
}
$str = rtrim($str, ',');
$str .= ']';
} else {
$str = (string) $data;
}
return $str;
}
谢谢分享。
这里面有一个小问题,就是日志目录需要手动创建。建议改为自动创建。
另外,我对代码做了适当调整。
打印日志内容如下:
下面是经过我优化的代码,增加了自动创建目录,增加了日志的级别。
php-cli相对路径和php-fpm不一样,php-fpm是相对于当前文件。php-cli是相对于执行目录。
例如在 /path/a/目录下 执行reload.sh,file_put_contents('./Applications/make_speed/'.date('Y-m-d').'log.log',...) 会写到 /path/a/Applications 下,在/path/目录下执行reload.sh会写到 /path/Applications 下。这就是为啥感觉日志不写了,因为可能写到其它目录去了。
解决办法,绝对路径,file_put_contents(绝对路径, ...);