Symfony 4在控制器操作中禁用探查器

时间:2018-08-25 18:52:48

标签: symfony profiler

我在控制器中有一个动作要对数据库进行大规模插入... 因此,这会占用大量资源,并且探查器会缓存所有内容,并且服务器会关闭。

如何在控制器上的一项操作中禁用分析器(以及所有调试服务)?

控制器看起来像:

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use App\Sync\Incomming\Syncronize;

/**
* @Route("/sync")
*/
class SyncController extends AbstractController
{
    private $syncronize;
    public function __construct(Syncronize $syncronize)
    {
        $this->syncronize = $syncronize;
    }
    /**
     * @Route("/",name="sync_index")
     */
    public function index(Request $request, Profiler $profiler)
    {  
        $message = "Hello";

        return $this->render( 'sync/output.html.twig', ['message' => $message ]); 

    }   
}

如果我尝试在构造函数方法中自动连接探查器,则会收到错误public function __construct(Syncronize $syncronize, Profiler $profiler)

  

无法自动装配服务“ App \ Controller \ SyncController”:参数   方法“ __construct()”的“ $ profiler”引用类   “ Symfony \ Component \ HttpKernel \ Profiler \ Profiler”,但没有此类服务   存在。您可能应该将此类别名为现有的“探查器”   服务。

如果我尝试使用index方法自动连接探查器,则会收到错误public function index(Request $request, Profiler $profiler)

  

控制器“ App \ Controller \ SyncController :: index()”要求您   为“ $ profiler”参数提供一个值。要么是   可为空,没有提供空值,没有默认值   被提供或因为此之后有非可选参数   一个。

编辑 对于大查询,禁用分析器不是解决方案……实际上,您需要禁用setSQLLogger:

$em->getConnection()->getConfiguration()->setSQLLogger(null);

1 个答案:

答案 0 :(得分:1)

修改:
如果要从控制器禁用分析器,可以这样:

use Symfony\Component\HttpKernel\Profiler\Profiler;
// ...

class DefaultController
{
    // ...

    public function someMethod(Profiler $profiler)
    {
        // for this particular controller action, the profiler is disabled
        $profiler->disable();

        // ...
    }
}

来源:https://symfony.com/doc/current/profiler/matchers.html

另一种方法是使用:$this->get('profiler')->disable();



只需将应用切换到prod模式并禁用调试模式。

要执行此操作,请在您喜欢的编辑器中打开服务器上的.env文件(注意:在其中存储机密时,切勿将此文件提交给Git!)。

在该文件中,您应该看到以下部分开头:###> symfony/framework-bundle ### 在它的下面是APP_ENV=devAPP_DEBUG=1,将这两行更改为APP_ENV=prodAPP_DEBUG=0。然后保存文件。

接下来,您应该清除缓存,以生产方式运行并安装资产。为此,请运行以下命令:

php bin/console cache:clear --env=prod --no-debug
php bin/console cache:warmup --env=prod --no-debug
php bin/console assets:install --env=prod --no-debug --symlink

如果您现在加载应用程序,它将处于生产模式,其中包括更多的缓存,并且由于禁用了调试而速度更快。


注意:
PHP仍然有时间限制。如果仍然达到该限制,则可以更改PHP设置,也可以从CLI运行导入,因为CLI通常没有时间限制。如果用户需要能够自己上传,我建议让他们上传文件,在文件中输入有关该文件的“注释”,然后让cronjob读取该数据库中未导入的文件并将其导入。