Home  >  Article  >  Backend Development  >  PHP multi-threading small case

PHP multi-threading small case

Original
2017-11-10 10:36:412121browse

Regarding PHP multi-threading, we will encounter many problems. The following article is about small project problems with PHP multi-threading. At the same time, we provide three solutions, please refer to it.

Project situation:

To synchronize 300W+ user data to qcloud, we can only synchronize one curl at a time, which is about 3 synchronizations per second. In total, 300W is synchronized. The data is estimated to take 10 days+, so I thought of using multi-threading to solve it.

Option 1:

Write a multi-process solution in C++ and fork multiple processes to solve the problem. The main thread is responsible for reading/storing data, and the sub-thread is responsible for curl.

Solution 2:

Use PHP to write a multi-process solution, the same as Solution 1. The main thread reads and the child thread curls.

But since PHP does not have multiple processes, it cannot directly control threads/processes. So we can only rely on linux to implement multi-process.

The PHP function pcntl_fork() can create a process, which is equivalent to Linux's fork.

The difference from fork is that the 0 returned by pcntl_fork is the child process, and the returned id is the pid of the child process (while fork returns 0 for the parent process, and the child process returns ppid).

Note The pcntl_fork() function must be on Linux. It is said that the pcntl.so module needs to be loaded, but it seems that it does not need to be loaded.

Solution 3:

php+shell simulates multi-threading

For example: the test.php file implements the functions required by the project (including database reading and writing and curl)

Write another shell as follows and save it as start.sh:

#!/bin/bash  //指定bash,必须for(( i=0; i<20; i++))do
    php test.php &    //执行test.php,&符号的意思是把该操作放在后台执行,这样shell就可以继续执行下一步sleep命令了。如果没有这个符号,shell会阻塞在这里。
    sleep 1s
done

Finally execute the shell, sudo ./start.sh

The shell will start 20 processes and execute test separately at the same time .php

But since each process is equivalent to the main process, the common resources are difficult to control. In this case, the common resource is only the database, so I lock the database every time I operate it. See my other article for details. an article. mysql lock. Because compared to database operations, which can basically be solved every second, curl takes dozens of seconds or more to send hundreds of messages continuously, so database locking has little impact.

Summary: Although this is just a small case about PHP multi-threading, I hope everyone can use their brains, and I hope this article can bring you ideas for solving such problems.

Related recommendations:

java - pthreads is PHP multi-threading.

socket - Using PHP multi-threading, multi-process

Two implementation methods of multi-threading in PHP


The above is the detailed content of PHP multi-threading small case. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn