PTHREADS SYMFONY在类扩展\ Thread

时间:2016-04-13 10:29:20

标签: php multithreading pthreads symfony

我一直在做一些关于使用 pthreads和symfony 的阅读。

我的问题与该问题中的问题类似:Multi-threading in Symfony2

简而言之:我的后端在处理它应该处理的所有数据之前达到超时,然后它无法向我的前端发送回答。

因此,尝试使用不同的线程似乎是(一个)绕过该问题的解决方案(直到某个限制,我知道这一点)。

通过阅读,我已经找到了关于pthreads如何工作的基础知识,并发现这篇文章非常相关:https://blog.madewithlove.be/post/thread-carefully/

我做了一个带有基本symfony项目的示例案例来理解它:

[my_symf_project] \ src \ AppBundle \ Controller下的主控制器类:

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     */
    public function indexAction(Request $request)
    {
        // replace this example code with whatever you need
        $tt = new TestThread('BOOOMSTICK');
        $tt->start();

        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir').'/..'),
        ]);
    }
}

扩展Thread的类在:[my_symf_project] \ src \ AppBundle \ DependencyInjection:

<?php
namespace AppBundle\DependencyInjection;

    class TestThread extends \Thread {
        public function __construct($text){
            $this->text = $text;
        }

        public function run(){
            $vendorAutoload= __DIR__.'/../../../vendor/autoload.php';
            require_once  $vendorAutoload;
            require_once  __DIR__.'/ClassOutsideThread.php';

            $cot = new ClassOutsideThread(' RUN ' . ' ' . $this->text);
            $cot->show();
        }

    }
    ?>

另一个类(在扩展Thread的类之外)以及[my_symf_project] \ src \ AppBundle \ DependencyInjection:

<?php
namespace AppBundle\DependencyInjection;

class ClassOutsideThread {
    public function __construct($text){
        $this->text = $text;
    }

    public function show(){
        echo $this->text;
    }
}
?>

通过上面的代码我设法显示&#39; RUN BOOOMSTICK&#39;在标准symfony空项目页面的顶部。我明白这是可能的,因为我添加了声明&#34; require_once __DIR __。&#39; /ClassOutsideThread.php&#39 ;;&#34;在run()函数的开头。

现在我遇到了几个关于如何通过run()函数传递给childthreads:类和其他symfony上下文参数的问题。这是我想要获得的愿望清单:

  1. 文件夹[my_symf_proj] \ src \ AppBundle下的类文件:是否可以快速加载该捆绑下的所有类,例如关于&#39; vendor&#39;的自动加载。我的类TestThread中使用的文件夹(取自:Boostraping symfony 2 for pthread from command)?
  2. 我想在run()函数中使用symfony logger。我试过了:$ GLOBALS [&#39; kernel&#39;] - &gt; getContainer() - &gt; get(&#39; logger&#39;),但是我在[my_symf_proj]中遇到了很大的空白] \ var \ logs \ dev.log,所以我想知道如何通过子线程访问$ GLOBALS [&#39;内核&#39;] - &gt; getContainer()?
  3. 我想在run()函数中使用我的Doctrine连接到DB(对应于symfony参数集的DB)。我怎样才能做到这一点? (我也试过$ GLOBALS [&#39;内核&#39;] - &gt; getContainer() - &gt; get(&#39; dbal.connection&#39;),但它似乎没有锻炼。)
  4. PS:我知道使用$ GLOBALS [&#39; kernel&#39;] - &gt; getContainer()在特定的childthreads情况下也不是symfony最佳实践,它似乎是一个方便的选择。< / p>

2 个答案:

答案 0 :(得分:2)

通过提供的提示,我设法让它发挥作用。这是symfony 3.0中的一个线程示例。*

用以下内容替换问题中的类TestThread,您将看到symfony上下文到达子线程:

        class TestThread extends \Thread {
        public function __construct($text){


                $this->text = $text;
            $this->kernelName = $GLOBALS['kernel']->getName();
            $this->kernelEnv = $GLOBALS['kernel']->getEnvironment();
            $this->kernelDebug = $GLOBALS['kernel']->isDebug();

        }

        public function run(){
           require_once __DIR__.'/../../../app/autoload.php';
           require_once __DIR__.'/../../../app/AppKernel.php';



            $kernelInThread = new \AppKernel($this->kernelEnv, $this->kernelDebug);
            $kernelInThread->loadClassCache();
            $kernelInThread->boot();


            $container = $kernelInThread->getContainer();


            $log = $container->get('logger');

            $log->info('THIS IS WORKING NOW');

            $con = $container->get('doctrine.dbal.default_connection');
            $q = new PdoQuery($con);
                $c = $q->getConnection()->prepare('select field from table');

             $c->execute();
             $res = $c->fetchAll();
             var_dump($res); 



            echo 'the end </br>';
       }
    }

答案 1 :(得分:1)

查看this post

1您可以使用类似

的内容
$loader = require __DIR__.'/../../../../../../vendor/autoload.php';

2-3如果你不必在线程之间共享对象,你可以在run方法中轻松完成:

$kernel = new \AppKernel($this->env, $this->debug);
$kernel->loadClassCache();
$kernel->boot();
$this->container = $kernel->getContainer();
$this->container->get('doctrine_mongodb');
.....