以Composer安装的workerman的pid文件生成的位置很诡异

forgaoqiang
root@iZ2zeil:/opt/php# find ./ -name *.pid
./vendor/workerman/_opt_php_serv.php.pid

是不是考虑兼容下,这几个文件放置在项目根目录还是比较合理的,在vendor下就不太有意义的感觉了,是不是添加个判断啥的看看是不是PSR4模式?

从源码来看不只是pid文件,日志文件的路径也有这样的问题

        // Start file.
        $backtrace        = \debug_backtrace();
        static::$_startFile = $backtrace[\count($backtrace) - 1]['file'];

        $unique_prefix = \str_replace('/', '_', static::$_startFile);

        // Pid file.
        if (empty(static::$pidFile)) {
            static::$pidFile = __DIR__ . "/../$unique_prefix.pid";
        }

        // Log file.
        if (empty(static::$logFile)) {
            static::$logFile = __DIR__ . '/../workerman.log';
        }
        $log_file = (string)static::$logFile;
        if (!\is_file($log_file)) {
            \touch($log_file);
            \chmod($log_file, 0622);
        }

另外请教下使用 这里的debug_backtrace()如果仅仅是为了获取文件所在的位置,和使用 __FILE__ 有什么区别

1317 2 0
2个回答

walkor

感谢你的建议。
之前有考虑过项目根目录创建一个runtime目录,将pid和日志等放到runtime下。但是如果框架粗暴的更改pid位置,用户不停服务就升级后会导致正在运行的服务pid找不到,导致停止失败。所以一直没动这里。

__FILE__ 是获取当前文件,使用 debug_backtrace() 是因为要得到启动服务的入口文件start.php ,在框架里使用__FILE__得不到start.php文件位置

  • forgaoqiang 2021-07-26

    再问一个问题,新版本的workerman很多函数前面都有 \ ,比如上面的

    if (!\is_file($log_file)) {
    \touch($log_file);
    \chmod($log_file, 0622);
    }

    这个目的是什么呢,是为了结构更加清晰么,这些函数都是系统级的,不用指定命名空间也都可以直接调用吧

forgaoqiang

之前有考虑过项目根目录创建一个runtime目录,将pid和日志等放到runtime下。但是如果框架粗暴的更改pid位置,用户不停服务就升级后会导致正在运行的服务pid找不到,导致停止失败。所以一直没动这里。

这个原因特别有说服力,我发现尝试修改进程的 $processTitle 也有这个问题,直接导致找不到之前的程序

关于debug_backtrace()的多谢回复,原来如此

  • 暂无评论
年代过于久远,无法发表回答
🔝