PHP 扩展管理工具 PIE

PHP PIE(PHP Installer for Extensions)是 PHP 官方推出的一款现代化扩展管理工具,旨在简化 PHP 扩展的安装与管理流程,被视为 PECL(PHP 扩展社区库)的潜在替代方案。

首个公开版本发布于 2023 年下半年,具体而言,其在 GitHub 上的首个正式发布版本(v0.1.0)于 2023 年 9 月推出。这一工具由 PHP 基金会主导开发,旨在为 PHP 扩展管理提供更现代化、自动化的解决方案,逐步替代传统的 PECL 工具。

自首次发布以来,PHP PIE 持续迭代更新,不断扩展支持的扩展范围并优化功能,截至目前(2025 年)已推出多个版本,成为 PHP 生态中备受关注的扩展管理工具。其发展节奏与 PHP 基金会对现代化工具链的推进策略相契合,进一步巩固了在 PHP 扩展管理领域的地位。

以下是其核心特性和使用要点:

核心特性

1.类似 Composer 的使用体验

采用简洁的命令行语法,类似composer的操作逻辑,例如:

1
2
pie install xdebug/xdebug  # 安装Redis扩展
pie install xdebug/xdebug:^3.2 # 安装指定版本的Xdebug

2.自动化处理流程

  • 自动从 Packagist 获取扩展包,无需手动查找资源。
  • 自动编译扩展(Linux/macOS)或使用预编译 DLL(Windows)。
  • 自动修改 php.ini 配置文件,添加扩展加载指令(如 extension=redis)。

3.多 PHP 版本支持

可指定为不同 PHP 版本安装扩展,例如:

1
pie install mongodb/mongodb --php /usr/bin/php8.4  # 为PHP 8.4安装MongoDB扩展

4.与现代开发流程兼容

支持在 CI/CD 管道中自动化安装扩展,无缝融入项目的自动化部署流程。你可以在 shell 脚本中添加 pie install 命令,实现自动安装扩展,也可以在 Docker 配置中指定安装哪些模块。

使用前提

  • 运行环境需 PHP 8.1 及以上版本(PIE 自身依赖),但可管理其他 PHP 版本的扩展。
  • Linux/macOS 需安装编译工具链(如gcc、make);
  • Windows 依赖扩展作者提供的预编译 DLL。

安装与配置

  1. 下载pie.phar(官方发布地址:GitHub)。
    curl -O https://github.com/php/pie/releases/latest/download/pie.phar

  2. 配置为全局命令(Linux/macOS 太容易搞定,我们就以 Windows 为例):

    • pie.phar 保存到 D:\portable\pie\ 目录。
    • 创建 pie.bat 文件,内容为: php "%~dp0pie.phar" %*
    • D:\portable\pie\ 添加到系统环境变量 Path 中,这样就可以直接在命令行使用pie命令了。
  3. 验证安装:在命令行中运行 pie -V,若显示版本信息则安装成功。

扩展安装位置

pie.phar 如果与执行php.exe在同一个目录,那么扩展默认安装到 ~/ext 文件夹中,否则默认安装到 pie.phar 所在目录的 ext 文件夹中。

适用场景与局限

  • 推荐场景:
    • 基于 PHP 8.1 + 的新项目
    • 需要自动化管理扩展的 CI/CD 流程
    • 主流扩展(如 Redis、Xdebug、MongoDB)的安装管理
  • 当前局限:
    • 扩展覆盖度不及 PECL,部分冷门扩展暂不支持(可在这里查看已支持的PHP扩展
    • Windows 环境依赖预编译 DLL,部分扩展可能无法安装
    • 暂未提供扩展卸载功能,需手动操作

解决 docker 报错 Error response from daemon

直接在浏览器中打开网址 https://registry-1.docker.io/v2/ 连不上,说明网络有问题。
原因是网络连接失败,原因你知道。

加入 dns 配置,修改镜像源

修改配置文件 /etc/docker/daemon.json, Windows 为 C:\Users\用户名\.docker\daemon.json 文件,加入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"dns": [
"8.8.8.8",
"8.8.4.4"
],
"registry-mirrors": [
"https://docker.m.daocloud.io/",
"https://huecker.io/",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru/",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://xx4bwyg2.mirror.aliyuncs.com",
"http://f1361db2.m.daocloud.io",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
]

重启 docker 服务

Windows 下如果重启无效,可退出 Docker Desktop 再打开。

如何在 WebStorm 中调试 AdonisJS 项目,超详细教程来了!

AdonisJS 官方文档虽然详尽地涵盖了 VSCode 的调试指南,却没有关于 Jetbrains 系列产品的相应调试说明。
了解 Jetbrains 产品的调试配置以后,要配置 WebStorm 来调试 AdonisJS 其实是非常容易的。

步骤一: 创建或编辑运行/调试配置

用 WebStorm 打开你的 AdonisJS 项目后,点击调试工具栏上的下拉菜单,点击编辑配置。

在弹出的窗口中,点击右上角的“+”按钮,选择“Node.js”作为调试类型,然后(如下图)输入配置信息。

  • 【名称】输入调试配置的名称,便于识别。
  • 【Node 解释器】选择项目所使用的 Node 解释器。
  • 【工作目录】为项目根目录。
  • 【应用程序形参】输入 ace serve --hmr

步骤二: 启动调试

点击调试工具栏的下拉菜单,选择刚加的调试配置(如下图)

然后再点击调试按钮(那只小虫子,如下图),或者按 Shift + F9 快捷键,就可以启动调试了。

启动调试后,只要给程序执行经过位置加上断点,程序执行到断点处就会暂停下来,这样我们就可以查看程序当前执行所在位置的各个变量的值了。

具体调试操作就不多说了,你自己能搞定。

Certbot 部署 Nginx 免费 SSL 证书

在 Linux 上使用 Certbot 为 Nginx 部署 SSL 证书是一个很简单的过程,只需要执行几个命令就可以。
以下演示在 Ubuntu/Debian 上通过 Certbot 为 Nginx 服务器获取并安装SSL证书,其他 Linux 系统安装命令类似。

安装 Nginx

首先,确保你的 Ubuntu/Debian 服务器上已经安装了 Nginx。如果还没有安装,可以使用以下命令进行安装:

1
2
sudo apt update
sudo apt install nginx

部署 Nginx http 站点

先部署好 Nginx http 站点,certbot-nginx 插件将自动往 Nginx 配置中加入 SSL 部署配置。

安装 Certbot 及其 Nginx 插件

1
2
sudo apt install certbot python3-certbot-nginx
#sudo apt install certbot python3-certbot-apache # Apache 可使用此命令

获取并安装SSL证书

安装 Certbot 和 Nginx 都安装后,你可以使用 Certbot 的 Nginx 插件来自动为你的网站获取并安装SSL证书。运行以下命令:

1
2
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
#sudo certbot --apache -d yourdomain.com -d www.yourdomain.com # Apache 可使用此命令

记得将 yourdomain.com 替换为你的实际域名。

执行此命令, Certbot 将执行以下操作:

  • 自动检测你的 Nginx 配置。
  • 提示你验证对域名的所有权(通过请求域名 HTTP 站点)。
  • 获取 Let’s Encrypt 的 SSL 证书。
  • 自动修改 Nginx 配置文件,以使用新的 SSL 证书和密钥。
  • 重新加载 Nginx 以应用更改。
  • 加入定时更新证书的系统任务。

使用 fnm 管理多版本 Node.js

fnm(Fast and Minimal Node Manager)是一个相对较新的 Node.js 版本管理工具。它的设计目标是提供一个快速且轻量级的解决方案,用于安装、管理和切换不同版本的 Node.js
与 nvm(Node Version Manager)相比,fnm 强调更少的依赖和更快的启动速度,并且支持跨平台,Windows/Linux/Mac 都能用。

1、安装 fnm

全平台安装

如果你的电脑安装了 rust 环境,可直接用 cargo 安装

1
cargo install fnm

Linux/Mac 下安装

使用脚本安装

1
curl -fsSL https://fnm.vercel.app/install | bash

或者使用 brew 安装

1
brew install fnm

Windows 下安装

1
winget install Schniz.fnm

2、激活 fnm

Linux/Mac

1
2
eval "$(fnm env --use-on-cd --shell bash)"
source ~/.bashrc

Windows

将以下代码加入 PowerShell 的配置文件。

1
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression

powershell 配置文件不同版本的windows 可能位置不一样,
可能位于 ~\.config\powershell\Microsoft.PowerShell_profile.ps1
也可能位于 ~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
notepad $profile 或 (如果安装了VSCode)code $profile 命令即可打开编辑。

3、使用

1
2
3
4
5
6
7
8
fnm list # 查看本地已安装 Node.js 版本
fnm list-remote # 查看全部可安装的版本
fnm install 23 # 安装 Node.js v23 最新的子版本
fnm install --lts # 安装当前 lts 版
fnm use 23 # 使用 v23.x ,如 v23.1.0,仅当前终端切换,其它终端窗口不受影响
fnm use system # 使用系统的 Node.js(不是通过 fnm 安装的)
fnm default 23 # 把默认 Node.js 版本切换到 v23.x,所有终端默认的 Node.js 将使用该版本
fnm default system # 把默认 Node.js 切换到系统安装的程序

fnm 安装的 Node.js 程序位于 Windows 的 ~\AppData\Roaming\fnm\node-versions,Linux/Mac 的 ~/.local/share/fnm/node-versions
Node.js 对于一机多版本的需求没 Python 那么强,一般情况下安装当前 LTS 版就够用了。

Gradle 下载太慢,使用国内源加速

1、修改 gradle-wrapper

修改 gradle-wrapper.properties 文件的 distributionUrl 参数

1
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip

2、更换仓库

项目根目录下的 build.gradle 文件的 buildscript.repositories 加入:

1
2
maven { url 'https://maven.aliyun.com/repository/google' } // Google Maven镜像
maven { url 'https://maven.aliyun.com/repository/public' } // Maven Central 镜像

3、执行 sync

记一次 tailwind @apply 编译速度极慢的解决过程

新的 Vue 项目使用了 Tailwind + SCSS,突然发现修改 app.scss 文件的时候,热更新需要 14s+ 才能加载完成。和之前项目唯一不同的是scss的 @import 换成了 @use,这地方应该没问题,sass 团队不可能会犯这么低级的错误。

突然想起,前两天把 128k 的地区数据 regions.js 放 src 目录下了,很有可能是这个引起的。试着把该文件移出 src 目录,还真是。解决:把该文件改为 json 格式,放到 assets 目录。

默认的 tailwind 配置会扫描源码目录下的 vue,js,ts,jsx,tsx 文件,js 文件过大太复杂的时候就会引起问题了。我项目只有 vue 文件需要taiwnid 扫描,把其他后缀去掉,热加载速度明显快很多。配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
// "./src/**/*.{vue,js,ts,jsx,tsx}",
"./src/**/*.vue",
],
theme: {
extend: {},
},
plugins: [],
}

PhpStorm / WebStorm 中 TailwindCSS 没有自动提示

PhpStorm / WebStorm 新建项目中,有时候 TailwindCSS 自动提示没有出来。
原因如下:

  • 1、只支用 npm,你项目可能用 pnpm 了
  • 2、IDE 设置的 Node 解释器可能跟你项目使用的解释器不对应。

打开 “设置 > 语言和框架 > Node.js”,选择“Node 解释器”为当前项目使用的 node 解释器。有时候项目在 wsl 中开发,默认是本地的 node,会导致问题。

Laravel 新旧版本模型属性访问器、修改器的选用

Laravel 9 之前模型属性访问器、修改器

通过 setFooBarAttribute($value)getFooBarAttribute() 方法来定义和访问自定义动态 fooBar 属性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
/**
* 设置用户的名字
*/
public function setFirstNameAttribute($value)
{
$this->attributes['first_name'] = strtolower($value);
}

/**
* 获取用户的全名
*/
public function getFullNameAttribute()
{
return "{$this->first_name} {$this->last_name}";
}
}

Laravel 9 及之后版本的模型属性访问器、修改器

通过返回值类型为 Attribute 类来定义和访问自定义动态属性。

阅读更多

跨境电商系统多语言内容的设计方案

方案1:一个表设计一个多语言内容关联表

表解构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- product_categories 
- id
- product_categorie_l10ns
- category_id # 关联 product_categories.id
- locale
- name
- products
- id
- category_id # 关联 product_categories.id
- product_l10ns
- product_id # 关联 products.id
- locale
- title
- desciption
- detail
阅读更多