我一直在做一些关于使用 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上下文参数的问题。这是我想要获得的愿望清单:
答案 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)
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');
.....