Método asincrónico de PHP llamado en el framework Yii

Pregunta

Quiero saber si es posible invocar de forma asíncrona un método del controlador Yii desde una de sus acciones mientras la acción muestra una vista, dejando que el método complete una operación de larga ejecución. Me encantaría hacer algo como el código de abajo y no necesito devolver un resultado demy_long_running_func.

<code>public function actionCreate() {
    $model = new Vacancies;
    if (isset($_POST['Vacancies'])) {
        $model->setAttributes($_POST['Vacancies']);
        $model->save();
        //I wish :)
        call_user_func_async('my_long_running_func',$model);
    }
    $this->render('create', array( 'model' => $model));
}
</code>
Problema

Estoy tratando de escribir una acción de controlador en Yii que publique una vacante y notifique a los suscriptores interesados ​​de la publicación. El problema es que lleva mucho tiempo ejecutar la consulta de notificación.

Ahora estoy buscando una manera de ejecutar la consulta de forma asíncrona para que el cartel vea su respuesta en el menor tiempo posible, mientras que la consulta se ejecuta en segundo plano de manera similar a los delegados o eventos de C #.

Las soluciones que he buscado en Googlesolicitud (es) asíncrona (s) durante el curso de la acción del controlador, pero todo lo que quiero hacer es ejecutar un método del controlador de forma asíncrona y la acción tuvo queEspere hasta elpeticiones) se completaron.

Intentó

He intentado los siguientes métodos, pero la consulta sigue siendo lenta para mis datos de prueba de aproximadamente 1500 usuarios.

Yii ActiveRecord

<code>if ($vacancy->save()) {                
    if($vacancy->is_active == 1) {
        $url = Yii::app()->createUrl('vacancies/view',array('id'=>$model->id));
        $trainees = YumUser::getUsersByRole('Trainees');
        if($trainees!=null) {
            foreach($trainees as $trainee){
                $message = new YumMessage;
                $message->from_user_id = Yii::app()->user->id;
                $message->title = 'Vacancy Notification: '.date('M j, Y');
                $message->message = "A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
                $message->to_user_id = $trainee->id;
                $message->save();                
            }
        }
    }    
}
</code>

Yii objetos de acceso a datos

<code>if ($vacancy->save()) {        
    if($vacancy->is_active == 1) {
        $url = Yii::app()->createAbsoluteUrl('vacancies/view',array('id'=>$model->id));
        $trainee_ids=Yii::app()->db->createCommand()->select('user_id')->from('trainee')->queryColumn();
        $fid=Yii::app()->user->id;
        $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
        $ts = time();
        $tt = 'Vacancy Notification: '.date('M j, Y');
        if($trainee_ids!=null) {
            foreach($trainee_ids as $trainee_id){
                Yii::app()->db->createCommand()
                  ->insert('message',array('timestamp'=>$ts,'from_user_id'=>$fid,'to_user_id'=>$tid,'title'=>$tt,'message'=>$msg));
            }
        }
    }
}
</code>

Declaraciones preparadas

<code>if ($vacancy->save()) {                
    if($vacancy->is_active == 1) {
        $url = Yii::app()->createUrl('vacancies/view',array('id'=>$model->id));                    
        $trainee_ids=Yii::app()->db->createCommand()->select('user_id')->from('trainee')->queryColumn();
        $fu=Yii::app()->user->id;
        $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
        $ts = time();
        $tt = 'Vacancy Notification: '.date('M j, Y');
        $sql="INSERT INTO message (timestamp,from_user_id,title,message,to_user_id) VALUES (:ts,:fu,:tt,:msg,:tu)";
        if($trainee_ids!=null) {
            foreach($trainee_ids as $trainee_id){

                $command=Yii::app()->db->createCommand($sql);
                $command->bindParam(":ts",$ts,PDO::PARAM_INT);
                $command->bindParam(":fu",$fu,PDO::PARAM_INT);
                $command->bindParam(":tt",$tt,PDO::PARAM_STR);
                $command->bindParam(":msg",$msg,PDO::PARAM_STR);
                $command->bindParam(":tu",$trainee_id,PDO::PARAM_INT);

                $command->execute();

            }
        }
    }
}
</code>
Investigación

También he revisado los siguientes sitios web (solo puedo publicar dos enlaces) pero requieren la acción para esperar a que se complete la solicitud o necesito una curvatura (a la que no tengo acceso en el servidor de implementación) o necesita una biblioteca externa. Esperaba una implementación nativa de PHP.

PHP Simulado Multi-ThreadingMultihilo en php¿Llamadas asíncronas de PHP?Procesamiento asíncrono en PHPEditar

Pude reducir considerablemente el tiempo de respuesta al reescribir mi consulta de esta manera (moviendo el bucle de usuario a la capa de base de datos):

<code>public function actionCreate() {
    $user=YumUser::model()->findByPk(Yii::app()->user->id);
    $model = new Vacancies;
    $model->corporate_id=$user->professional->institution->corporate->id;
    $model->date_posted=date('Y-m-d');
    $model->last_modified=date('Y-m-d H:i:s');

    if (isset($_POST['Vacancies'])) {
        $model->setAttributes($_POST['Vacancies']);
        if ($model->save()) {                
            if($model->is_active == 1) {
                $url = Yii::app()->createAbsoluteUrl('vacancies/view',array('id'=>$model->id));                    
                $fu=Yii::app()->user->id;
                $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
                $ts = time();
                $tt = 'New Vacancy: '.$model->title;
                $sql='INSERT INTO message (timestamp,from_user_id,title,message,to_user_id) SELECT :ts,:fu,:tt,:msg,t.user_id FROM trainee t';
                Yii::app()->db->createCommand($sql)->execute(array(':ts'=>$ts,':fu'=>$fu,':tt'=>$tt,':msg'=>$msg));
            }                
            if (Yii::app()->getRequest()->getIsAjaxRequest())
                Yii::app()->end();
            else
                $this->redirect(array('view', 'id' => $model->id));
        }
    }
    $this->render('create', array( 'model' => $model));
}
</code>

No obstante, sería bueno si alguien pudiera publicar una forma de llamar a las funciones de forma asíncrona.

Respuestas a la pregunta(3)

Su respuesta a la pregunta