安装 Laravel6.x 报常量未定义

今天在安装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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

我也是报这个错误,弄了好久

3年前 评论
softer (楼主) 3年前

:octocat:刚踩到这个坑,谢谢楼主

3年前 评论

我的PHP版本是7.3,但是也会有这个错误,求解~

3年前 评论
jfpl 3年前
hanswong (作者) 3年前
jfpl 3年前
softer (楼主) 3年前

composer.json:

"require": {
    "php": "^7.2.5",
    "dcat/laravel-admin": "2.*",
    "fideloper/proxy": "^4.2",
    "fruitcake/laravel-cors": "^1.0",
    "guzzlehttp/guzzle": "^6.3",
    "laravel/framework": "^7.0",
    "laravel/tinker": "^2.0",
    "rachidlaasri/laravel-installer": "^4.1"
},

/etc/nginx/sites-available下的nginx配置:

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
}

cli执行

    php artisan migrate --force

为什么还是会报错

     ErrorException
     Use of undefined constant JSON_INVALID_UTF8_SUBSTITUTE - assumed 'JSON_INVALID_UTF8_SUBSTITUTE'  at vendor/laravel/framework/src/Illuminate/Log/LogManager.php:416

全局搜索 JSON_INVALID_UTF8_SUBSTITUTE 看到这样的一段文字:

2.1.0 (2020-05-22)

  • Added JSON_INVALID_UTF8_SUBSTITUTE to default json flags, so that invalid UTF8 characters now get converted to instead of being converted from ISO-8859-15 to UTF8 as it was before, which was hardly a comprehensive solution
  • Added $ignoreEmptyContextAndExtra option to JsonFormatter to skip empty context/extra entirely from the output
  • Added $parseMode, $disableWebPagePreview and $disableNotification options to TelegramBotHandler
  • Added tentative support for PHP 8
  • NormalizerFormatter::addJsonEncodeOption and removeJsonEncodeOption are now public to allow modifying default json flags
  • Fixed GitProcessor type error when there is no git repo present
  • Fixed normalization of SoapFault objects containing deeply nested objects as "detail"
  • Fixed support for relative paths in RotatingFileHandler

难道是要 PHP8才可以么? :sob:

   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并未有Monolog的相关引入 :sob:

求教各位老师指点@softer @大毛 @惊风破浪 @Artist0618 @Han

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!