MoreRSS

site iconLuffy | 沈唁志修改

分享 PHP、Swoole 技术资源、实用插件、有趣网站和 WordPress 相关内容。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Luffy | 沈唁志的 RSS 预览

如何使用 Nginx 配置自定义日志并记录用户信息

2024-12-25 10:40:09

在 Web 开发中,日志记录和 HTTP 头部信息的传递非常重要。

Nginx 和 PHP 作为常见的 Web 服务器和处理引擎,结合使用时可以提供强大的日志记录功能和灵活的头部管理。

本文将介绍如何通过 Nginx 配置自定义日志格式、隐藏特定的 HTTP 头信息,并在 PHP 端输出特殊的 Header 信息,以便在 Nginx 日志中记录详细的用户信息。

1. 新增自定义日志格式

通过修改 Nginx 配置,可以定义一个新的日志格式,用于记录详细的用户信息。这个配置将帮助记录 PHP 动态生成的用户信息(如用户 ID、账号等)。

配置步骤

在 Nginx 配置文件中,定义自定义的日志格式,并在访问日志中加入 X-User-Info 头部:

http {
    # 定义自定义日志格式
    log_format custom_log '$remote_addr - $remote_user [$time_local] "$request" '
                           '$status $body_bytes_sent "$http_referer" '
                           '"$http_user_agent" "$http_x_forwarded_for" '
                           '$request_time $upstream_response_time '
                           '$http_x_user_info';  # 记录 X-User-Info 头部信息

    # 使用自定义格式记录日志
    access_log /var/log/nginx/custom_access.log custom_log;
}

在这个配置中:

  • log_format custom_log 定义了日志格式,其中 $http_x_user_info 用来记录通过 HTTP 头传递的用户信息。
  • access_log 指令将日志输出到指定的文件 /var/log/nginx/custom_access.log,并使用定义的 custom_log 格式。

2. 隐藏特定的 HTTP 头信息

在某些情况下,可能不希望某些敏感的 HTTP 头暴露给客户端。Nginx 提供了 proxy_hide_header 指令来隐藏这些头部信息。

此功能特别有用,当需要阻止某些信息(如用户的详细信息)暴露给客户端时。

配置步骤

假设希望隐藏 X-User-Info 头部信息,可以在 location 配置中使用 proxy_hide_header 指令:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend_server;

        # 隐藏 X-User-Info 头部信息
        proxy_hide_header X-User-Info;
    }
}

此配置确保即使 X-User-Info 头部信息在请求中被发送到 Nginx,Nginx 也不会将该头部返回给客户端,从而保护敏感信息。

3. 在 PHP 端输出特殊的 HTTP 头

在 PHP 中,可以动态生成和输出特定的 HTTP 头部信息,并将其传递给 Nginx。比如,在响应头中输出用户信息(如用户 ID、账号等),然后在 Nginx 日志中记录这些信息。

PHP 代码示例

在 PHP 中,可以使用 header() 函数来输出自定义的 HTTP 头。

以下是一个示例,展示如何在 PHP 中生成并发送 X-User-Info 头部信息:

<?php
// 启动会话并获取用户信息
session_start();
$user_id = isset($_SESSION['user_id']) ? $_SESSION['user_id'] : 'guest';

// 构造用户信息字符串
$user_info = "user_id={$user_id};";

// 设置 HTTP 头部
header("X-User-Info: {$user_info}");

// 其他 PHP 逻辑...
?>

在这段 PHP 代码中:

  • 通过 session_start() 获取当前用户的 ID(假设它存储在会话中)。如果用户未登录,则默认为 'guest'
  • 获取了用户的 IP 地址、浏览器信息以及当前时间。
  • 使用 header() 函数,将这些信息作为 X-User-Info 头部发送到 Nginx。

4. 结合使用自定义日志格式和隐藏 HTTP 头

在 Nginx 中配置了自定义日志格式,并在 PHP 中输出了 X-User-Info 头部信息。接下来,可以将这两部分结合使用,确保详细的用户信息能够记录到日志中,同时确保这些信息不会暴露给客户端。

完整配置

http {
    # 定义自定义日志格式
    log_format custom_log '$remote_addr - $remote_user [$time_local] "$request" '
                           '$status $body_bytes_sent "$http_referer" '
                           '"$http_user_agent" "$http_x_forwarded_for" '
                           '$request_time $upstream_response_time '
                           '$http_x_user_info';  # 记录 X-User-Info 头部信息

    # 使用自定义格式记录日志
    access_log /var/log/nginx/custom_access.log custom_log;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend_server;

            # 隐藏 X-User-Info 头部信息
            proxy_hide_header X-User-Info;
        }
    }
}

在这个完整配置中:

  • 定义了一个自定义的日志格式 custom_log,其中 $http_x_user_info 用来记录通过 PHP 生成的 X-User-Info 头部。
  • location 块中,使用 proxy_hide_header 隐藏了 X-User-Info 头部,确保敏感信息不会被返回给客户端。

5. 结论

通过结合 Nginx 和 PHP,可以实现以下目标:

  • 详细记录用户信息:通过 X-User-Info 头部将用户的 ID、账号等记录到 Nginx 日志中,便于后续的行为分析和问题排查。
  • 隐藏敏感信息:使用 proxy_hide_header 隐藏特定的 HTTP 头,确保敏感信息不被暴露给客户端。
  • 灵活控制日志内容:通过动态生成 HTTP 头部信息,可以根据需要灵活地定制日志内容,提供更多关于用户行为和请求的详细数据。

这种配置适用于需要详细日志记录的高流量站点,尤其是在需要跟踪用户活动、分析访问模式或保护敏感数据时。

通过合理的日志管理和头部处理,可以在保障系统性能和安全性的同时,提供更丰富的数据支持。

Nginx 配置证书时报错:SSL_CTX_use_PrivateKey failed

2024-12-13 10:20:33

在配置 Nginx SSL 证书时,如果遇到以下错误:

nginx: [emerg] SSL_CTX_use_PrivateKey failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)

这应该是 SSL 证书和私钥之间的公私钥对不匹配。这篇文章就展开地分析这个问题的原因和解决方案。

错误分析

该错误表示 Nginx 在加载私钥时,检测到证书和私钥之间不匹配。常见原因如下:

  1. 使用了错误的证书文件,如其他域名的证书。
  2. 在配置时不小心选择了错误的私钥文件。
  3. 证书或私钥文件被损坏。
  4. CSR 文件和私钥不匹配。

解决方案

  1. 检查证书和私钥是否匹配

通过 OpenSSL 命令检查证书和私钥的 MD5 值是否匹配:

查看私钥的 MD5 值:

openssl rsa -noout -modulus -in your_private.key | openssl md5

查看证书的 MD5 值:

openssl x509 -noout -modulus -in your_certificate.crt | openssl md5

CSR 的 MD5 值(如果有):

openssl req -noout -modulus -in your_request.csr | openssl md5

如果 MD5 值不匹配,请确保使用了正确的私钥和证书。

  1. 检查私钥是否有效

使用下列命令检查私钥是否有效:

openssl rsa -check -in your_private.key

如果私钥损坏,需重新生成私钥和证书。

  1. 检查证书链是否完整

为了确保证书链完整,可将证书和中间证书合并:

cat your_certificate.crt intermediate_certificate.crt > full_chain.crt

然后在 Nginx 配置文件中指向此合并证书:

ssl_certificate /path/to/full_chain.crt;
ssl_certificate_key /path/to/private.key;
  1. 重新生成 CSR 和私钥

如果不能确保证书和私钥是否一致,可考虑重新生成 CSR 和私钥:

生成新的私钥:

openssl genrsa -out new_private.key 2048

生成 CSR:

openssl req -new -key new_private.key -out new_request.csr

然后将 CSR 提交给 CA (证书授权机构),以获取新证书。

  1. 检查 Nginx 配置

确保配置文件中指向正确的证书和私钥路径,如在 Nginx 中的配置示例:

ssl_certificate /etc/nginx/ssl/full_chain.crt;
ssl_certificate_key /etc/nginx/ssl/private.key;

配置保存后,重启 Nginx:

sudo nginx -t
sudo systemctl reload nginx

这个错误通常是由于证书和私钥不匹配或配置错误导致。通过检查证书和私钥的 MD5 值、检查配置文件和确保证书链完整,可以解决这个问题。

PHP 8.4 发布!

2024-11-20 14:05:13

PHP 8.4 是一个重要的版本,它带来了主要的新功能、对构建依赖项和底层库的几项更新,以及相当多的弃用,以消除旧版 PHP 中一些遗留的不良行为和功能。

它包含许多新功能,例如属性钩子、不对称可见性、更新的 DOM API、性能改进、错误修复和常规清理等。

属性钩子和不对称可见性

PHP 8.4 中最重要的功能之一是新增了 属性钩子 和为 get 和 set 操作分别声明可见性 的功能。

属性钩子

属性钩子允许在访问或设置属性时执行“钩子”逻辑:

class Locale
{
    public string $languageCode;

    public string $countryCode
    {
        set (string $countryCode) {
            $this->countryCode = strtoupper($countryCode);
        }
    }

    public string $combinedCode
    {
        get => \sprintf("%s_%s", $this->languageCode, $this->countryCode);
        set (string $value) {
            [$this->countryCode, $this->languageCode] = explode('_', $value, 2);
        }
    }

    public function __construct(string $languageCode, string $countryCode)
    {
        $this->languageCode = $languageCode;
        $this->countryCode = $countryCode;
    }
}

$brazilianPortuguese = new Locale('pt', 'br');
var_dump($brazilianPortuguese->countryCode); // BR
var_dump($brazilianPortuguese->combinedCode); // pt_BR

非对称可见性

非对称可见性允许为 getset 操作定义不同的作用域:

class PhpVersion
{
    public private(set) string $version = '8.4';
}

$phpVersion = new PhpVersion();
var_dump($phpVersion->version); // string(3) "8.4"
$phpVersion->version = 'PHP 8.3'; // Visibility error

改进的 HTML5 解析器

PHP 8.4 的 DOM 扩展也进行了一次重大功能更新。之前,DOM 扩展仅提供 libxml2 来解析 HTML,而 libxml2 并未跟上 HTML5 的进展。现在,DOM 扩展新增了 Dom\HTMLDocumentDom\XMLDocument 类,其中前者支持 HTML5 合规的解析。

在这一领域有很多新的改进,包括不仅仅是HTML5 解析支持,还包括DOM 规范合规性,以及若干小的增强,比如添加了对 CSS 选择器的支持。

BCMath 扩展新增 Number 类和新函数

PHP 8.4 中的 BCMath 扩展现在支持运算符重载,提供了新的类支持!

use BcMath\Number;

$num1 = new Number('22');
$num2 = new Number('7');
$num3 = new Number('100');

$result = ($num1 / $num2) + $num1 - $num2;
echo $result; // 18.1428571428

现在,不再需要使用 BCMath 函数如 bcaddbcsubbcdiv 等,可以直接使用标准运算符(+-/ 等)。

新的 BcMath\Number 类支持运算符重载,虽然用户自定义 PHP 类尚不支持此功能,但 BCMath 扩展已经实现了这一点,因此可以像使用常规数字一样使用这些对象。

BcMath\Number 类实现了 Stringable 接口,因此这些对象可以在需要字符串的地方使用(比如上例中的 echo 调用)。此外,该类实现了所有的 bc* 函数。例如,还可以调用 $num->add($num2)$num->add('5'),它会返回一个新的 BcMath\Number 对象,而不会修改原始对象,这使得这些对象是不可变的。

新增函数

PDO 驱动特定子类

PDO 驱动特定子类 RFC 已在 PHP 8.4 中实现。它曾在 PHP 8.3 中进行投票,但由于 8.3 的功能冻结,未能实现。

PHP 8.4 现在新增了 Pdo\MysqlPdo\PgsqlPdo\SqlitePdo\DbLibPdo\Firebird 类,这些类扩展了 PDO 类。现在可以在驱动特定子类中使用驱动特定的方法、属性和常量。驱动特定的子类还允许通过只接受/返回驱动特定的子类来使 API 更加明确和限制。

解耦扩展

IMAP、Pspell、OCI8 和 PDO_OCI8 扩展已从 PHP 核心中解耦,现在作为 PECL 扩展提供,用户可以通过 PIE 轻松安装这些扩展。

PHP 发布周期更新

2024 年 4 月,PHP 投票并通过了一项 RFC 提案,以更新 PHP 的发布周期政策。

此前,PHP 核心团队提供两年活跃支持,然后是一年的安全修复支持。

而现在从 PHP 8.1(2021 年 11 月发布)起,所有 PHP 版本将获得 两年安全修复支持,活跃支持期保持两年不变。

此外,活跃支持和生命周期终止(EOL)的日期将调整为日历年的 12 月 31 日,使这些日期更加可预测。

以下是当前 PHP 版本的更新支持和生命周期终止日期,变更部分用加粗标注:

PHP 版本 发布时间 活跃支持至 生命周期终止日期
PHP 8.1 2021-11-25 2023-11-25 2025-12-31
PHP 8.2 2022-12-08 2024-12-31 2026-12-31
PHP 8.3 2023-11-23 2025-12-31 2027-12-31
PHP 8.4 2024-11-21 2026-12-31 2028-12-31
PHP 8.5 2025-11 2027-12-31 2029-12-31

更多信息可以查看 PHP 版本发布页面

使用 acme.sh 自动申请并更新泛域名证书

2024-11-01 15:49:25

在互联网快速发展的今天,网站安全愈发重要,而 SSL/TLS 证书成为了保护网站数据的基础。对于管理多个子域的用户来说,泛域名证书(Wildcard Certificate)是一种高效便捷的选择。

各家云厂商也开始割起来了域名证书的韭菜,泛域名证书收费昂贵,单域名证书免费但将有效期都调整为了三个月。

我之前也是宁愿花费一些小钱来解决这个问题,一年更新一次也不是不行,现在调制为三个月后就需要频繁更新了,正好之前的服务器过期,迁移之后顺便研究起来了证书部署的问题,于是有了这篇文章。

什么是 acme.sh?

ACME(自动证书管理环境)是一个互联网工程任务组维护的协议,它允许自动化 Web 服务器证书的部署,acme.sh 是支持 ACME 协议流行的客户端之一,可以通过其实现 SSL 证书的自动申请、续期等。

安装

在使用 acme.sh 前,需要先在服务器上安装它。acme.sh 的安装过程简单,只需执行几条命令即可。

curl https://get.acme.sh | sh -s [email protected]

[email protected]更换为自己的邮箱后执行,安装主要把 acme.sh 安装到你的 home 目录下,并且添加了一个 crontab 用于自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

注册 ZeroSSL 账号

acme.sh 目前默认使用ZeroSSL.com,ZeroSSL 没有速率限制,可以颁发无限制、有效期为 90 天的 TLS/SSL 证书。

  1. 先去创建一个 ZeroSSL 账号

  2. 访问 https://app.zerossl.com/developer 生成你的 EAB 凭证,点击EAB Credentials for ACME Clients

  3. 执行命令,注册你的 EAB 凭证,将 xxxxxxxxx 替换为第二步获取到的内容

acme.sh --register-account --server zerossl \
        --eab-kid xxxxxxxxx  \
        --eab-hmac-key xxxxxxxxx

申请签发泛域名证书

我选择直接使用 DNS API 模式进行签发,还支持其他模式可以自己研究,我的域名都在腾讯云,所以通过 DNSPod 可以管理。

登录 DNSPod 控制台获取到 DNSPod Token:https://console.dnspod.cn/account/token/token

获取后将值存入到系统环境变量中:

vim ~/.bashrc

#写入
export DP_Id=
export DP_Key=

#保存后执行
source ~/.bashrc

保存后就可以开始申请了:

acme.sh --issue --dns dns_dp -d example.com -d *.example.com

运行后,acme.sh 将自动为example.com域名申请泛域名证书,如果没有出错,会将证书文件保存在~/.acme.sh/example.com/目录下,并且会自动为该域名创建配置,以便自动执行续期任务。

安装证书

acme.sh 不建议直接使用~/.acme.sh/目录下的证书文件,而是通过 acme.sh 提供的命令将证书安装到指定位置,以确保证书的正确使用和续期。

acme.sh --install-cert -d example.com \
        --key-file       /path/to/keyfile/in/nginx/key.pem  \
        --fullchain-file /path/to/fullchain/nginx/cert.pem \
        --reloadcmd     "service nginx force-reload"

将路径设置为自己的路径即可,在reloadcmd中执行重启 Nginx 的命令,到这一步本机的证书已经是没问题了,但是如果使用了 CDN 等服务的话,仍然需要更新对应服务的证书配置。

acme.sh 提供了阿里云 CDN 的脚本,没有腾讯云的,所以我自己顺手写了一个小工具。

Cert Manager

将本地通过 acme.sh 生成的证书上传到对应云服务的证书服务中,以便于在云服务中使用证书。

composer create-project sy-records/cert-manager
cd cert-manager
chmod +x tx-cert-manger

调用了腾讯云的获取证书列表和一键更新旧证书资源两个接口,可以直接更新对应的资源使用的证书,支持 clb、cdn、waf、live、ddos、teo、apigateway、vod、tke、tcb、tse、cos。

使用 composer 安装后,获取腾讯云的 SecretId 和 SecretKey,也放到环境变量中:

vim ~/.bashrc

#写入
export TX_SECRET_ID=
export TX_SECRET_KEY=

#保存后执行
source ~/.bashrc

config.example.php复制一份到config.php,并根据实际情况修改配置:

return [
    'example.com' => [
        'resourceTypes' => ['cdn'],
        'fullchain' => '/path/to/fullchain/nginx/cert.pem',
        'privkey' => '/path/to/keyfile/in/nginx/key.pem',
    ]
];

这样就可以使用tx-cert-manger命令来更新腾讯云的服务了。

# 更新所有配置文件中的证书
./tx-cert-manger

# 更新指定域名的证书
./tx-cert-manger example.com

配合 reloadcmd,就可以实现续期后自动更新证书文件到腾讯云,并重启本地的 Nginx 服务了。

acme.sh --install-cert -d example.com \
        --key-file       /path/to/keyfile/in/nginx/key.pem  \
        --fullchain-file /path/to/fullchain/nginx/cert.pem \
        --reloadcmd     "service nginx force-reload & /path/to/cert-manager/tx-cert-manger example.com"

acme.sh 是一个功能强大、配置灵活的 ACME 客户端,特别适合需要管理多个域名和子域名的用户。

通过 acme.sh,不仅可以快速申请泛域名证书,还能轻松实现自动更新,降低了 SSL 证书管理的复杂度。

如果你的站点涉及多个子域名,那么使用 acme.sh 申请泛域名证书是一个不错的选择。

PIE:PHP 扩展管理的未来,替代 PECL 的新选择

2024-10-10 17:47:34

PHP 扩展开发和管理的流程在多年来通过 PECL(PHP 扩展社区库)得到了显著的优化。为了继续提升开发者体验,PIE 的出现为此带来了新的可能性。

在 23 年 12 月份,PHP 邮件列表收到了由 Derick 发送的一封新邮件:New "PECL"

在 PHP 基金会内部,已经讨论了一段时间如何处理 PECL 及其网站,PECL 的现状是代码老旧,难以维护,数据库中充满了乱码。查看邮件原文

什么是 PECL

PECL(PHP Extension Community Library)是一个专门用于托管和管理 PHP 扩展的社区库。PHP 扩展是一种用来增强 PHP 核心功能的模块,开发者可以通过这些扩展来实现额外的功能,比如数据库驱动、图像处理、缓存系统、加密工具等。

PECL 提供了一个集中化的目录,开发者可以浏览、下载和安装各种扩展。它还为开发者提供了扩展的开发和托管设施,使得社区能够参与扩展的维护和改进。许多 PHP 扩展的源代码都托管在 PECL 上,开发者可以在其基础上进行二次开发。

PECL 的打包和分发系统与 PEAR(PHP Extension and Application Repository)共享。PEAR 主要面向可重用的 PHP 库和组件,而 PECL 则专注于底层扩展。两者都使用相同的包管理工具来简化安装和管理过程。PECL 扩展可以通过 pecl 命令行工具直接安装,这极大地方便了开发者的使用。

通过 PECL,PHP 开发者可以快速找到并集成高质量的扩展,提升 PHP 应用的性能和功能。

前往 PECL 官网了解更多信息。

对于扩展开发者,发布版本的时候,需要登录 PECL 网站,并将打包好的 zip 包上传到 PECL,而且只能 lead角色上传,developer角色是无法上传的。

对于用户,PECL 也是一种过时的安装方式,而通过 Composer 处理用户空间代码要容易得多

所以才有了本篇文章要介绍的 PIE,用于替代 PECL

什么是 PIE

PIE(PHP Installer for Extensions) 是一个全新的工具,专为 PHP 开发者设计,目的是提供一个更轻量、更现代化的 PHP 扩展管理方式。它采用模块化设计,能够方便地添加、管理和部署 PHP 扩展。相比 PECL,PIE 的安装和使用过程更加流畅,具有更好的用户体验。

使用 PIE 的优势

与传统的 PECL 相比,PIE 更注重简洁和现代化的设计。其轻量级架构不仅减少了开发者的维护成本,还使得扩展的安装速度和稳定性得到了提升。

扩展开发者只需要在项目中增加composer.json,声明一些安装选项等,并提交到 Packagist 即可。

下载安装 PIE

需要 PHP 8.1 或更新版本才能运行 PIE,但 PIE 可以为任何已安装的 PHP 版本安装扩展。

wget https://github.com/php/pie/releases/download/0.1.0/pie.phar

sudo chmod +x pie.phar
sudo mv pie.phar /usr/local/bin/pie

两种命令,二选一即可。

sudo curl -L --output /usr/local/bin/pie https://github.com/php/pie/releases/download/0.1.0/pie.phar && sudo chmod +x /usr/local/bin/pie

目前发布了 0.1.0 的预览版,所以本文使用 0.1.0 的下载地址,等正式版本发布后,可以使用https://github.com/php/pie/releases/latest/download/pie.phar此链接下载。

下载、构建或安装扩展

PIE 可以:

  • 只下载一个扩展,使用pie download
  • 下载并构建扩展,使用pie build
  • 最常见的是:下载、构建和安装扩展,使用pie install

使用 PIE 安装扩展时,必须使用其 Composer 软件包名称,可以在 https://packagist.org/extensions 上找到与 PIE 兼容的软件包列表。

packageist 扩展列表

知道扩展名称后,就可以使用下面的命令进行安装:

pie install <vendor>/<package>

# 举个例子
pie install apcu/apcu

在为不同的 PHP 版本安装扩展时,可以通过指定php-config来进行:

pie install --with-php-config=/usr/bin/php-config7.4 apcu/apcu

版本约束和 composer 是一样的,了解更多可以查看:Composer 进阶使用之版本约束表达式的使用

pie install <vendor>/<package>:<version-constraint>

编译扩展时,有些扩展需要向 ./configure 命令传递额外的参数。

这些参数通常用于启用或禁用某些功能,或提供未自动检测到的库的路径。

为了确定扩展可用的配置选项,可以使用pie info <vendor>/<package>将返回列表,例如:

$ pie info apcu/apcu
You are running PHP 8.2.10
Target PHP installation: 8.2.10 nts, on Linux/OSX/etc x86_64 (from /usr/local/Cellar/php/8.2.10/bin/php)
Found package: apcu/apcu:v5.1.24 which provides ext-apcu
Extension name: apcu
Extension type: php-ext (PhpModule)
Composer package name: apcu/apcu
Version: v5.1.24
Download URL: https://api.github.com/repos/krakjoe/apcu/zipball/62e67989a35247263c370b5ecebb4e69b73b0709
Configure options:
    --disable-apcu-mmap  (Disable mmap, falls back on shm)
    --disable-apcu-rwlocks  (Disable rwlocks in APCu)
    --disable-valgrind-checks  (Disable Valgrind-based memory checks)
    --enable-apcu  (Enable APCu support)
    --enable-apcu-clear-signal  (Enable SIGUSR1 clearing handler)
    --enable-apcu-debug  (Enable APCu debugging)
    --enable-apcu-spinlocks  (Use spinlocks before flocks)
    --enable-coverage  (Include code coverage symbols (DEVELOPERS ONLY!!))

需要注意的是,目前,PIE 不会配置 INI 文件,但很快会进行改进,需要手动给对应的php.ini中添加extension=

这些内容对于普通用户来说已经够用了,而对于扩展开发者来说,需要给项目中添加composer.json来让 PIE 能够索引和下载,具体可以查看面向扩展维护者的 PIE

并且我也给 Swoole 添加了 PIE 支持:composer.json,但对于像 Swow 这种已经自己实现了安装脚本,并且也是使用 composer 进行管理的,应该并不会使用 PIE,或者可能存在冲突,所以还是先观望吧

pie install swow/swow

composer require swow/swow
./vendor/bin/swow-builder --install

结语

PIE 0.1.0 的发布标志着 PHP 扩展管理进入了一个新阶段。它为开发者提供了更加轻松的工具集,让扩展的管理、安装和部署更加高效。PIE 将逐步替代 PECL,成为 PHP 社区中的主流工具。

通过 PIE,PHP 开发者能够更加专注于代码本身,而不再需要为复杂的扩展管理流程而烦恼。

解决GoLand会自动删除import包的问题

2024-09-10 11:16:05

最近在给 Apache Answer 处理安装时的多语言切换时,遇到了保存时 import 的声明会被自动删掉的问题。

拥有 @apache.org 邮箱以后会有 JetBrains 提供的 All Products Pack License,之前只用到了 PhpStorm,现在将 GoLand 也下载下来了。

在编码完成后需要进行构建,构建的时候提示:undefined: i18n,我还在纳闷我引入了呀,翻上去一看确实没有,被删掉了,撤回保存后还会被删除。

vim 编辑后可以正常启动服务,那就是这个 GoLand 编辑器的问题了。

打开Settings设置,输入optimize,将下面两个选项取消勾选:

  • Optimize imports on the fly

  • Optimize imports

这样恢复被删除的导入后,就不会再被自动删除了。