安裝 Laravel6.x 報常量未定義

softer發表於2020-05-23

今天在安裝Laravel時發現有一個錯誤,錯誤輸出的內容如下:

Use of undefined constant JSON_INVALID_UTF8_SUBSTITUTE - assumed ‘JSON_INVAL

這個錯誤知道是常量未定義,下意識的認為應該是直接安裝Laravel框架出了問題,所以就Google一下,發現沒有這個問題的相關資料。

然後自己回過頭仔細看了下錯誤資訊,是不是我的PHP版本太低了,然後看了下composer.json檔案中對PHP版本的要求,最少要PHP7.2版本,我看了下我的執行環境的PHP版本是7.1

知道是PHP版本太低導致框架無法執行,修改PHP-FPM就可以了,找到Nginx的配置檔案進行修改

# /etc/nginx/sites-available/bbs.test
....
  location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
        fastcgi_index index.php;
....

把上面文字中的7.1改為7.2即可,儲存檔案即可。

最後使用service nginx reload過載Nginx,訪問專案問題就被修復好了。

問題分析

上面修復了問題,這裡研究一下為什麼上次採用PHP7.1的環境沒有問題,這次就不行了呢?

採用PhpStorm全域性搜尋關鍵字JSON_INVALID_UTF8_SUBSTITUTE,找到了關於關鍵字的資訊。

首先這個JSON_INVALID_UTF8_SUBSTITUTE常量是在PHP7.2中定義的,而PHP7.1沒有定義這個常量。

沒有定義也不會報錯了,繼續查詢發現日誌擴充套件Monolog用到了上面這個常量,我把程式碼貼出來。

namespace Monolog;

final class Utils
{
    const DEFAULT_JSON_FLAGS = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION | JSON_INVALID_UTF8_SUBSTITUTE;
.....
}

我們再看下Monolog擴充套件包的composer.json檔案中PHP版本是多少。

....
"require": {
        "php": ">=7.2",
}
...

進一步證明是PHP版本的原因導致了上述的問題。

一些思考

通過問題得到解決後,我們在安裝軟體的時候一定要符合軟體的環境需求,有些時候沒有出錯並不說是沒有錯誤,只不過上面這個錯誤在啟動框架的時候就展示出來了。

我們在安裝一個擴充套件時要看清楚這個擴充套件需要的軟體環境,如果我們的PHP版本、擴充套件包的版本是否符合要求,不符合要求就必須要升級。對於生成環境的升級就要注意業務是否能夠正常使用了。

這就是我遇到這個問題的一些想法,希望以後遇到的問題都可以記錄在這裡,而不是作為一個只會使用google的機器

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章