This article mainly introduces how to use Message queue and asynchronous queue in the Laravel framework of PHP. For Versions later than Laravel5.0, the example environment is Linux. For more information, see
Queue Configuration
First, explain how to use queue in my previous project.
Our current projects all use symfony, the older projects use symfony1.4, and the new projects use symfony2. Symfony is still very nice to use, especially symfony2. In general, many java framework design ideas are used. However, it does not support queue. In symfony, we also experienced several processes using queue. At first, Zhang's httpsqs was used. This is simple to use, but there is a single point. After all, our project is officially available for external services, so we studied ActiveMQ, an open-source project under Apache, and found that there is also an updated MQ under Apache, that is, Apollo. Finally, we decided to use the Apollo.
The main application scenario of queue in our project is to process some time-consuming functions asynchronously, such as synchronizing third-party data and notifying our third-party data users when data changes. The general idea is this. If asynchronous processing is required in each controller, encode a json object and plug it into Apollo. Write a work Command, parse the json object in the Command, and call different methods based on the actions and parameters in the Command. Running Command on different machines at the same time as the daemon process is always running according to business needs, which is also a solution for implementing asynchronous multi-task processing applications. This is the case until laravel is found. I plan to study it. If possible, it is not impossible. Haha.
Since learning started, of course, go directly to laravel5. Routes, controller, and view are basically different from symfony, but it is not difficult to get started. Finally, let's take a look at queue.
1. Installing laravle and using composer is simple.
composer global require "laravel/installer=~1.1"vi ~/.bash_profile
Change ~ /. Composer/vendor/bin is added to the environment variable.
source ~/.bash_profile
You can use laravel directly in the command line. Try it.
laravel -V
If you can see the following, it means the operation is successful.
Laravel Installer version 1.2.1
2. Create a project.
laravel new guagua
3. Configure redis and queue.
4. Create a controller,
php artisan make:controller DefaultController
Push100 queue tasks in the controller action.
for($i = 0; $i < 100; $i ++) { Queue::push(new SendEmail("ssss".$i));}
5. Create the queue Command
php artisan make:command SendEmail --queued
Modify app/Commands/SendEmail. php and add a private variable.
protected $msg;
Modify the constructor at the same time.
public function __construct($msg){ $this->msg = $msg;}
Then modify the handle method.
public function handle() { sleep(4); echo $this->msg."\t".date("Y-m-d H:i:s")."\n"; $this->delete();}
6. Modify routes
Route::get('/', [ 'as' => 'index', 'uses' => 'DefaultController@index']);
7. Listen to the queue
php artisan queue:listen
To verify multi-task processing, we can run the same command in three windows at the same time.
8. Use laravel's built-in server to start the service.
php artisan serve --port 8080
Open your browser and access the http: // localhost: 8080/page. Of course, nginx and apache can also be used. However, various configurations are required for built-in ease of use.
You can see the execution of each queue in the console, as shown in. We can see that 100 tasks are evenly divided by three jobs.
At this point, I basically achieved the desired effect. It demonstrates that laravel can simply implement queue and perform multi-task processing.
Use App \ Commands \ command in the code generated by make Command, but the file is not prompted during running. Solution: change it to use Illuminate \ Console \ Command. I don't know why this low-level problem occurs. Is it my mac system or my character problem.
When pushing a queue in the action of the controller, the queue is not asynchronously executed, but is still executed in the action Script. It was found that it was a configuration problem. In the past, we not only had to modify queue. php In config, but also related configurations in. evn. Although the problem has been solved, I still feel that it hurts and cannot be understood. You also need to learn laravel.
Asynchronous queue usage
1. Configuration
The definition of the queue is not described here. To use Asynchronous queues, there are two key points:
(1) Storage queue location
(2) services for executing tasks
Open config/queue. php, which is the queue configuration file of laravel5. First, we can use the default parameter to specify the default queue driver. The default configuration is sync. This is a synchronous queue. We need to change the asynchronous queue first. If we use database as the driver, the queue task will be stored in the database, and we will start another backend service to process the queue task, which is asynchronous.
'default' => 'database'
After the configuration is modified, we need to create a table to store queue tasks. Laravel5 has a built-in command in the artisan command to generate data migration. Only two commands are required, of course, you have to configure the database connection.
php artisan queue:tablephp artisan migrate
In this way, the jobs table is automatically created in the database.
2. Start the queue listening service
Run the following command to start the queue listening service. It will automatically process the queue tasks in the jobs table:
php artisan queue:listen
In linux, if you want it to be executed in the background, you can:
nohup php artisan queue:listen &
3. Add a queue task
The Manual describes how to add a queue task. Here is a simple example.
First, use artisan to create a queue command:
php artisan make:command SendEmail --queued
This will generate the class file app/Commands/SendEmail. php, which will be identified as a queue command. You can write your own business logic in the handle method.
In the controller, you can simply distribute tasks through Bus: dispatch:
Bus::dispatch(new \App\Commands\SendEmail());
You will find that the task is not executed immediately, but is put into the jobs table and processed by the queue listening service.
For more detailed usage instructions, see the command bus and queue manuals.