讓你的 laravel 實(shí)現(xiàn)環(huán)境自檢(檢查)細(xì)讀源碼之 laravel-self-diagnosis

前言

項(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

laravel-self-diagnosis

composer require beyondcode/laravel-self-diagnosis

發(fā)布配置文件

php artisan vendor:publish --provider=BeyondCode\\SelfDiagnosis\\SelfDiagnosisServiceProvider

配置解讀

  1. environment_aliases
    顧名思義,也就是環(huán)境別名,你的環(huán)境名稱也許是 production、development、live、product、develop等,這個(gè)環(huán)境別名用于針對(duì)環(huán)境別名做一些兼容。
  2. checks
    通用的檢查,無論何種環(huán)境,你都需要進(jìn)行的檢查。作者封裝了諸多的檢查環(huán)境類。
  3. environment_checks
    區(qū)別于環(huán)境的檢查,其檢查針對(duì)于生產(chǎn)環(huán)境與開發(fā)環(huán)境。

執(zhí)行檢查

php artisan self-diagnosis
image.png

自定義檢查

姑且自擬一個(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ì)看到這樣的效果。


image.png

源碼精讀

  1. 配置檢查,比如 app_key ,它其實(shí)就是進(jìn)行了檢查類中定義了這樣的操作
return config('app.key') !== null;
  1. 數(shù)據(jù)庫(kù)檢查,是使用類庫(kù)中提供的方法策略。
// Database
DB::connection()->getPdo();
// Redis
Redis::connection($name)->connect()->isConnected();
  1. 文件檢查是利用了 file_exists() 函數(shù)。
  2. PHP 版本的檢測(cè)是利用了 composer.json 中需求版本,與 PHP 常量 5. PHP_VERSION 正在使用的 PHP 版本,再利用 version_compare() 對(duì)比得出的。
  3. package 包檢查是利用 composer--dry-run (專用于演示,無副作用)搞定的。
  4. 遷移檢測(cè)是利用了 php artisan migrate --pretend (專用于演示,無副作用)搞定的。
  5. 環(huán)境變量是否設(shè)置是利用了 提取 .env.env.example 變量后,進(jìn)行對(duì)比搞定的。

如果你看了源碼,你也會(huì)感覺,哦,如此這般,竟如此簡(jiǎn)單。

寫在最后

源碼的閱讀有利于你的編碼,和補(bǔ)充一下你未讀到的 PHP 知識(shí),筆者就是看了源碼,才得到一些之前未領(lǐng)悟到的東西。希望本篇文章有幫助到你,請(qǐng)您也不要吝惜你的喜歡和贊賞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380