分类 PHP 下的文章

在 PHP 8.5 中引入的 pipe 管道操作符 (|>) 是一个非常实用的新语法特性,它为函数调用链式表达提供了更清晰的写法。传统上,如果我们需要把一个值依次传入多个函数,往往要么嵌套调用(可读性差),要么借助临时变量。管道语法的核心思想是:将左边的表达式结果,作为参数传递给右边的函数。这样可以让代码像数据流一样从左到右自然流动。

例如,过去我们可能会写:

$result = strtoupper(trim($name));

使用管道语法后,可以改写为:

$result = $name |> trim($$) |> strtoupper($$);

- 阅读剩余部分 -

公司有个项目用了 hyperf 框架,需要安装 swoole 扩展,我的新 m4 macbook air 尚未装过,执行 pecl install swoole,结果报错了。

In file included from /private/tmp/pear/temp/swoole/ext-src/php_swoole.cc:26:
/opt/homebrew/Cellar/php@8.3/8.3.19_1/include/php/ext/pcre/php_pcre.h:23:10: fatal error: 'pcre2.h' file not found
   23 | #include "pcre2.h"
      |          ^~~~~~~~~
1 error generated.
make: *** [ext-src/php_swoole.lo] Error 1
ERROR: `make' failed

提示缺少文件,手动安装了一下 pcre2,发现早就装过了,看来问题是找不到,而不是没有装。

- 阅读剩余部分 -

部署一个新项目,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

- 阅读剩余部分 -