2017-07-07 3 views
1

Ich habe Pthreads in meinem XAMPP und seine Arbeit gut ohne yii Rahmen und auch in YII Rahmen von YII Modelle, YII Funktionen und inkludierte Erweiterung z. yiimailer funktioniert nicht in dieser Klasse, echo Yii :: app() -> basePath; wird auch (mit Ausnahme von nichtyii 1.x nach dem Erweitern Komponente mit Thread YII Modelle nicht funktioniert

Arbeits

Meine Komponentenklasse

class SendEmailThreads extends Thread{ 
    private $sendTo; 
    private $subject; 
    private $bodyText; 
    public function __construct($sendTo, $subject, $bodyText){ 
     $this->sendTo = $sendTo; 
     $this->subject = $subject; 
     $this->bodyText = $bodyText; 
    } 
    function run(){ 
     echo Yii::app()->basePath; 
     sleep(1); 


    } 
} 

Gebraucht Hier

public function actionBulkEmail(){  

for($i=0;$i<3;$i++){ 

    $pool[] = new SendEmailThreads('[email protected]','test bulk','test by fraz'); 
} 

foreach($pool as $worker){ 
    $worker->start(); 
} 

foreach($pool as $worker){ 
    $worker->join(); 
} 

}

+0

Ich habe pthreads in meinem XAMPP hinzugefügt und es funktioniert gut ohne YII-Framework und auch in YII-Framework aber YII-Modelle, yii Funktionen und inkludierte Erweiterung z. yiimailer funktioniert nicht in dieser Klasse, echo Yii :: app() -> basePath; funktioniert auch nicht –

+0

Ich war die Aktion über den Browser anrufen Fehler ist Hinweis: Versuchen, Eigenschaft von Nicht-Objekt in C: \ xampp \ htdocs \ cbtTeamProject \ protected \ components \ SendEmailThreads.php in Zeile 20 erhalten - 3 mal wegen echo Yii :: app() -> basePath; –

Antwort

0

Das Problem ist, dass pthreads nicht statisch Mitglieder kopiert, die Objekte sind Threaded und Closure Objekte). Das bedeutet, dass innerhalb des neuen Threads null zurückgegeben wird, wenn versucht wird, die einzelne Instanz über Yii::app() abzurufen.

Die einzige Problemumgehung, die ich mir vorstellen kann - die, ich habe keine Ahnung von seiner Eignung, da ich noch nie zuvor Yii verwendet habe - ist, eine neue Singleton Instanz pro Thread zu erstellen.

Eigentlich sollte der globale Zustand als rote Flagge angesehen werden, wenn es um Threading geht. Daher, wenn eine Anwendung oder ein Framework es stark nutzt (wie es heutzutage bei den meisten PHP-Frameworks der Fall ist), ist das Threading nicht wirklich eine praktikable Option.