2017-07-07 47 views
1

我已经在我的xampp中添加了pthread,并且在没有yii框架的情况下工作正常,而且在yii框架中也通过yii模型,yii函数和扩展包含了扩展。 yiimailer不在这个类中工作,echo Yii :: app() - > basePath;也没有工作yii 1.x扩展组件后,线程yii模型不起作用

我的组件类

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); 


    } 
} 

使用这里

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

我已经添加了pthreads在我的xampp中,没有yii框架,并且在yii框架中工作正常,但在yii模型中,yii的功能和包含扩展例如。 yiimailer不在这个类中工作,echo Yii :: app() - > basePath;也没有工作 –

+0

我是通过调用浏览器的行动 错误是 注意:试图让非对象的属性在C:\ XAMPP \ htdocs中\ cbtTeamProject \保护\分量\ SendEmailThreads.php上线20 - 3倍 由于回声Yii :: app() - > basePath; –

回答

0

的问题是,并行线程不复制静态成员是对象(有例外ThreadedClosure对象)。这意味着在尝试通过Yii::app()获取单个实例时将返回新线程内部的null。 ,因为我以前从未使用过的Yii其中,我没有其适用性的想法 - -

唯一的,我能想到的这个解决办法是建立每个线程一个新的单一实例

虽然说到线程化,但是全球状态应该被认为是一面红旗。因此,如果应用程序或框架大量使用它(现在大多数PHP框架都如此),那么线程化并不是一个真正可行的选择。