Ich habe ziemlich viel über die Verwendung von Pthreads mit symfony.PTHREADS SYMFONY Klassen und Konstante in run() -Funktion der Klasse erweitern Thread
Mein Problem ist irgendwie ähnlich, was in dieser Frage ausgesetzt ist: Multi-threading in Symfony2.
Kurz gesagt: Mein Back-End erreicht eine Zeitüberschreitung, bevor alle Daten verarbeitet werden, die es verarbeiten soll, und dann kann es keine Antwort an mein Frontend zurücksenden.
Daher scheint der Versuch, verschiedene Threads zu verwenden, (eine der) Lösung (en) zu sein, dieses Problem zu umgehen (bis zu einer gewissen Grenze, ich bin mir dessen bewusst).
Durch das Lesen, ich habe über die Grundlagen herausgefunden, wie pThreads gearbeitet und fand diesen Artikel sehr relevant darüber: https://blog.madewithlove.be/post/thread-carefully/
ich mit einem grundlegenden symfony Projekt ein Musterkoffer kam es zu verstehen:
Die Hauptsteuerklasse unter [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').'/..'),
]);
}
}
Die Klasse erstreckenden Faden unter: [my_symf_project] \ src \ AppBundle \ Dependency Injection:
<?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();
}
}
?>
Und eine andere Klasse (außerhalb der Klasse Verlängerung der Thread) als auch unter [my_symf_project] \ src \ AppBundle \ Dependency Injection:
<?php
namespace AppBundle\DependencyInjection;
class ClassOutsideThread {
public function __construct($text){
$this->text = $text;
}
public function show(){
echo $this->text;
}
}
?>
Thru den Code oben schaffe ich 'RUN BOOOMSTICK' auf anzuzeigen die Oberseite der Standard symfony leeren Projektseite. Und ich habe verstanden, dass das möglich ist, weil ich die Aussage "require_once __DIR __. '/ ClassOutsideThread.php';" am Anfang der Funktion run().
Jetzt bin ich mit einigen Fragen darüber, wie an childthreads übergeben: Klassen und andere symfony Kontextparameter, durch die Funktion run(). Hier ist eine Wunschliste von dem, was ich zu bekommen versuchen:
- Klassen-Dateien unter dem Ordner [my_symf_proj] \ src \ AppBundle: Gibt es eine schnelle Möglichkeit, unter diesem Bündel all Klassen zu laden, wie die Autoload über die 'Vendor' Ordner, der in meiner Klasse TestThread verwendet wird (aus: Boostraping symfony 2 for pthread from command)?
- Ich möchte Symfony Logger in der Funktion run() verwenden. Ich habe versucht: $ GLOBALS ['Kernel'] -> getContainer() -> Get ('Logger'), aber ich bekomme eine große Lücke in der [my_symf_proj] \ var \ logs \ dev.log, also frage ich mich wie Zugriff auf $ GLOBALS ['kernel'] -> getContainer() durch einen Childthread?
- Ich möchte meine Doctrine-Verbindung mit dem DB (der, der den Symfony-Parametern entspricht) in der Funktion run() verwenden. Wie kann ich das machen? (Wie auch ich habe $ GLOBALS versucht [ 'Kernel'] -> getContainer() -> get ('dbal.connection'), aber es scheint nicht zu funktionieren.)
PS: Ich bin Beachten Sie, dass die Verwendung von $ GLOBALS ['kernel'] -> getContainer() keine Symfony Best Practice ist, auch in dieser speziellen Childthreads-Situation, es scheint eine bequeme Option zu sein.
so bald wie ich "require_once '/../../../var/bootstrap.phpcache';" vor "require_one '/../../../app/autoload.php';" Die Funktion run() funktioniert überhaupt nicht (keine Echonachricht wird angezeigt). Ich laufe auf Symfony 3.0.2 für diesen Test, darf ich fragen, welche Version verwenden Sie? In jedem Fall danke ich dir dafür, dass du mir neues Feedback gegeben hast, ich werde mehr auf deine Lösung eingehen, wenn du es getan hast, ist es sicherlich möglich, es auf meiner Seite zu erreichen, auch habe ich meine Forschungen auf rabbitMQ als Lösung umgestellt asynchrone Arbeit zu verarbeiten (aber ich erwäge, beide zu verwenden: Thread und MQ, um asynchrone Arbeit zu optimieren). – nyluje
Wir verwenden symfony 2.7.10 (last stabil). Ich weiß nicht, ob v3 anders ist. – cleaversdev
aber Ihr Skript wirft Fehler? – cleaversdev