There is no problem not worth solving, and no technology not worth learning!

In Linux, Laravel 6, the task queue is always running for troubleshooting analysis (timeout time has been set)

决定在容器中手动执行命令行,执行失败

1. The command in the task queue artisan::call, the code is as follows


    /**
     * 执行安装主题命令
     * @param string $themeLocation 编译后的主题所在目录
     * @param string $themeId 主题ID
     * @param bool $force 主题ID
     * @return void
     */
    public function installTheme($themeLocation, $themeId, $force)
    {
        file_put_contents(storage_path() . '/logs/ExecCommandHandler-installTheme-0-' . microtime(true) . '-' . mt_rand()  . '.txt', print_r($themeId, true), FILE_APPEND | LOCK_EX);
        $installThemeExitCode = Artisan::call('theme-store:theme:install', [
            'theme_location' => $themeLocation,
            'theme_id' => $themeId,
            'layout' => 'blade',
            '--force' => $force,
        ]);
        file_put_contents(storage_path() . '/logs/ExecCommandHandler-installTheme-1-' . microtime(true) . '-' . mt_rand()  . '.txt', print_r($themeId, true), FILE_APPEND | LOCK_EX);

        if ($installThemeExitCode !== 0) {
            abort(500, 'Install theme failed.');
        }
    }


2. Check the generated log file to confirm that the command has been executed. Confirm that the command was not executed because the log file for execCommandHandler-InstallTheme-1- was not generated. as shown in Figure 1

查看生成的日志文件,以确认命令已经执行完毕。确认命令未执行完成,因为未生成 ExecCommandHandler-installTheme-1- 的日志文件
Figure 1

/var/www/object/storage/logs # ls -l
total 4
-rw-r--r--    1 www      www             36 Aug 16 09:56 ExecCommandHandler-installTheme-0-1660643779.8784-1362478949.txt
/var/www/object/storage/logs # 


3. Decide to manually execute the command line in the container, and the execution fails. as shown in Figure 2

决定在容器中手动执行命令行,执行失败
Figure 2

/var/www/object # php artisan theme-store:theme:install /var/www/object/storage/ap
p/theme_downloads/2022/08/16/1660643779.663.1639598452 9708e042-0b71-4667-87da-0
738232afb35 blade --force
安装主题到数据仓库
安装失败,因为: SQLSTATE[22032]: <>: 3140 Invalid JSON text: "Missing a name for object member." at position 168 in value for column 'theme_asset.schema'. (SQL: insert into `theme_asset` (`asset_key`, `theme_id`, `mime_type`, `created_at`, `content`, `schema`, `category`, `updated_at`) values (apps/internal/comment/blocks/comment.blade.php, 9708e042-0b71-4667-87da-0738232afb35, text/html, 2022-08-16 10:12:52, @php
  $enable = $product[\'review_status\'] === \'open\';
@endphp

@if($enable)
  

  @script
    
  @endScript

  
    
      {{ \'comment.customer_review\' | t }}
    
    
      
        
          {!! str_repeat(\' \', 6) !!}
          
            
            
          
        
        
          @for ($i = 0; $i < 5; $i++)
          
          @endFor
        
      
      
        
      
    
  
@endif



, {
  "name": "商品评论",
  "target": "section",
  "templates": ["product_detail"],
  "available_if": "{{ is_module_enabled('Comment') }}",
  "javascript": "app.js",
}, app_block, 2022-08-16 10:12:52))
/var/www/object # 


4. The root cause is that the command line execution failed, and no exception was thrown. If an exception is thrown, the task queue will not be in progress and will fail automatically. Decided to reproduce this problem in the local Windows 10 environment. as shown in Figure 3

根源在于命令行执行失败,并未抛出异常。如果抛出异常,则任务队列就不会一直进行中,也会自动失败。决定在本地 Windows 10 环境下复现此问题
Figure 3

PS E:\wwwroot\object> php artisan theme-store-db:theme:install E:\wwwroot\object\storage\app\theme_downloads\2022\11\07\v2.0.0-rc.47 97af8c54-af1c-4f49-8d32-f603eb968078 blade --force
硬删除主题
安装主题到数据仓库
安装失败,因为: SQLSTATE[22032]: <>: 3140 Invalid JSON text: "Missing a name for object member." at position 168 in value for column 'theme_asset2.schema'. (SQL: insert into `theme_asset2` (`asset_key`, `theme_id`, `mime_type`, `created_at`, `content`, `schema`, `category`, `updated_at`) values (apps/internal/comment/blocks/comment.blade.php, 97af8c54-af1c-4f49-8d32-f603eb968078, text/html, 2022-11-07 06:41:25, @php
  $enable = $product[\'review_status\'] === \'open\';
@endphp

@if($enable)
  

  @script
    
  @endScript

  
    
      {{ \'comment.customer_review\' | t }}
    
    
      
        
          {!! str_repeat(\' \', 6) !!}
          
            
            
          
        
        
          @for ($i = 0; $i < 5; $i++)
          
          @endFor
        
      
      
        
      
    
  
@endif



, {
  "name": "商品评论",
  "target": "section",
  "templates": ["product_detail"],
  "available_if": "{{ is_module_enabled('Comment') }}",
  "javascript": "app.js",
}, app_block, 2022-11-07 06:41:25))
PS E:\wwwroot\object>


5. Decided to reproduce this problem in the queue, output $installThemeExitCode, no output, because the code has been interrupted at artisan::call, and no exception is thrown.


        $themeLocation = 'E:\wwwroot\object\storage\app\theme_downloads\2022\11\07\v2.0.0-rc.47';
        $installThemeExitCode = Artisan::call('theme-store-db:theme:install', [
            'theme_location' => $themeLocation,
            'theme_id' => $themeId,
            'layout' => 'blade',
            '--force' => $force,
        ]);

        Log::info('installThemeExitCode', ['installThemeExitCode' => $installThemeExitCode]);


6. Check the specific implementation of the corresponding command line, which has caught the exception, and then exit(1);. exit — output a message and exit the current script. If status is an int, the value will be an exit status code and will not be printed out.


        DB::beginTransaction();
        try {
            if ($purgeExisting) {
                $this->info("硬删除主题");
                $installer->purgeTheme($themeId);
            }
            $this->info("安装主题到数据仓库");

            $installer->install($themeLocation, $themeId);

            $this->info(sprintf("主题%s安装成功", $themeId));

            DB::commit();
        } catch(\Exception $exception) {
            DB::rollBack();

            $this->error(sprintf("安装失败,因为: %s", $exception->getMessage()));

            exit(1);
        }


7. Change exit(1); to return 1;. When the command fails to run, it returns 1. However, no more specific reasons for failure were obtained. as shown in Figure 4

将 exit(1); 修改为 return 1;。当命令运行失败后,返回 1。但是未获取到更为具体的失败原因
Figure 4

		DB::rollBack();

		$this->error(sprintf("安装失败,因为: %s", $exception->getMessage()));

		exit(1);


8. Adjust the code at the call. When the exit code is not equal to 0, get the output of the last run command as the reason for the failure. Although it contains outputs such as info and error, it is expected that only the output of error is obtained, but it is acceptable. as shown in Figure 5

调整调用处的代码,当退出码不等于 0 时,获取上次运行命令的输出做为失败的原因。虽然包含了 info、error 等输出,期望的是仅获取 error 的输出,但是可以接受。
Figure 5

        if ($installThemeExitCode !== 0) {
            abort(500, Artisan::output());
        }


9. Executing commands in the terminal is not affected. Whether it is successful or failed execution.


PS E:\wwwroot\object> php artisan theme-store-db:theme:install E:\wwwroot\object\storage\app\theme_downloads\2022\11\07\v2.0.0-rc.47 97af8c54-af1c-4f49-8d32-f603eb968078 blade --force
安装主题到数据仓库
安装失败,因为: SQLSTATE[22032]: <>: 3140 Invalid JSON text: "Missing a name for object member." at position 168 in value for column 'theme_asset2.schema'. (SQL: insert into `theme_asset2` (`asset_key`, `theme_id`, `mime_type`, `created_at`, `content`, `schema`, `category`, `updated_at`) values (apps/internal/comment/blocks/comment.blade.php, 97af8c54-af1c-4f49-8d32-f603eb968078, text/html, 2022-11-08 08:54:17, @php
  $enable = $product[\'review_status\'] === \'open\';
@endphp

@if($enable)
  

  @script
    
  @endScript

  
    
      {{ \'comment.customer_review\' | t }}
    
    
      
        
          {!! str_repeat(\'&          
            
            
          
        
        
          @for ($i = 0; $i < 5; $i++)
          
          @endFor
        
      
      
        
      
    
  
@endif



, {
  "name": "商品评论",
  "target": "section",
  "templates": ["product_detail"],
  "available_if": "{{ is_module_enabled('Comment') }}",
  "javascript": "app.js",
}, app_block, 2022-11-08 08:54:17))
PS E:\wwwroot\object> php artisan theme-store-db:theme:install E:\wwwroot\object\storage\app\theme_downloads\2022\11\04\1667531626.6087.1076713860 97af8c54-af1c-4f49-8d32-f603eb968078 blade --force
安装主题到数据仓库
主题97af8c54-af1c-4f49-8d32-f603eb968078安装成功
PS E:\wwwroot\object>


10. When an exception is thrown in the corresponding CALL command line in the queue, the queue can be caught. as shown in Figure 5

PHP / Laravel / Yii2 Legacy Project Maintenance & Long-Term Technical Support

If your PHP / Laravel / Yii2 project is already in production but needs bug fixing, API troubleshooting, performance optimization, developer handover support, or long-term maintenance, feel free to contact me for remote technical support.

Ideal For:
✅ PHP legacy systems without active maintenance
✅ Laravel / Yii2 project bug fixes
✅ Admin panel feature iterations
✅ RESTful API troubleshooting
✅ MySQL / Redis / Nginx performance issues
✅ Long-term remote part-time maintenance

We can start with a small task:
✅ Production error troubleshooting
✅ API issue analysis
✅ Slow query and performance bottleneck diagnosis
✅ Initial code structure review
✅ Deployment environment and log inspection

If you would like to discuss your project, please contact me and mention: PHP Maintenance Consultation.

Contact Me:
Telegram: @shuijingwan
WeChat: 13980074657
Email: shuijingwanwq@gmail.com

评论

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.