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

Symfony 6.2应用定义Command名称后无法正常响应请求

解决Symfony 6.2添加命令注解后Web请求返回空响应的问题

问题根源

添加#[AsCommand]注解后Web请求返回空、日志出现Console Tool内容,本质是Web请求意外触发了CLI入口的执行,或者Web内核错误加载了Console组件的初始化逻辑,导致CLI的输出覆盖了正常的Web响应。

具体解决步骤

1. 隔离Web与CLI入口文件

检查Web入口(public/index.php)

确保Web入口只初始化Web内核,不要包含任何CLI相关代码:

<?php

use App\Kernel;

require dirname(__DIR__).'/vendor/autoload.php';

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$kernel->boot();

$request = Symfony\Component\HttpFoundation\Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);

检查CLI入口(src/cli.php)

确保CLI入口仅用于命令行执行,开头添加shebang,且不要被Web请求访问:

#!/usr/bin/env php
<?php

use App\Kernel;
use Symfony\Bundle\FrameworkBundle\Console\Application;

require dirname(__DIR__).'/vendor/autoload.php';

$kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']);
$application = new Application($kernel);
$application->run();

执行chmod +x src/cli.php赋予可执行权限,但禁止Web请求访问这个文件。

2. 修正Nginx配置,屏蔽非公开目录

确保Nginx根目录指向public/,并禁止访问src/等内部目录:

server {
    listen 80;
    root /var/www/html/public;
    index index.php;

    # 处理静态资源和路由转发
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # 禁止访问src目录,防止CLI入口被Web请求触发
    location ~ ^/src/ {
        deny all;
        return 404;
    }

    # PHP-FPM处理配置
    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        # 防止脚本路径遍历
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

重启Nginx容器生效:docker-compose restart nginx

3. 确保命令类的正确位置与注解

把ExtractAuthorPortraitsCommand放在src/Command/目录下(Symfony默认自动扫描该目录的命令),注解格式正确:

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

#[AsCommand(
    name: 'app:extract-author-portraits',
    description: '提取作者头像的命令',
)]
class ExtractAuthorPortraitsCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        // 命令逻辑
        $output->writeln('执行头像提取');
        return Command::SUCCESS;
    }
}

4. 清除Symfony缓存

在PHP容器内执行缓存清除命令,让Symfony识别新添加的命令:

docker-compose exec php php bin/console cache:clear --env=dev
# 生产环境用:
# docker-compose exec php php bin/console cache:clear --env=prod --no-debug

5. 排查请求来源

查看Nginx访问日志,确认是否有请求直接访问/src/cli.php:

docker-compose exec nginx tail -f /var/log/nginx/access.log

如果存在这类请求,说明Nginx配置未生效,重新检查配置并重启容器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:00:59