laravel-template/app/Console/Commands/Init.php

140 lines
3.7 KiB
PHP
Raw Normal View History

2023-11-01 04:02:17 +00:00
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Init extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:init';
/**
* The console command description.
*
* @var string
*/
protected $description = '初始化应用程序(用于容器启动时)。';
2023-11-02 13:03:39 +00:00
/**
2023-11-01 04:02:17 +00:00
* Execute the console command.
*/
public function handle(): void
{
// 检查是否已经初始化
$lock = storage_path('init.lock');
if (file_exists($lock)) {
$this->warn("另一个初始化进程正在运行中。如果确定没有其他进程在运行,请手动删除 {$lock} 文件。");
// 如果有 --start 参数,则启动 Web 服务
if ($this->option('start')) {
$this->warn("正在等待另一个进程初始化完成。");
// 一直等待锁文件被删除
while (file_exists($lock)) {
sleep(1);
}
$this->call('serve');
}
return;
}
$this->info("上锁。");
// 加锁
file_put_contents($lock, '');
// 检测有无 .env
if (!file_exists(base_path('.env'))) {
// 复制 .env.example
$this->info("复制 .env.example 为 .env");
copy(base_path('.env.example'), base_path('.env'));
}
// 检测是否有 APP_KEY
$APP_KEY = env('APP_KEY');
if (empty($APP_KEY)) {
// 初始化
$this->info("生成应用程序密钥。");
$this->call('key:generate');
}
$this->info("初始化 storage 目录。");
// 初始化 storage 目录
$this->initStorageDir();
$this->info("初始化数据库。");
// force migrate
$this->call('migrate', [
'--force' => true,
]);
$this->info("生成缓存。");
$this->call('optimize');
$this->info("解锁");
// 解锁
unlink($lock);
// 输出
$this->info('应用程序初始化完成。');
if ($this->option('start')) {
$this->info('启动 Web 服务。');
$this->call('octane:start', [
'--host' => '0.0.0.0'
]);
}
}
private function initStorageDir(): void
{
// 检测 storage 下的目录是否正确
$storage = storage_path();
// 有无 app 目录
if (!is_dir($storage . '/app')) {
mkdir($storage . '/app');
// 有无 public 目录
if (!is_dir($storage . '/app/public')) {
mkdir($storage . '/app/public');
}
}
// 有无 framework 目录
if (!is_dir($storage . '/framework')) {
mkdir($storage . '/framework');
// 有无 cache 目录
if (!is_dir($storage . '/framework/cache')) {
mkdir($storage . '/framework/cache');
}
// 有无 sessions 目录
if (!is_dir($storage . '/framework/sessions')) {
mkdir($storage . '/framework/sessions');
}
// 有无 testing 目录
if (!is_dir($storage . '/framework/testing')) {
mkdir($storage . '/framework/testing');
}
// 有无 views 目录
if (!is_dir($storage . '/framework/views')) {
mkdir($storage . '/framework/views');
}
}
// 有无 logs 目录
if (!is_dir($storage . '/logs')) {
mkdir($storage . '/logs');
}
}
}