Maison >cadre php >Workerman >Laravel5.3 combiné avec Workerman (asynchrone)

Laravel5.3 combiné avec Workerman (asynchrone)

尚
avant
2019-11-25 17:11:202773parcourir

La colonne suivante du tutoriel d'utilisation de Workerman vous présentera la méthode d'utilisation de Laravel5.3 et de Workerman ensemble (de manière asynchrone) pour les amis dans le besoin. !

Laravel5.3 combiné avec Workerman (asynchrone)

En recherchant des informations sur Internet, il existe des composants de compositeur prêts à l'emploi qui se combinent avec Workerman, mais j'ai personnellement l'impression qu'il n'est pas fiable. github, et il est difficile de l'ajuster s'il y a des problèmes. Je voulais juste l'essayer moi-même d'abord.

Ma méthode nécessite un peu de code source de Workerman pour être modifiée, et elle introduit directement les fichiers de code de Workerman, ce qui semble un peu faible, mais mon talent est limité et je n'ai pas pensé à une meilleure méthode pour le le moment étant.

Préparation :

1. Vous devez d'abord comprendre l'utilisation de la ligne de commande sous le framework Laravel, référez-vous à la version chinoise du tutoriel

2. pour comprendre les connaissances de base de Workerman

Scénario : Une fois l'utilisateur inscrit, envoyez un rappel par e-mail à l'utilisateur de manière asynchrone

1 Placez le framework Workerman dans le répertoire de l'application

. 2. Créez le code de commande :

php artisan make:command SendEmail
namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Illuminate\Mail\Message;
use Workerman\Worker;

require app_path('Workerman/Workerman_Linux/Autoloader.php');

class SendEmail extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:email {action}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     */
    public function handle()
    {
        $mailWorker = new Worker('Text://0.0.0.0:12345');
        $mailWorker->count = 4;
        $mailWorker->name = 'MailWorker';
        $mailWorker->onMessage = function ($connection, $emailData) {
            $emailData = json_decode($emailData);
            $name = $emailData->name;
            $email = $emailData->to;
            Mail::raw('注册成功', function (Message $message) use ($email) {
                $message->to($email)->subject(trans('mail.welcome_register'));
            });

            // 写入日志
            Log::useFiles(storage_path() . '/logs/event.log', 'info');
            Log::info("{$name}({$email})注册成功");
        };

        Worker::runAll();
    }
}

Ci-dessus C'est le serveur Workerman. Démarrez-le avec la ligne de commande :

php artisan send:email start

A ce moment, une erreur sera signalée sur la ligne de commande : Workerman. [artisan] ne s'exécute pas. La raison est que Workerman utilisera le premier paramètre artisan pour démarrer le fichier actuellement. En fait, send:email est le fichier de démarrage que nous voulons

Solution : modifier le code du paramètre d'analyse de Workerman

WorkermanWorkerman_LinuxWorker.php, modifiez la méthode parseCommand (ajoutez simplement 1 aux clés de $argv) :

/**
     * Parse command.
     * php yourfile.php start | stop | restart | reload | status
     *
     * @return void
     */
    protected static function parseCommand()
    {
        global $argv;

        if($argv[0] == 'artisan') // laravel框架下处理
        {
            // Check argv;
            $start_file = $argv[1];

            if (!isset($argv[2])) {
                exit("Usage: php yourfile.php {start|stop|restart|reload|status}\n");
            }

            // Get command.
            $command  = trim($argv[2]);
            $command2 = isset($argv[3]) ? $argv[3] : '';
        }
        else
        {
            // Check argv;
            $start_file = $argv[0];
            if (!isset($argv[1])) {
                exit("Usage: php yourfile.php {start|stop|restart|reload|status}\n");
            }

            // Get command.
            $command = trim($argv[1]);
            $command2 = isset($argv[2]) ? $argv[2] : '';
        }
    
     // 只要略修改上面的参数解析部分即可 
     ..........................
}

Redémarrez OK :

php artisan send:email start

3 Le serveur est terminé, ce qui suit. est le code client

Mon code d'opération de messagerie est utilisé comme logique d'événement, donc dans Écrivez le code du fichier d'écoute d'événement :

app\Listeners\SendMailEventListener.php:
rrree

4 Étapes récapitulatives

Démarrez le. serveur---Enregistrer l'utilisateur---Déclencher l'événement SendEmail---le client socket écrit des données sur le serveur- --Envoi d'e-mails depuis le serveur

Recommandé :

Tutoriel Workerman

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer