草庐IT

redis - Symfony3 分析器存储

coder 2023-07-18 原文

在文档中

http://symfony.com/doc/master/cookbook/profiler/storage.html

您仍然可以找到有关 Profiler 存储的信息。 我刚刚检查了代码,找不到任何关于如何设置自定义存储的线索。 除了 2.8 的原始来源中的一些@legacy 注释外,我也没有找到说明这一点的文档。

是否有删除此内容的原因? 我使用 redis 来存储此数据,其生命周期为 eta 1 小时。 现在我需要运行手动清理来清除该目录中的所有文件。 如果有人有一些线索或提示可以帮助我解决这个问题,我们将不胜感激 ^^

克里斯

最佳答案

感谢 Matteo 的提示,我能够非常灵活地解决这个问题。 Symfony 团队删除了它,因为它被硬编码到 Profiler 子系统中。 我没有通过添加类参数来解决这个问题,而是不得不解决它。 :)

好的,这是代码,如果有人需要的话。

首先我们需要 Symfony 2.7 的原始类(至少我重用了它们,因为我只需要 Redis 选项(我使用它,因为我可以使用 igbinary 压缩数据)

接下来您需要实现 Compiler Pass。

        namespace AcmeBunlde\DependencyInjection\CompilerPass;

        use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
        use Symfony\Component\DependencyInjection\ContainerBuilder;

        class ProfilerCompilerPass implements CompilerPassInterface
        {

            /**
             * You can modify the container here before it is dumped to PHP code.
             *
             * @param ContainerBuilder $container
             */
            public function process(ContainerBuilder $container)
            {
                $definition = $container->getDefinition('profiler');
                $definition->addArgument('%acmebundle.profiler.defaultEnabled%');
                $definition->addArgument('%acmebundle.profiler.class%');
                $definition->addArgument('%acmebundle.profiler.dsn%');
                $definition->addArgument('%acmebundle.profiler.username%');
                $definition->addArgument('%acmebundle.profiler.password%');
                $definition->addArgument('%acmebundle.profiler.ttl%');
                $definition->setClass('acmebundle\Profiler\Profiler');
            }
        }

这需要在 Bundle Loader 中加载:

    public function build(ContainerBuilder $container)
    {
        ...
        $container->addCompilerPass(new ProfilerCompilerPass());
    }

在此之后,我们需要在 DependencyInjection 文件夹中添加新 Profiler 存储的配置。

    namespace AcmeBundle\DependencyInjection;

    use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition;
    use Symfony\Component\Config\Definition\Builder\TreeBuilder;
    use Symfony\Component\Config\Definition\ConfigurationInterface;

    /**
     * This is the class that validates and merges configuration from your app/config files
     *
     * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
     * @author Chris
     */
    class Configuration implements ConfigurationInterface
        /**
         * {@inheritdoc}
         */
        public function getConfigTreeBuilder()
        {
            $treeBuilder = new TreeBuilder();
            $rootNode = $treeBuilder->root('library');

            $rootNode
                ->children()
                    ->arrayNode('profiler')
                        ->addDefaultsIfNotSet()
                        ->children()
                            ->booleanNode('defaultStorage')
                                ->defaultTrue()
                            ->end()
                            ->scalarNode('class')
                                ->defaultValue('')
                            ->end()
                            ->scalarNode('dsn')
                                ->defaultValue('')
                            ->end()
                            ->scalarNode('username')
                                ->defaultValue('')
                            ->end()
                            ->scalarNode('password')
                                ->defaultValue('')
                            ->end()
                            ->scalarNode('ttl')
                                ->defaultValue('3600')
                            ->end()
                        ->end()
                    ->end();
            return $treeBuilder();
        }
    }

现在在依赖注入(inject)捆绑加载器中设置默认值

    <?php

    namespace AcmeBundle\DependencyInjection;

    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\DependencyInjection\Loader;
    use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;

    /**
     * This is the class that loads and manages your bundle configuration
     *
     * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
     * @author Chris 
     */
    class AcmeExtension extends Extension
    {
        /**
         * {@inheritdoc}
         */
        public function load(array $configs, ContainerBuilder $container)
        {

            $configuration = new Configuration();
            $config = $this->processConfiguration($configuration, $configs);
            ...
            $container->setParameter('acmebundle.profiler.defaultEnabled',$config['profiler']['defaultStorage']);
            $container->setParameter('acmebundle.profiler.class',$config['profiler']['class']);
            $container->setParameter('acmebundle.profiler.dsn',$config['profiler']['dsn']);
            $container->setParameter('acmebundle.profiler.username',$config['profiler']['username']);
            $container->setParameter('acmebundle.profiler.password',$config['profiler']['password']);
            $container->setParameter('acmebundle.profiler.ttl',$config['profiler']['ttl']);
            ...
        }
        ...
    }

作为最后一步,您需要构建一个基本容器以添加新的 Profiler 处理程序。 我选择实现它并不复杂:

    <?php

        namespace AcmeBundle\Profiler;
        use Psr\Log\LoggerInterface;
        use \Symfony\Component\HttpKernel\Profiler\Profiler as ProfilerSrc;
        use Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface;

        /**
         * Profiler.
         */
        class Profiler extends ProfilerSrc
        {
            public function __construct(ProfilerStorageInterface $storage, LoggerInterface $logger, $defaultEnabled=true,$class=null,$dsn=null,$username=null,$password=null,$ttl=3600)
            {
                if($defaultEnabled!==true)
                {
                    $storage = new $class($dsn,$username,$password,$ttl);
                }
                parent::__construct($storage , $logger);
            }
        }

我还添加了一个库来定义存储接口(interface)的构造函数。

    <?php

        namespace AcmeBundle\Profiler;

        use Symfony\Component\HttpKernel\Profiler\ProfilerStorageInterface as ProfilerStorageSource;

        interface ProfilerStorageInterface extends ProfilerStorageSource
        {
            /**
             * ProfilerStorageInterface constructor.
             *
             * @param $dsn
             * @param $username
             * @param $password
             * @param $ttl
             */
            public function __construct($dsn,$username,$password,$ttl);
        }

您现在需要做的就是在 config_dev.yml 文件中定义一些选项。

acmebundle:
    profiler:
        defaultEnabled: false
        class:CLASSNAME INCLUDING NAMESPACE
        dsn: redis://localhost/1
        username: 
        password
        ttl: 3600

使用 defaultEnabled = true,您可以重新启用原始处理程序。 剩下的就是,我相信 self 解释。 用户名+密码来自原始功能集。 (ttl == 生命周期)

我希望这对其他人也有帮助:)

关于redis - Symfony3 分析器存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34109297/

有关redis - Symfony3 分析器存储的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  3. ruby-on-rails - 为什么在 Rails 5.1.1 中删除了 session 存储初始化程序 - 2

    我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于

  4. ruby-on-rails - 尝试设置 Amazon 的 S3 存储桶 : 403 Forbidden error & setting permissions - 2

    我正在关注Hartl的railstutorial.org并已到达11.4.4:Imageuploadinproduction.我做了什么:注册亚马逊网络服务在AmazonIdentityandAccessManagement中,我创建了一个用户。用户创建成功。在AmazonS3中,我创建了一个新存储桶。设置新存储桶的权限:权限:本教程指示“授予上一步创建的用户读写权限”。但是,在存储桶的“权限”下,未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字+数字创建的用户名之间进行选择。我已经通过选择经过身份验证的用户并选中了上传/删除和查看权限的框(而不

  5. ruby - 如何打印出 Mechanized 存储的 cookie? - 2

    我正在使用mechanize登录网站,然后检索页面。我遇到了一些问题,我怀疑这是由于cookie中的某些值造成的。当Mechanize登录网站时,我假设它存储了cookie。如何通过Mechanize打印出存储在cookie中的所有数据? 最佳答案 代理有一个cookie方法。agent=Mechanize.newpage=agent.get("http://www.google.com/")agent.cookiesagent.cookies.to_scookie返回一个Mechanize::Cookiesobject

  6. ruby-on-rails - 闪存消息存储在哪里? - 2

    我以为它们存储在cookie中-但不,检查cookie没有任何结果。session也不存储它们。那么,我在哪里可以找到它们?我需要这个来直接设置它们(而不是通过flashhash)。 最佳答案 它们存储在inyoursessionstore.自rails2.0以来的默认设置是cookie存储,但请检查config/initializers/session_store.rb以检查您是否使用默认设置以外的东西。 关于ruby-on-rails-闪存消息存储在哪里?,我们在StackOverf

  7. ruby-on-rails - 在 Rails 中存储(结构化)配置数据的位置 - 2

    对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化

  8. ruby - 如何存储和读取 RubyVM::InstructionSequence? - 2

    有没有办法将RubyVM::InstructionSequence存储到文件中并稍后读取?我尝试了Marshal.dump但没有成功。我收到以下错误:`dump':no_dump_dataisdefinedforclassRubyVM::InstructionSequence(TypeError) 最佳答案 是的,有办法。首先,您需要使InstructionSequence的load方法可访问,默认情况下该方法是禁用的:require'fiddle'classRubyVM::InstructionSequence#RetrieveR

  9. ruby-on-rails - 如何解析位于 Amazon S3 存储桶中的 CSV 文件 - 2

    下面是我用来从应用程序中解析CSV的代码,但我想解析位于AmazonS3存储桶中的文件。当推送到Heroku时它也需要工作。namespace:csvimportdodesc"ImportCSVDatatoInventory."task:wiwt=>:environmentdorequire'csv'csv_file_path=Rails.root.join('public','wiwt.csv.txt')CSV.foreach(csv_file_path)do|row|p=Wiwt.create!({:user_id=>row[0],:date_worn=>row[1],:inven

  10. ruby - 存储外部 API 的密码 - 最佳实践 - 2

    如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。

随机推荐