分类 PHP 下的文章

部署一个新项目,composer install 的时候报错:

PHP Fatal error:  Uncaught Error: Class "Normalizer" not found in /usr/share/php/Symfony/Component/String/AbstractUnicodeString.php:31

这个问题是因为 Normalizer 类没有被找到,这个类是 Symfony 组件的一部分,并且依赖于PHP的国际化扩展 php-intl。

需要手动安装一下。

我的服务器是 ubunut, php 版本是 8.3,直接使用 apt 安装:

sudo apt install php8.3-intl

也可以考虑使用 pecl 安装:

pecl install intl

检查扩展是否已生效:

php -m | grep intl

重新 composer install,问题解决。

刚用 AI 写了个处理 YAML 的小工具,因为是 php 写的,直接用了 yaml 扩展。

一运行发现我本地的 php8.3 还没安装 yaml 扩展,虽然可以改成使用第三方包,但觉得还是安装一下试试。

执行 pecl install yaml,提示找不到 libyaml 包。

checking for yaml headers... not found
configure: error: Please install libyaml
ERROR: `/private/tmp/pear/temp/yaml/configure --with-php-config=/opt/homebrew/opt/php/bin/php-config --with-yaml' failed

- 阅读剩余部分 -

DokuWiki 是一个简单易用、用途多样并且不依赖数据库的开源维基软件。它因简洁易读的语法受到用户的喜爱。而容易维护、备份方便和易于整合则使它成为管理员的最爱。

我的环境:

  • ubuntu 22.04
  • nginx 1.18
  • php8.1
  • mysql8

安装步骤

  1. DokuWiki 官网下载页 下载最新稳定版本;
  2. 解压到 /var/www/dokuwiki,作为项目根目录;
  3. 将根目录下的 dataconf 设置为可写;
  4. 配置 nginx,新增配置文件 /etc/nginx/sites-enabled/dokuwiki:

- 阅读剩余部分 -

前两天初始化了一个新项目,使用的是全新的 symfony 6.4。由于使用了最小化的创建命令,导致很多非核心的组件没有安装,一个个安装完,修改好 .env 环境变量配置文件,在 dump 的时候报错:

$ APP_ENV=dev APP_DEBUG=1 php bin/console dotenv:dump
  There are no commands defined in the "dotenv" namespace.  

执行安装命令 composer require symfony/dotenv 的时候没有任何异常。于是一步步检查,最终发现了命令的注册有问题。

对照了一下老项目,发现问题就是没注册服务。

config/services.yaml 配置文件中,添加以下配置:

services:

    # 注册 dotenv:dump 命令
    Symfony\Component\Dotenv\Command\DotenvDumpCommand:
        - '%kernel.project_dir%/.env'
        - '%kernel.environment%'

再次执行,问题解决。

接上文。

上文中提到 composer install 遇到的报错其实有两个,第一个是 Redis 扩展的问题,第二个就是 php 版本问题。

我安装的依赖有个依赖还不支持 php 8.3,这时候其实只要升级这个依赖的版本问题应该就可以解决了。

但我还是想切换回 php8.1,因为我的 fpm 跑的还是 8.1,cli 里跑 8.3 其实并不 make sense。

- 阅读剩余部分 -

今天用 composer require 一个库,报错,提示缺少 redis 扩展。

2024-04-16T10:35:05.png

我的 php 是用 homebrew 安装的,之前用的是 8.1,估计前不久升级了一下,现在看是 8.3 了。

于是尝试使用 brew install php@8.3-redis,发现没有这个包。

想了一下用 pecl 安装。

pecl install redis

一路使用默认选项,竟然很顺利地安装成功了。

2024-04-16T10:36:50.png

- 阅读剩余部分 -

我用 PHP 脚本写了一个订阅 redis 列表的命令,但我发现跑了没多久就连接失败退出了。

报错的提示是:read error on connection to 127.0.0.1:6379

试了两次发现时间差不多,估计是触发了 PHP 的某个默认配置。

好在现在有了 ChatGPT,不需要去慢慢查文档了。

问了一下 ChatGPT,给出的 4 个可能原因中,第三个非常 match:

如果在读取数据时连接突然中断,可能是由于连接超时、网络中断或 Redis 服务器故障引起的。在 PHP 中,可以使用 ini_set('default_socket_timeout', -1); 来设置无限制的超时时间,以确保连接不会因为超时而关闭。

在脚本之前加上 ini_set('default_socket_timeout', -1); 再跑,果然 work 了。

查了下 php.ini 的配置,默认的时间果然是 60 秒。

自从有了 ChatGPT,Google 变得没那么重要了。。。

如果用 Google,可能我还在翻 StackOverflow 或者 php.net 寻找问题的可能原因。

如果用 Bing,可能我还在关闭 CSDN 页面上的广告。

如果用百度,可能我又要被哪个卖课的骗进去了。

现在体会到 ChatGPT 发布后,Google 为啥那么着急了。。。

基于 Monolog 构造了一个日志生成器。

需要根据情况区分日志渠道,场景是根据运行环境(fpm 和 cli)自动区分。

查了一下,可以使用 php_sapi_name 方法确定是否是 cli 环境:

public static function logger($alias = null): LoggerInterface
{
    if (empty($alias)) {
        $alias = php_sapi_name() === 'cli' ? 'cli' : 'fpm';
    }
    return self::initLogger($alias);
}

效果不错。