在 Laravel 6 中,设置静态变量后,在下一队列任务中获取时未被清除,会被沿用的解决

1、参考:https://www.shuijingwanwq.com/2022/07/15/6796/ 。在 Laravel 6 的队列任务中,当任务失败时的处理(设置与获取静态变量)。但是,其存在一个 Bug,在下一队列任务中如果未被重新设置,则会被沿用。分别打印2个任务中的静态变量:self::$destination。预期 755 的 destination 为 null,但是其沿用了 754 的值。如图1

图1

    private static ?string $destination = null; // 解压缩 ZIP 文件后的目录

 Log::info(
  'destination',
  [
   'id' => $this->themeInstallationTask->id,
   'destination' => self::$destination
  ]
 );
[2023-04-14 13:37:18] local.INFO: uploadThemeAssetToCdn {
    "id": 754,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/14/1681450622.2291.583840996"
} 
[2023-04-14 13:38:06] local.INFO: uploadThemeAssetToCdn {
    "id": 755,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/14/1681450622.2291.583840996"
} 

2、如果在下一个队列任务中,有重新设置 静态变量为 null,则会被覆盖,分别打印2个任务中的静态变量:self::$destination。符合预期。如图2

图2

    private static ?string $destination = null; // 解压缩 ZIP 文件后的目录

 self::$destination = null;

 Log::info(
  'uploadThemeAssetToCdn',
  [
   'id' => $this->themeInstallationTask->id,
   'destination' => self::$destination
  ]
 );
[2023-04-14 13:44:46] local.INFO: uploadThemeAssetToCdn {
    "id": 756,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/14/1681451070.5331.338264899"
} 
[2023-04-14 13:45:34] local.INFO: uploadThemeAssetToCdn {
    "id": 757,
    "destination": null
} 

3、但是,参考:在 Laravel 6 中,在队列任务中,重试时的指数回退(exponential backoff)的实现。当想将静态变量传递给下一个队列任务时,仍然会导致相互覆盖的问题。在 handle 方法中,预期 760 的值不为 null ,但是现在已经被 761 的 null 给覆盖。如图3

图3

    private static ?string $absolutePath; // 待解压缩的 ZIP 文件的绝对路径
    private static ?string $destination; // 解压缩 ZIP 文件后的目录

    /**
     * Create a new job instance.
     *
     * @return void
     */    public function __construct(ThemeInstallationTask $themeInstallationTask, ?string $absolutePath, ?string $destination)
    {
        // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID
        $this->themeInstallationTask = $themeInstallationTask;
        self::$absolutePath = $absolutePath;
        self::$destination = $destination;
        Log::info(
            'construct',
            [
                'id' => $this->themeInstallationTask->id,
                'destination' => self::$destination
            ]
        );
    }

    /**
     * Execute the job.
     *
     * @return void
     * @throws OverflowException
     */    public function handle()
    {
        Log::info(
            'handle',
            [
                'id' => $this->themeInstallationTask->id,
                'destination' => self::$destination
            ]
        );
  
 }
PS E:\wwwroot\object> php artisan queue:work
[2023-04-14 14:06:03][ACuiiTG0Ptuo5Tl3iMCPnREKYZhGTva3] Processing: Jobs\ThemeInstalling
[2023-04-14 14:06:50][ACuiiTG0Ptuo5Tl3iMCPnREKYZhGTva3] Processed:  Jobs\ThemeInstalling
[2023-04-14 14:06:50][xcL1KIALWlYy9edrKD3GpqkWOzCbudSu] Processing: Jobs\ThemeInstalling
[2023-04-14 14:07:22][xcL1KIALWlYy9edrKD3GpqkWOzCbudSu] Processed:  Jobs\ThemeInstalling
[2023-04-14 14:07:22][Ff7Pcd8szupQYVAO2BkQhGJxyoQKrpo8] Processing: Jobs\ThemeAssetUploading
[2023-04-14 14:07:42][Ff7Pcd8szupQYVAO2BkQhGJxyoQKrpo8] Processed:  Jobs\ThemeAssetUploading
[2023-04-14 14:07:42][Nyc3IPP2mXHz3Hl2tT4RADsKNTAhxf1l] Processing: Jobs\ThemeAssetUploading
[2023-04-14 14:07:45][Nyc3IPP2mXHz3Hl2tT4RADsKNTAhxf1l] Processed:  Jobs\ThemeAssetUploading
[2023-04-14 14:07:45][gaMvLrJttc4Ws1qu2rAAsORFGAfPNZmq] Processing: Jobs\ThemeInstalled
[2023-04-14 14:07:45][gaMvLrJttc4Ws1qu2rAAsORFGAfPNZmq] Processed:  Jobs\ThemeInstalled
[2023-04-14 14:07:45][QALQV7djT9caKVH50HHZLe0x3OScalBP] Processing: Jobs\ThemeInstalled
[2023-04-14 14:07:45][QALQV7djT9caKVH50HHZLe0x3OScalBP] Processed:  Jobs\ThemeInstalled


[2023-04-14 14:06:19] local.INFO: uploadThemeAssetToCdn {
    "id": 760,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/14/1681452363.3555.1473533151"
} 
[2023-04-14 14:06:19] local.INFO: construct {
    "id": 760,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/14/1681452363.3555.1473533151"
} 
[2023-04-14 14:06:53] local.INFO: uploadThemeAssetToCdn {
    "id": 761,
    "destination": null
} 
[2023-04-14 14:06:53] local.INFO: construct {
    "id": 761,
    "destination": null
} 
[2023-04-14 14:07:22] local.INFO: handle {
    "id": 760,
    "destination": null
} 
[2023-04-14 14:07:22] local.INFO: destination {
    "id": 760,
    "destination": null
} 
[2023-04-14 14:07:42] local.INFO: destination {
    "id": 760,
    "destination": null
} 
[2023-04-14 14:07:42] local.INFO: handle {
    "id": 761,
    "destination": null
} 
[2023-04-14 14:07:42] local.INFO: destination {
    "id": 761,
    "destination": null
} 
[2023-04-14 14:07:45] local.INFO: destination {
    "id": 761,
    "destination": null
} 

4、最终决定放弃静态变量的使用,将相应的值存储在队列任务相关的 MySQL 表记录中。队列任务之间不再相互影响,符合预期。如图4

图4

{
  "theme_download_paths": {
    "zip_path": "/theme_downloads/2023/04/17/1681696283.1861.462360447.zip",
    "destination": "/theme_downloads/2023/04/17/1681696283.1861.462360447"
  }
}
PS E:\wwwroot\object> php artisan queue:work
[2023-04-17 09:51:22][0Ta6TjtzacnMmI50uh9Ti3s9qfh5c5H1] Processing: Jobs\ThemeInstalling
[2023-04-17 09:52:21][0Ta6TjtzacnMmI50uh9Ti3s9qfh5c5H1] Processed:  Jobs\ThemeInstalling
[2023-04-17 09:52:21][dcjXRXkV2XgHdhQrGkYy3Yyq9vy7iiDh] Processing: Jobs\ThemeInstalling
[2023-04-17 09:52:59][dcjXRXkV2XgHdhQrGkYy3Yyq9vy7iiDh] Processed:  Jobs\ThemeInstalling
[2023-04-17 09:52:59][v8MkfSZlf6PtoXi8tqNcDb4SXCp6KTGk] Processing: Jobs\ThemeAssetUploading
[2023-04-17 09:53:02][v8MkfSZlf6PtoXi8tqNcDb4SXCp6KTGk] Processed:  Jobs\ThemeAssetUploading
[2023-04-17 09:53:02][Zv1ts0pDpCSiTVoWc9WqmszXj5QUYSF6] Processing: Jobs\ThemeAssetUploading
[2023-04-17 09:53:07][Zv1ts0pDpCSiTVoWc9WqmszXj5QUYSF6] Processed:  Jobs\ThemeAssetUploading
[2023-04-17 09:53:07][K69thLwVkwnkOccdR778hDdMBAL7U4pD] Processing: Jobs\ThemeInstalled
[2023-04-17 09:53:07][K69thLwVkwnkOccdR778hDdMBAL7U4pD] Processed:  Jobs\ThemeInstalled
[2023-04-17 09:53:07][SJPEBLJozJygXiIW9zfJNU1FSGtBmWek] Processing: Jobs\ThemeInstalled
[2023-04-17 09:53:07][SJPEBLJozJygXiIW9zfJNU1FSGtBmWek] Processed:  Jobs\ThemeInstalled

[2023-04-17 14:02:50] local.INFO: destination {
    "id": 799,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/17/1681711238.5778.1671140645"
} 
[2023-04-17 14:02:54] local.INFO: destination {
    "id": 799,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/17/1681711238.5778.1671140645"
} 
[2023-04-17 14:02:56] local.INFO: destination {
    "id": 800,
    "destination": null
} 
[2023-04-17 14:02:57] local.INFO: destination {
    "id": 800,
    "destination": null
} 
[2023-04-17 14:02:57] local.INFO: destination {
    "id": 801,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/17/1681711324.896.2108597779"
} 
[2023-04-17 14:02:59] local.INFO: destination {
    "id": 801,
    "destination": "E:\\wwwroot\\object\\storage\\app/theme_downloads/2023/04/17/1681711324.896.2108597779"
} 

 

 

永夜