Symfony在cPanel终端执行bin/console出现UndefinedFunctionError报错
Symfony 6.1/6.2 在cPanel终端执行console命令报shell_exec相关错误
问题现象
本地运行正常的Symfony 6.1/6.2项目(PHP 8.1环境),在cPanel终端执行php bin/console list等命令时,触发以下错误:
Symfony\Component\ErrorHandler\Error\UndefinedFunctionError^ {#158 #message: "Attempted to call function \"shell_exec\" from namespace \"Symfony\Component\Console\"." #code: 0 #file: "./vendor/symfony/console/Application.php" #line: 981 trace: { ./vendor/symfony/console/Application.php:981 { …} ./vendor/symfony/framework-bundle/Console/Application.php:97 { …} ./vendor/symfony/console/Application.php:301 { …} ./vendor/symfony/framework-bundle/Console/Application.php:80 { …} ./vendor/symfony/console/Application.php:171 { …} ./vendor/symfony/runtime/Runner/Symfony/ConsoleApplicationRunner.php:54 { …} ./vendor/autoload_runtime.php:29 { …} ./bin/console:11 { › › require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; › arguments: { "/home/***/****/vendor/autoload_runtime.php" } } } }
相关版本:symfony/console: "6.1.",symfony/framework-bundle: "6.1."。临时将shell_exec替换为exec后,命令可正常执行。
问题原因
cPanel环境的PHP配置中,shell_exec函数被加入disable_functions列表禁用,而Symfony 6.1/6.2版本的Console组件在检测终端尺寸时,默认调用了shell_exec,导致函数未找到报错。
解决办法
临时应急方案(不推荐长期使用)
直接修改vendor/symfony/console/Application.php第981行,把shell_exec替换成exec,替换后即可正常执行命令,但注意后续执行composer update或install时,修改会被覆盖。长期修复方案
- 解禁shell_exec:联系主机服务商修改PHP配置,将
shell_exec从disable_functions中移除;如果自己有权限,可通过cPanel的PHP管理界面编辑php.ini或.user.ini文件,删除禁用列表里的shell_exec。 - 升级Symfony版本:把项目升级到Symfony 6.3及以上,该版本的Console组件已修复此问题,改用更兼容的方式获取终端信息,不再依赖
shell_exec。 - 自定义Console Application:创建自定义的Application类,继承框架的Console Application,重写
getTerminalDimensions方法,比如硬编码终端宽高,示例代码如下:
// src/Console/Application.php namespace App\Console; use Symfony\Bundle\FrameworkBundle\Console\Application as BaseApplication; use Symfony\Component\HttpKernel\KernelInterface; class Application extends BaseApplication { public function __construct(KernelInterface $kernel) { parent::__construct($kernel); } protected function getTerminalDimensions(): array { // 硬编码终端尺寸,适配大多数场景 return [80, 24]; } }
然后修改bin/console文件,实例化自定义的Application:
// bin/console use App\Console\Application; use Symfony\Component\Runtime\RunnerInterface; require_once dirname(__DIR__).'/vendor/autoload_runtime.php'; return function (array $context): RunnerInterface { return new \Symfony\Component\Runtime\Runner\Symfony\ConsoleApplicationRunner( fn () => new Application(require $context['kernel']), $context['runtime'] ); };
内容的提问来源于stack exchange,提问作者amine
相关产品推荐
相关产品推荐

