前言
項(xiàng)目部署有時(shí)候是很煩人的,由于環(huán)境的不同導(dǎo)致的諸多問題,有時(shí)候問題會(huì)在安裝的時(shí)候出現(xiàn),比如 PHP
的擴(kuò)展,有時(shí)候可能是在運(yùn)行起來之后的問題,比如數(shù)據(jù)庫(kù)連接失敗、連接失敗、進(jìn)程維護(hù)(Redis 隊(duì)列需要后臺(tái)的進(jìn)程維護(hù),通常是 supervisor)等。前者尚好,后者則會(huì)產(chǎn)生意向不到的問題,于是檢驗(yàn)程序是否符合預(yù)期的狀態(tài)運(yùn)行便成為一項(xiàng)必不可少的部署步驟。
那么有沒有一款工具能夠?qū)崿F(xiàn) “自檢” 呢?
當(dāng)然,這是有的,正如標(biāo)題所述,今天就來看一看,Laravel
項(xiàng)目 或者 PHP
項(xiàng)目如何實(shí)現(xiàn)自檢功能。
安裝 laravel-self-diagnosis
composer require beyondcode/laravel-self-diagnosis
發(fā)布配置文件
php artisan vendor:publish --provider=BeyondCode\\SelfDiagnosis\\SelfDiagnosisServiceProvider
配置解讀
-
environment_aliases
顧名思義,也就是環(huán)境別名,你的環(huán)境名稱也許是 production、development、live、product、develop等,這個(gè)環(huán)境別名用于針對(duì)環(huán)境別名做一些兼容。 -
checks
通用的檢查,無論何種環(huán)境,你都需要進(jìn)行的檢查。作者封裝了諸多的檢查環(huán)境類。 -
environment_checks
區(qū)別于環(huán)境的檢查,其檢查針對(duì)于生產(chǎn)環(huán)境與開發(fā)環(huán)境。
執(zhí)行檢查
php artisan self-diagnosis
自定義檢查
姑且自擬一個(gè)域名檢查,簡(jiǎn)單的設(shè)置一下虛擬主機(jī)域名(虛擬主機(jī)域名不再詳述,各位自行查閱資料)為:happyphper.test
,那么在 .env
對(duì) APP_URL
進(jìn)行設(shè)置
APP_URL=http://happyphper.test
假定我們有一個(gè)接口是為了該檢查而做的,在 routes/web.php
增加一條這樣的路由:
Route::get('/access', function () {
return 'Accessed';
});
那么創(chuàng)建檢查類,姑且稱之為 DomainIsAccessible
,位于 app/Diagnosis
下。
<?php
namespace App\Diagnosis;
use BeyondCode\SelfDiagnosis\Checks\Check;
class DomainIsAccessible implements Check
{
/**
* 域名是否可訪問
*
* @param array $config
* @return string
*/
public function name(array $config): string
{
return trans('self-diagnosis::checks.domain_is_accessible.name');
}
/**
* 檢查是否域名能夠正常訪問,并且有正確返回值
*
* @param array $config
* @return bool
*/
public function check(array $config): bool
{
try {
$content = file_get_contents($config['domain']);
} catch (\Exception $exception) {
$content = null;
}
return 'Accessed' === $content;
}
/**
* 錯(cuò)誤信息
*
* @param array $config
* @return string
*/
public function message(array $config): string
{
return trans('self-diagnosis::checks.domain_is_accessible.message', $config);
}
}
筆者在此為了方便,使用了
file_get_contents
函數(shù),你也可以使用curl
或者shell_exec
exec
等完成。
完善一點(diǎn),還需要添加一些本地化的信息。在 resources/lang/vendor/self-diagnosis/en
下的 checks
文件中,添加一條數(shù)據(jù)
<?php
return [
// ...
'domain_is_accessible' => [
'message' => 'The :domain domain cannot be accessed.',
'name' => 'The domain is accessed.',
],
];
在 config/self-diagnosis.php
中加入自定義的檢查類。
<?php
return [
// ...
'checks' => [
// ...
\App\Diagnosis\DomainIsAccessible::class => [
'domain' => config('app.url') . '/access'
],
]
];
此時(shí),自定義的檢查類就搞定了。再次執(zhí)行命令,你會(huì)看到這樣的效果。
源碼精讀
- 配置檢查,比如
app_key
,它其實(shí)就是進(jìn)行了檢查類中定義了這樣的操作
return config('app.key') !== null;
- 數(shù)據(jù)庫(kù)檢查,是使用類庫(kù)中提供的方法策略。
// Database
DB::connection()->getPdo();
// Redis
Redis::connection($name)->connect()->isConnected();
- 文件檢查是利用了
file_exists()
函數(shù)。 - PHP 版本的檢測(cè)是利用了
composer.json
中需求版本,與 PHP 常量 5.PHP_VERSION
正在使用的 PHP 版本,再利用version_compare()
對(duì)比得出的。 - package 包檢查是利用
composer
的--dry-run
(專用于演示,無副作用)搞定的。 - 遷移檢測(cè)是利用了
php artisan migrate --pretend
(專用于演示,無副作用)搞定的。 - 環(huán)境變量是否設(shè)置是利用了 提取
.env
與.env.example
變量后,進(jìn)行對(duì)比搞定的。
如果你看了源碼,你也會(huì)感覺,哦,如此這般,竟如此簡(jiǎn)單。
寫在最后
源碼的閱讀有利于你的編碼,和補(bǔ)充一下你未讀到的 PHP 知識(shí),筆者就是看了源碼,才得到一些之前未領(lǐng)悟到的東西。希望本篇文章有幫助到你,請(qǐng)您也不要吝惜你的喜歡和贊賞。