線上有個(gè)分詞服務(wù),我修改了CutWordsServerEvent 的onMessage方法后,先清理opcache,然后執(zhí)行reload操作,代碼不生效,請(qǐng)教一下各位大佬,怎么解決
class CutWordsServerCommand extends Command
{
protected $signature = 'cut-word-server {action} {--daemon}';
protected $description = '分詞服務(wù)';
public function __construct()
{
parent::__construct();
}
public function handle()
{
$action = $this->argument('action');
if (!in_array($action, ['start', 'stop', 'reload'])) {
$this->error('參數(shù)錯(cuò)誤');
exit;
}
if ($this->option('daemon')) {
Worker::$daemonize = true;
}
$httpWorker = new Worker("http://0.0.0.0:8080");
$httpWorker->count = 4;
// 啟動(dòng)時(shí)執(zhí)行的回調(diào)函數(shù),這里可以執(zhí)行一些初始化操作
$httpWorker->onWorkerStart = function (Worker $worker) {
ini_set('memory_limit', '1024M');
Jieba::init(['mode' => 'default', 'dict' => 'big']);
Finalseg::init();
JiebaAnalyse::init();
$memory = getMemory();
$this->info("進(jìn)程ID" . $worker->id . " 結(jié)巴分詞加載完畢,當(dāng)前內(nèi)存消耗{$memory}");
require_once base_path().'/app/Events/CutWordsServerEvent.php';
$worker->onMessage = [new CutWordsServerEvent(), 'onMessage'];
};
// 運(yùn)行 Worker,如果你不想在命令行運(yùn)行,可以注釋掉這行
Worker::runAll();
}
}
class CutWordsServerEvent
{
public function onMessage($connection, Request $request)
{
$startTime = microTimeFloat();
$content = trim($request->post('splitContent'));
$topNum = (int)$request->post('topNum', 15);
$response = new Response();
$response->header('Content-Type', 'application/json');
$response->header('Cache-Control', 'no-cache, private');
if (empty($content)) {
$result = makeStdRes(-1, '請(qǐng)求參數(shù)錯(cuò)誤');
$result['costTime'] = microTimeFloat() - $startTime;
$response->withBody(json_encode($result));
$connection->send($response);
return;
}
$tags = JiebaAnalyse::extractTags($content, $topNum);
$result = makeStdRes(1, '分詞請(qǐng)求成功', $tags);
$result['costTime'] = microTimeFloat() - $startTime;
$response->withBody(json_encode($result));
$connection->send($response);
}
}
我是靠注釋 $result['costTime'] = microTimeFloat() - $startTime; 請(qǐng)求接口得到的結(jié)果有沒(méi)有costTime 判斷代碼有沒(méi)有生效的
文檔有說(shuō)明,寫(xiě)死在start.php 里的代碼無(wú)法熱更新。
把onWorkerStart里的業(yè)務(wù)代碼單獨(dú)放到一個(gè)文件里,然后onMessage的時(shí)候加載這個(gè)文件。
$httpWorker->onWorkerStart = function (Worker $worker) {
require_once __DIR_ . '/your/file.php';
};
感謝您的回復(fù),但是我代碼是這樣的啊,我onMessage的代碼都放在 CutWordsServerEvent.php 里了, 是在onWorkerStart 時(shí)候用require_once 加載的。這是我的
$httpWorker->onWorkerStart = function (Worker $worker) {
ini_set('memory_limit', '1024M');
Jieba::init(['mode' => 'default', 'dict' => 'big']);
Finalseg::init();
JiebaAnalyse::init();
$memory = getMemory();
$this->info("進(jìn)程ID" . $worker->id . " 結(jié)巴分詞加載完畢,當(dāng)前內(nèi)存消耗{$memory}");
require_once base_path().'/app/Events/CutWordsServerEvent.php';
$worker->onMessage = [new CutWordsServerEvent(), 'onMessage'];
};
這是官方文檔寫(xiě)的:
以下代碼reload后會(huì)自動(dòng)更新
$worker = new Worker('http://0.0.0.0:1234');
$worker->onWorkerStart = function($worker) { // onWorkerStart是進(jìn)程啟動(dòng)后觸發(fā)的回調(diào)
require_once __DIR__ . '/your/path/MessageHandler.php'; // 進(jìn)程啟動(dòng)后載入的文件支持熱更新
$messageHandler = new MessageHandler();
$worker->onMessage = [$messageHandler, 'onMessage'];
};
MessageHandler.php改動(dòng)后執(zhí)行 php start.php reload,MessageHandler.php會(huì)重新載入內(nèi)存達(dá)到更新業(yè)務(wù)邏輯的效果。
我沒(méi)看出來(lái)有啥區(qū)別啊
意思是onWorkerStart內(nèi)的所有代碼都要放在一個(gè)文件里require,你上面的代碼有一部分沒(méi)有在require的文件里?