Composer脚本中需通过PHP函数或系统命令检查磁盘空间:优先用disk_free_space()校验稳定路径(如sys_get_temp_dir()或$HOME/.composer/cache),避免依赖getcwd();若需详细信息,则用shell_exec()调用df(Linux/macOS)或wmic(Windows),并严格解析输出,注意CI环境多挂载点和exec禁用情况。

Composer脚本里怎么调用磁盘空间检查?
Composer 本身不提供内置的磁盘空间检测能力,必须通过 exec() 或 shell_exec() 调用系统命令。PHP 的 disk_free_space() 函数虽可用,但只支持路径级查询,而 Composer 脚本运行时工作目录不稳定(可能是项目根、vendor 目录甚至临时路径),直接传 getcwd() 容易误判。
推荐统一检查 Composer 缓存目录所在磁盘(通常是用户主目录下的 ~/.composer/cache)或项目根目录所在磁盘——后者更贴近实际安装目标位置。
- Linux/macOS 下用
df -B1 /path获取字节数,再用 PHP 解析;Windows 下用dir C: /-C或wmic logicaldisk get size,freespace,caption - 避免用
system(),它会直接输出到终端,干扰 Composer 输出流;优先用shell_exec()并静默处理 - 记得用
trim()和intval()清洗命令结果,防止空格或换行导致解析失败
在 composer.json 的 scripts 里怎么写?
不能直接写 shell 命令(Composer 不执行 shell 解析),必须封装成 PHP callable。常见错误是把 df 命令直接塞进 "scripts" 字段,结果报错 Script df -B1 . handling the pre-install-cmd event returned with error code 127。
正确做法:定义一个自定义函数(如 checkDiskSpace),在 autoload-dev 中加载,然后在 scripts 中引用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
{
"scripts": {
"pre-install-cmd": [
"My\Installer::checkDiskSpace"
]
},
"autoload-dev": {
"psr-4": {
"My\": "scripts/"
}
}
}对应 scripts/Installer.php 内容示例:
<?php
namespace My;
class Installer
{
public static function checkDiskSpace($event)
{
$path = getcwd(); // 或硬编码为 sys_get_temp_dir()、$_SERVER['HOME'] . '/.composer/cache'
$free = disk_free_space($path);
if ($free < 500 * 1024 * 1024) { // 少于 500MB
throw new Exception("Insufficient disk space: " . round($free / 1024 / 1024, 1) . " MB free");
}
}
}为什么 disk_free_space() 有时返回 false?
不是权限问题就是路径不存在。Composer 脚本可能在 vendor 安装中途触发(比如 post-autoload-dump),此时 getcwd() 可能指向 vendor/composer/... 这类临时路径,而该路径在某些 CI 环境下尚未创建或不可读。
- 始终 fallback 到已知稳定路径:如
$_SERVER['HOME'](Linux/macOS)、$_SERVER['USERPROFILE'](Windows)、或sys_get_temp_dir() - 加一层存在性判断:
is_dir($path) && is_readable($path),否则跳过检查或报明确错误 - 注意 Windows 下盘符大小写无关,但
disk_free_space("c:\")和disk_free_space("C:\")在某些 PHP 版本中行为不一致,建议统一转小写
CI 环境下磁盘检查特别容易失效
GitHub Actions、GitLab CI 默认分配的磁盘极小(常仅 14GB),且缓存目录和工作目录可能跨不同挂载点。单纯查 getcwd() 所在分区,可能漏掉 Composer 实际写入的 ~/.composer/cache 所在分区。
- CI 中应显式检查两个位置:
disk_free_space(sys_get_temp_dir())和disk_free_space(getenv('HOME') . '/.composer/cache') - 某些 CI 镜像禁用
exec()(如部分 Alpine 容器),此时disk_free_space()是唯一可靠方式,但需确保路径存在 - 别依赖
df输出格式——不同 Linux 发行版的列顺序可能不同(如 Ubuntu 的df -B1第二列是 total,CentOS 可能是 used),解析时务必按 header 行匹配,而非固定索引
真正麻烦的是多挂载点场景:项目在 /mnt/ssd,但 Composer 缓存却配置在 /home(NFS 挂载),两者剩余空间差异极大。这种情况下,只检查一处等于没检查。

















