报错说明pcntl_fork()被disable_functions明确禁用,php启动时直接拒绝执行。需通过php --ini和ini_get('disable_functions')定位配置,删除php.ini中disable_functions里的pcntl_fork及相关函数,重启php服务,并确认pcntl扩展已启用且子进程实际生成。

pcntl_fork() is disabled 报错说明什么
这个报错不是代码写错了,而是 PHP 主动拒绝执行——pcntl_fork() 被明确禁用。PHP 启动时读取 disable_functions 配置项,只要里面列了 pcntl_fork(或整个 pcntl_* 系列),调用就会直接失败,连参数校验都不会走。
怎么定位并修改 disable_functions 配置
不能凭感觉改,得先确认当前生效的 php.ini 路径和实际值:
- 运行
php --ini查看 Loaded Configuration File 路径 - 用
php -r "echo ini_get('disable_functions');"直接输出当前禁用函数列表 - 打开对应
php.ini,搜索disable_functions =这一行 - 删掉其中的
pcntl_fork,如果还报pcntl_wait、pcntl_signal等,一并删掉(常见于宝塔面板默认禁用整个pcntl_*前缀) - 保存后必须重启 PHP 进程:如果是 PHP-FPM,执行
sudo systemctl restart php-fpm;如果是 Apache 模块,重启apache2或httpd
宝塔面板用户特别注意
宝塔不让你直接改 php.ini 文件,得走它的 Web 界面:
- 进入「软件商店」→ 找到你正在用的 PHP 版本 → 点「设置」
- 切换到「配置修改」标签页 → 找到「禁用函数」输入框
- 删除里面的
pcntl_fork,如果存在pcntl_wait、pcntl_signal、pcntl_exec等,全部删掉 - 点「保存」,然后在「服务」里重启对应 PHP 版本(不是重启网站,是重启 PHP 服务本身)
- 别忘了顺手检查「PHP 扩展」页是否启用了
pcntl扩展(多数版本默认开启,但有些精简版会关)
改完还是报错?检查这几个地方
常见漏点比想象中多:
- CLI 和 Web SAPI 的 php.ini 可能不同:用
php --ini看 CLI 路径,用phpinfo()页面看 Web 路径,两边都要改 - 某些 Docker 镜像或云平台(如腾讯云轻量应用服务器)会在启动脚本里硬编码
disable_functions,覆盖 php.ini —— 检查容器 entrypoint 或 init.d 脚本 -
pcntl扩展没加载:运行php -m | grep pcntl,无输出说明扩展未启用,需在 php.ini 加extension=pcntl(Linux)或extension=php_pcntl.dll(Windows,极少用) - Workerman 等框架会检测
pcntl_fork是否可用再决定是否 fork,改完配置后务必用php start.php status或php start.php start -d调试模式启动,别直接restart
ps aux | grep your_worker_name 看有没有多个 PHP 进程,这才是 pcntl_fork() 生效的唯一证据。










