有個(gè)文件是記錄錯(cuò)誤碼的靜態(tài)類文件,放在support文件夾下面,命名空間是support/ErrorCode,當(dāng)ErrorCode文件修改時(shí),可以看到觸發(fā)了reload,但是實(shí)際上新增的靜態(tài)屬性并不能訪問(wèn),只有在restart后才能正常訪問(wèn)。
<?php
namespace support;
/**
*
*/
class ErrorCode
{
/**
* 系統(tǒng)錯(cuò)誤
* @start 1000
*/
const KeyMissing = 10000000;
}
比如在ErrorCode.php文件新增:
const SystemError = 10000001;
webman.log會(huì)記錄:
/path/project/support/ErrorCode.php update and reload,
Workerman[start.php] reloading
訪問(wèn)時(shí):
Undefined constant support\\ErrorCode::SystemError
webman:1.5.19
php:8.0
因?yàn)檫@個(gè)文件在 worker 進(jìn)程
創(chuàng)建之前被加載了,reload
的 worker 進(jìn)程
必然也繼承自父進(jìn)程,任你如何 reload
也不會(huì)發(fā)生任何變化,除非重啟父進(jìn)程。
他們所謂的熱重啟無(wú)一例外的都是在 worker start
之后 include/require
將會(huì)發(fā)生變化的文件。
感謝回復(fù),如果這個(gè)文件如果是不可以熱加載的話,為什么框架需要監(jiān)控呢?另外我另外一個(gè)項(xiàng)目其實(shí)同樣的位置同樣文件是可以熱重載的,所以我就有點(diǎn)困惑了。
因?yàn)閭ゴ蟮?composer 采用 PHP 特有的惰性加載(autoload),當(dāng)你在主進(jìn)程使用這個(gè)類常量 ErrorCode::KeyMissing
,那這個(gè)類就被autoload了,同時(shí)這個(gè)類文件也被加載了,你的另一個(gè)項(xiàng)目同樣位置同樣文件可以熱重載,說(shuō)明你沒(méi)有在主進(jìn)程引入該類的類常量、類靜態(tài)變量、調(diào)用類靜態(tài)方法或者實(shí)例化類。
再勞煩問(wèn)一下,我另一個(gè)項(xiàng)目的使用方式其實(shí)是一樣的,所以我應(yīng)該怎么判斷我是否在主進(jìn)程引入該類的類常量、類靜態(tài)變量、調(diào)用類靜態(tài)方法或者實(shí)例化類呢?
在workerstart里面判斷一下
$classLoaded = in_array(ClassName::class, get_declared_classes(), true);
感謝,找到原因了~因?yàn)樵谝粋€(gè)插件的配置項(xiàng)里引入了這個(gè)ErrorCode類,所以像你所說(shuō)的,插件配置是autoload的,所以不會(huì)熱重載了。