分类 PHP 下的文章

刚用 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);
}

效果不错。