繁体   English   中英

异步子进程中的Symfony2命令

[英]Symfony2 command within an asynchronous subprocess

我是Symfony2的新手,在尝试运行这样的异步命令遇到了阻塞:

class MyCommand extends ContainerAwareCommand{

protected function configure()
{
    $this
        ->setName('my:command')
        ->setDescription('My command')
        ->addArgument(
            'country',
            InputArgument::REQUIRED,
            'Which country?'
        )
    ;
}

protected function execute(InputInterface $input, OutputInterface $output)
{

    $country = $input->getArgument('country');


    // Obtain the doctrine manager
    $dm = $this->getContainer()->get('doctrine_mongodb.odm.document_manager');

   $users = $dm->getRepository('MyBundle:User')
        ->findBy( array('country'=>$country));
}}

当我从命令行调用它时,这非常有效:

php app/console my:command uk

但是当我称之为Symfony2进程时,它不起作用:

 $process = new Process("php ../app/console my:command $country");
 $process->start();

我收到一个数据库错误:“ [MongoWriteConcernException] 127.0.0.1:27017:not master

我认为这意味着该过程没有得到我的数据库配置...

我只想运行异步进程,还有其他方法吗?

也许一种方法来调用不需要答案的应用程序命令继续?

也许我需要使用注射?

PS:我目前的命令只是一个测试,最后应该是一个“昂贵”的操作...

好吧,我发现发生了什么......

我使用多种环境:DEV,TEST和PROD。

我也使用不同的服务器。

所以DEV环境是我自己的机器,具有简单的mongodb配置。 但TEST环境在其他服务器上具有副本集配置...

现在错误得到充分意义: “[MongoWriteConcernException] 127.0.0.1:27017:not master”

为了解决这个问题,我刚刚将环境参数( --env = )添加到流程中,一切都像魅力一样:

$process = new Process("php ../app/console my:command $country --env=test");

实际上,为了获得正确的环境,我使用这个:

$this->get('kernel')->getEnvironment();

让我的代码如下:

$process = new Process("php ../app/console my:command $country --env=".$this->get('kernel')->getEnvironment());

也许这不是一个美丽的方式,但它适用于我:)

Disclamer:对于你想要做的事情,这可能有点矫枉过正:)

我会选择相反的方式来做到这一点: pthreads

首先,快速检查StackOverflow向我展示了一个使用pthreads的非常好的例子: 在php中可以实现多线程

然后,知道您可以从另一个命令调用您的命令:

http://www.craftitonline.com/2011/06/calling-commands-within-commands-in-symfony2/

...让你拼成所有部分。 它有点复杂,但它完成了这项工作。

如果你想在Symfony2 / 3中完全执行async代码,那么就有AsyncServiceCallBundle

你应该这样称呼它:

$this->get('krlove.async')->call('your_service_id', 'method_name', [$arg1, $arg2]);

在内部,它使用方法在后台运行您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM