必须运行php -r "print_r(ini_get('disable_functions'));"确认被禁函数,cli与web环境配置文件不同,composer必需解禁putenv、proc_open、proc_get_status、pcntl_signal四函数,且需同步修改php-cli.ini并重载配置。

怎么确认是哪个函数被禁用了
别靠猜,直接运行命令查。在宝塔终端里执行:php -r "print_r(ini_get('disable_functions'));"。如果输出类似 "putenv,proc_open,exec,system",就坐实了问题根源。注意:CLI 和 Web 环境用的不是同一个配置文件,php --ini 查到的路径才是当前命令行真正读取的 php.ini(通常是 /www/server/php/xx/etc/php-cli.ini),和网站后台看到的 php.ini 不一样。
哪些函数必须解除禁用才能跑 Composer
Composer v2+ 启动和安装依赖时会调用一组底层函数,缺一不可。以下四个必须从 disable_functions 列表中完整删除:
-
putenv:用于设置临时环境变量(如 Xdebug、代理、PATH) -
proc_open:启动子进程,Git 克隆、脚本执行都依赖它 -
proc_get_status:检查子进程状态,缺失会导致Symfony\Component\Process\Process::close报TypeError -
pcntl_signal:处理信号中断,尤其在长时间操作中防止意外退出
删的时候要连同前后逗号一起去掉,比如把 putenv,proc_open,exec 改成 exec,而不是只删单词留空格或孤立逗号——否则 PHP 可能直接无法启动。
改完配置后为什么还是报错
常见原因有三个:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 只改了 Web 环境的
php.ini,忘了 CLI 环境的php-cli.ini;验证方式:/www/server/php/84/bin/php -r "var_dump(function_exists('proc_open'));"输出bool(true)才算生效 - 多个 PHP 版本共存,你在面板里改的是 PHP 80 的设置,但项目实际用的是 PHP 84,结果白改
- 改完没点「重载配置」或「重启 PHP」——宝塔里只保存不重启,配置根本不加载
另外,有些报错看似是函数问题,其实是连锁反应:比如 proc_open 被禁,导致 Git 克隆失败,再触发后续 file_get_contents 超时,误判为网络或证书问题。
不想全局放开,有没有更安全的做法
有,而且推荐这么做:
- 只在 CLI 环境解禁,Web 环境保持原样:编辑
/www/server/php/xx/etc/php-cli.ini,删掉那四个函数,Web 的php.ini一条不动 - 站点级解禁(适用于仅某个项目需调用 exec):宝塔 → 网站 → 设置 → PHP 配置文件 → 在底部加一行
disable_functions =(等号后留空),或精确写成disable_functions = pcntl_exec,pcntl_fork - 彻底绕过函数依赖:用
composer install --no-scripts --no-plugins --no-dev,手动补运行脚本和插件逻辑,适合生产环境最小权限部署
真正容易被忽略的是:即使函数全开了,open_basedir 过严、ulimit -u 进程数限制太低、或者 Suhosin 模块额外拦截,也会让 proc_open 失败——这些不会报“函数被禁”,但表现一模一样。










