2025年5月8日17:03:44
如果你是單個應用,異步遞交任務,是在應用內部使用,一般不會發生這樣的問題
但是現在app項目是 app是一個應用,admin是一個應用,app吧為了接口性能吧異步任務丟給admin去執行,如果兩個應用的。就會出現部分使用
Context::add('laravel_unique_job_key', 4444);Context::addHidden('eeee', 333333);$tokenInfo = new TokenInfo();Context::add('tokenInfo', $tokenInfo);
如果 增加的 儲存在上下文的value部分有對象的值的時候,比如 TokenInfo
的在發送 dispatchJob($job);
就會吧 Context里面 data
和 hidden
部分會帶入 payload
{"displayName": "App\\Jobs\\Job","job": "Illuminate\\Queue\\CallQueuedHandler@call","maxTries": 3,"maxExceptions": null,"failOnTimeout": false,"backoff": null,"timeout": null,"retryUntil": null,"data": {"commandName": "App\\Jobs\\Job","command": "O:27:\"App\\Jobs\\Job\":1:{s:7:\"orderId\";i:221;}"},"illuminate:log:context": {"data": {"tokenInfo": "O:40:\"App\\Http\\TokenInfo\":2:{s:4:\"uuid\";s:0:\"\";s:2:\"id\";i:0;}","zx": "i:11111;"},"hidden": {"eeee": "i:333333;"}}
}
如果admin 沒有 TokenInfo
的對象就會報錯,
RuntimeException: Value is incomplete class: {"__PHP_Incomplete_Class_Name":"App\\Http\\TokenInfo","uuid":"","id":0}
解決方案:
1,在上游分發異步任務的時候,就不要有 Context 相關的使用 對象類型的數據
2,在下游執行任務的項目,吧存儲的對象也復制一份
3,自己封裝一個分發方法
if (!function_exists('dispatchJob')) {function dispatchJob(mixed $job){//需要排除的key,這些key可能會影響隊列的部分功能,需要先排除$excludeKey = ['laravel_unique_job_cache_store', 'laravel_unique_job_key'];$stay = $all = Context::all();$stayHidden = $allHidden = Context::allHidden();// 判斷是否有上下文,如果沒有直接 分發jobif (empty($all) && empty($allHidden)) {dispatch($job);} else {//先 forget 所有比不需要的key,dispatch 之后在還給 Context//需要刪除的 context key$filterKey = Arr::except($all, $excludeKey);$filterHiddenKey = Arr::except($allHidden, $excludeKey);$keys = array_keys($filterKey);$hiddenKeys = array_keys($filterHiddenKey);// 刪除不必要的keyif (!empty($keys)) {foreach ($keys as $key) {Context::forget($key);}}// 刪除不必要的隱藏keyif (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::forgetHidden($hiddenKey);}}//分發任務dispatch($job);//歸還上下文if (!empty($keys)) {foreach ($keys as $key) {Context::add($key, $all[$key]);}}if (!empty($hiddenKeys)) {foreach ($hiddenKeys as $hiddenKey) {Context::addHidden($hiddenKey, $allHidden[$hiddenKey]);}}}}
}