理解 Composer 的环境变量 COMPOSER_IGNORE_PLATFORM_REQ 和 COMPOSER_IGNORE_PLATFORM_REQS 作者: Shine 时间: 2025-05-15 分类: PHP 评论 在 PHP 项目开发中,[Composer](https://getcomposer.org/) 是管理依赖的核心工具。它通过检查 PHP 环境(如版本和扩展)确保依赖兼容性。但有时我们需要在不符合平台要求的条件下安装依赖,这时环境变量 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS` 提供了解决方案。 ## 什么是 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS`? 这两个环境变量用于绕过 Composor 的平台要求检查,平台要求包括: - PHP 版本(如 `php: ^7.4`) - PHP 扩展(如 `ext-curl`、`ext-json`) - 其他系统级依赖 当环境不满足依赖要求时,Composer 会报错并阻止安装。两者的区别在于: - **`COMPOSER_IGNORE_PLATFORM_REQ`**:允许指定忽略特定的平台要求(如 `ext-curl` 或 `php`)。 - **`COMPOSER_IGNORE_PLATFORM_REQS`**:忽略所有平台要求,等效于命令行选项 `--ignore-platform-reqs`。 ## 为什么需要忽略平台要求? 常见场景包括: 1. **开发或测试**:本地或 CI/CD 环境的 PHP 版本或扩展与生产环境不同,但需安装依赖进行测试。 2. **临时绕过**:某些依赖在未满足官方要求的环境中仍可运行。 3. **遗留项目**:老项目依赖的包可能与新环境不完全兼容,但需继续维护。 ## 如何使用? ### 使用 `COMPOSER_IGNORE_PLATFORM_REQ` 通过环境变量指定要忽略的特定平台要求: ```bash COMPOSER_IGNORE_PLATFORM_REQ=ext-curl composer install ``` 忽略多个要求时,用逗号分隔: ```bash COMPOSER_IGNORE_PLATFORM_REQ=ext-curl,ext-json composer update ``` ### 使用 `COMPOSER_IGNORE_PLATFORM_REQS` 若需忽略所有平台要求,设置此变量(无需指定具体要求): ```bash COMPOSER_IGNORE_PLATFORM_REQS=1 composer install ``` 或者直接使用命令行选项: ```bash composer install --ignore-platform-reqs ``` ### 在类 Unix 平台持久化配置 在类 Unix 系统(如 Linux 或 macOS)中,可以将环境变量添加到 shell 配置文件(如 `.bashrc` 或 `.zshrc`)以持久化设置。步骤如下: 1. 打开终端,编辑配置文件(以 Zsh 为例): ```bash nano ~/.zshrc ``` 对于 Bash,编辑 `.bashrc`: ```bash nano ~/.bashrc ``` 2. 在文件末尾添加以下行,例如忽略 `ext-curl`: ```bash export COMPOSER_IGNORE_PLATFORM_REQ=ext-curl ``` 或忽略所有要求: ```bash export COMPOSER_IGNORE_PLATFORM_REQS=1 ``` 多个特定要求: ```bash export COMPOSER_IGNORE_PLATFORM_REQ=ext-curl,ext-json ``` 3. 保存并刷新 shell 配置: ```bash source ~/.zshrc ``` 或: ```bash source ~/.bashrc ``` 4. 验证设置: ```bash echo $COMPOSER_IGNORE_PLATFORM_REQ echo $COMPOSER_IGNORE_PLATFORM_REQS ``` 此后,Composer 命令将自动应用这些设置。 ### Windows 用户 在 Windows 命令行中,临时设置语法为: ```cmd set COMPOSER_IGNORE_PLATFORM_REQ=ext-curl && composer install set COMPOSER_IGNORE_PLATFORM_REQS=1 && composer install ``` ## 潜在风险 使用这两个变量需注意: 1. **运行时错误**:忽略要求可能导致依赖在运行时因缺少扩展或版本不兼容而失败。 2. **生产环境谨慎**:建议仅在开发或测试中使用,生产环境应满足依赖要求。 3. **调试复杂**:绕过检查可能增加问题排查难度。 ## 最佳实践 - **选择合适的变量**:若只需忽略特定要求,使用 `COMPOSER_IGNORE_PLATFORM_REQ`;若需忽略全部,使用 `COMPOSER_IGNORE_PLATFORM_REQS`。 - **记录原因**:在项目文档中说明忽略平台要求的理由,便于团队理解。 - **充分测试**:忽略要求后,彻底测试应用以确保依赖正常运行。 ## 总结 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS` 是 Composer 的强大工具,分别用于忽略特定或全部平台要求检查。在类 Unix 系统中,通过配置 `.bashrc` 或 `.zshrc`,可以持久化这些设置,提升开发效率。但需谨慎使用,确保测试充分并避免在生产环境中引入风险。合理运用这些变量,能让 PHP 依赖管理更加灵活。
Chrome 强制启用深色模式 作者: Shine 时间: 2024-12-11 分类: PHP技巧 评论 ## 操作步骤 1. 打开网址 `chrome://flags/#enable-force-dark` 2. 改为 Enabled 3. 最后重启浏览器即可
PHP 字符串处理:去除 JSON 中多余的逗号 作者: Shine 时间: 2024-10-11 分类: PHP 评论 在处理 JSON 数据时,有时可能会遇到一些格式问题,比如在对象或数组的最后一个元素后意外多出一个逗号。这类格式错误会导致 `json_decode()` 函数解析失败。因此,我们可以在解析之前,预先清理这些多余的逗号。 ## 1. 使用正则表达式处理多余逗号 在处理 JSON 数据时,可以使用正则表达式来匹配并移除对象或数组最后一个元素后面的逗号。以下是一个示例代码,展示如何通过 `preg_replace` 来解决这个问题: ```php
composer 永久忽略安装包时提示依赖 xx 扩展 作者: Shine 时间: 2024-07-02 分类: PHP 评论 ## 问题 在本地开发时,如果使用 composer 安装 composer 包经常会遇到这种提示: ``` Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires php ^8.3 but your php version (8.2.9) does not satisfy that requirement. Problem 2 - Root composer.json requires PHP extension ext-posix * but it is missing from your system. Install or enable PHP's posix extension. Problem 3 - Root composer.json requires PHP extension ext-rdkafka * but it is missing from your system. Install or enable PHP's rdkafka extension. Problem 4 - hhxsv5/laravel-s is locked to version v3.8.0 and an update of this package was not requested. - hhxsv5/laravel-s v3.8.0 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. Problem 5 - laravel/horizon is locked to version v5.24.4 and an update of this package was not requested. - laravel/horizon v5.24.4 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. Problem 6 - laravel/pail is locked to version v1.1.3 and an update of this package was not requested. - laravel/pail v1.1.3 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. To enable extensions, verify that they are enabled in your .ini files: - C:\Users\Shine\.pvm\versions\php-8.2\php.ini You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. Alternatively, you can run Composer with `--ignore-platform-req=ext-posix --ignore-platform-req=ext-rdkafka --ignore-platform-req=ext-pcntl` to temporarily ignore these required extensions. You can also try re-running composer require with an explicit version constraint, e.g. "composer require dcat/laravel-admin:*" to figure out if any version is installable, or "composer require dcat/laravel-admin:^2.1" if you know which you need. Installation failed, reverting ./composer.json and ./composer.lock to their original content. ```  实际上在本机开发过程中通常不需要用到这些依赖扩展,或者你是 Windows 作为开发环境,那么像 `posix`, `pcntl` 扩展在 Windows 上是安装不上的,所以我都会加上 `--ignore-platform-reqs` 选项,来跳过对这些扩展的检查,但是每次装 composer 包都要手打这个选项实在是太过繁琐,有没有直接替我加上这个选项的方法? ## 过程 通过查阅[Composer 官方文档](https://getcomposer.org/doc/03-cli.md#composer-ignore-platform-req-or-composer-ignore-platform-reqs "Composer 官方文档"),确实有这么一个方法,设置一个环境变量 `COMPOSER_IGNORE_PLATFORM_REQS=1` 即可解决 ## 结果 Windows 添加环境变量 1. 按下 `Win` + `R` 输入 `sysdm.cpl` 然后按 `Enter` 2. 选择“环境变量” 3. 新建环境变量 4. 输入变量名 `COMPOSER_IGNORE_PLATFORM_REQS` 5. 输入变量值 `1` 6. 确定 -> 确定 -> 确定 7. 完成 
记一次使用 Laravel Http Client 使用不当导致内存泄漏的问题 作者: Shine 时间: 2023-12-06 分类: PHP 评论 ## 背景 Laravel 的[ HTTP Client](https://laravel.com/docs/10.x/http-client " HTTP Client") 基于 Guzzle 二次封装,操作很方便,所以在业务代码上我就这么写了类似的代码 ```php $url = 'https://xxxx/xxx.json'; $json = Illuminate\Support\Facades\Http::get($url)->json(); // TODO 业务逻辑处理 ``` 项目使用了 [laravels](https://github.com/hhxsv5/laravel-s "laravels"),所以项目是常驻内存的,但是经过观察发 worker 内存会随着请求数量慢慢增加,并且不会自动回收内存,导致最终内存不足程序异常终止: ``` PHP Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 360448 bytes) in /Users/shine/work/xxxxxx-project/vendor/guzzlehttp/psr7/src/Utils.php on line 414 Symfony\Component\ErrorHandler\Error\FatalError Allowed memory size of 67108864 bytes exhausted (tried to allocate 360448 bytes) at vendor/guzzlehttp/psr7/src/Utils.php:414 410▕ }); 411▕ 412▕ try { 413▕ /** @var string|false $contents */ ➜ 414▕ $contents = stream_get_contents($stream); 415▕ 416▕ if ($contents === false) { 417▕ $ex = new \RuntimeException('Unable to read stream contents'); 418▕ } Whoops\Exception\ErrorException Allowed memory size of 67108864 bytes exhausted (tried to allocate 360448 bytes) at vendor/guzzlehttp/psr7/src/Utils.php:414 410▕ }); 411▕ 412▕ try { 413▕ /** @var string|false $contents */ ➜ 414▕ $contents = stream_get_contents($stream); 415▕ 416▕ if ($contents === false) { 417▕ $ex = new \RuntimeException('Unable to read stream contents'); 418▕ } +1 vendor frames 2 [internal]:0 Whoops\Run::handleShutdown() ``` ## 解决方案 通过研究框架代码,发现是没有正常关闭 Guzzle stream,导致内存一直累积无法回收 然后又在在 [vendor/laravel/framework/src/Illuminate/Http/Client/Response.php:247](https://github.com/laravel/framework/blob/10.x/src/Illuminate/Http/Client/Response.php#L247 "vendor/laravel/framework/src/Illuminate/Http/Client/Response.php:247") 位置发现有一个 `close()` 方法,但这个方法没有在任何地方使用,应该是想让你手动调用进行关闭 stream 所以将代码改成如下就可以了 ```php $url = 'https://xxxx/xxx.json'; $response = Illuminate\Support\Facades\Http::get($url); $json = $response->json(); // 关闭 stream $response->close(); // TODO 业务逻辑处理 ``` ## 附测试内存泄漏代码 ```php json(); printf("Count: %d\tPHP Memory: %.1fMB\n", $i++, memory_get_usage(true) / 1024.00 / 1024.00); } ```  ## 附测试修复内存泄漏后的代码 ```php body()) / 1024); $response->close(); } ``` 