You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Laravel中运行node脚本提示shell_exec未定义如何解决

问题原因定位
  • 你遇到的Call to undefined function shell_exec()错误本质是PHP运行时当前环境的函数被禁用。你提到已经修改php.ini将disable_functions设为空,但PHP不同运行模式(CLI命令行、FPM Web请求)使用的是独立的配置文件:tinker、Tinkerwell走的是PHP CLI的配置,而Laravel处理Web请求时走的是PHP-FPM配置,你修改的大概率是CLI模式的配置文件,没有生效到Web请求场景。
  • 部分Laravel第三方安全扩展、项目自定义的服务提供者/中间件,会在运行时动态禁用shell类执行函数,也会导致该报错。
解决步骤

1. 校准PHP-FPM配置

首先在Laravel项目的public目录下临时新建info.php文件,写入以下内容:

<?php phpinfo();

通过浏览器访问该文件,搜索disable_functions配置项,确认shell_exec、exec是否仍在禁用列表中,同时记录当前配置对应的php.ini文件路径。修改该文件的disable_functions配置,移除shell_exec、exec的禁用规则后,重启PHP-FPM服务:
systemctl restart php<你的PHP版本号>-fpm
修改完成后务必删除info.php文件,避免泄露服务器配置信息

2. 排查Laravel运行时代码

如果确认FPM配置已经放开函数限制,排查项目内动态禁用函数的逻辑:

  • 全局搜索项目中ini_set('disable_functions'、runkit_function_remove相关代码,确认是否有服务提供者、中间件在请求初始化阶段禁用了shell执行类函数
  • 检查已安装的安全类扩展包配置,比如安全防护、防火墙类的第三方Laravel包,是否默认开启了shell函数禁用规则

3. 优化常驻进程启动逻辑

解决函数调用问题后,要实现node进程不随PHP请求结束终止,调用shell_exec时需要添加后台运行和输出重定向参数,示例代码如下:

shell_exec('node /你的node脚本绝对路径.js > /dev/null 2>&1 &');

其中> /dev/null 2>&1 &的作用是将进程输出重定向到空设备,同时把进程放到后台运行,不会被PHP请求结束时的进程回收信号杀死。如果需要更稳定的常驻进程管理,建议直接将node脚本配置为systemd系统服务,无需通过PHP触发启动,避免进程异常退出。

内容的提问来源于stack exchange,提问作者Rico Crivelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 21:36:00