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
/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
/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
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
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
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




