webman触发reload后文件没有更新

xianjinrenshi

问题描述

有个文件是记录错误码的静态类文件,放在support文件夹下面,命名空间是support/ErrorCode,当ErrorCode文件修改时,可以看到触发了reload,但是实际上新增的静态属性并不能访问,只有在restart后才能正常访问。

程序代码或配置

<?php

namespace support;

/**
 *
 */
class ErrorCode
{

    /**
     * 系统错误
     * @start 1000
     */
    const KeyMissing = 10000000;
}

重现问题的步骤

比如在ErrorCode.php文件新增:

const SystemError = 10000001;

webman.log会记录:

/path/project/support/ErrorCode.php update and reload,
Workerman[start.php] reloading

访问时:

Undefined constant support\\ErrorCode::SystemError

操作系统环境及workerman/webman等具体版本

webman:1.5.19
php:8.0

381 1 0
1个回答

胡桃

因为这个文件在 worker 进程创建之前被加载了,reloadworker 进程必然也继承自父进程,任你如何 reload 也不会发生任何变化,除非重启父进程。

他们所谓的热重启无一例外的都是在 worker start 之后 include/require 将会发生变化的文件。

  • xianjinrenshi 2024-07-19

    感谢回复,如果这个文件如果是不可以热加载的话,为什么框架需要监控呢?另外我另外一个项目其实同样的位置同样文件是可以热重载的,所以我就有点困惑了。

  • 胡桃 2024-07-19

    因为伟大的 composer 采用 PHP 特有的惰性加载(autoload),当你在主进程使用这个类常量 ErrorCode::KeyMissing,那这个类就被autoload了,同时这个类文件也被加载了,你的另一个项目同样位置同样文件可以热重载,说明你没有在主进程引入该类的类常量、类静态变量、调用类静态方法或者实例化类。

  • xianjinrenshi 2024-07-19

    再劳烦问一下,我另一个项目的使用方式其实是一样的,所以我应该怎么判断我是否在主进程引入该类的类常量、类静态变量、调用类静态方法或者实例化类呢?

  • 胡桃 2024-07-19

    在workerstart里面判断一下

    $classLoaded = in_array(ClassName::class, get_declared_classes(), true);
  • xianjinrenshi 2024-07-19

    感谢,找到原因了~因为在一个插件的配置项里引入了这个ErrorCode类,所以像你所说的,插件配置是autoload的,所以不会热重载了。

×
🔝