Detailed explanation of PHP non-blocking mode

*文
Release: 2023-03-18 19:06:01
Original
1881 people have browsed it

Non-blocking mode refers to the message mechanism that uses socket events. The communication between the Server and the Client is in an asynchronous state. This article introduces the PHP non-blocking mode to everyone. Interested friends can learn together. I hope to be helpful.

Let PHP no longer block When PHP needs to complete some long-term processing as a back-end process, in order to quickly respond to page requests without making a judgment on the result return, the following measures can be taken:

1. If you are using FastCGI mode, using fastcgi_finish_request() can end the session immediately, but the PHP thread continues to run.


echo "program start.";
file_put_contents('log.txt','start-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
fastcgi_finish_request();
sleep(1);
echo 'debug...';
file_put_contents('log.txt', 'start-proceed:'.date('Y-m-d H:i:s'), FILE_APPEND);
sleep(10);
file_put_contents('log.txt', 'end-time:'.date('Y-m-d H:i:s'), FILE_APPEND);
Copy after login

The output of this example can be seen in the output program start. The session will return, so the debug output browser cannot receive it. , and the log.txt file can fully receive three completion times.

2. Use the non-blocking mode of fsockopen and cUrl to request another URL


$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) die('error fsockopen');
stream_set_blocking($fp,0);
$http = "GET /save.php / HTTP/1.1\r\n"; 
$http .= "Host: www.example.com\r\n"; 
$http .= "Connection: Close\r\n\r\n";
fwrite($fp,$http);
fclose($fp);
Copy after login

Use the curl_multi_* function in cURL to send asynchronous requests


$cmh = curl_multi_init();
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "http://localhost:6666/child.php");
curl_multi_add_handle($cmh, $ch1);
curl_multi_exec($cmh, $active);
echo "End\n";
Copy after login

3. Use Gearman and Swoole extensions

Gearman is a distributed asynchronous processing framework with PHP extensions that can handle large batches of asynchronous tasks;
Swoole has been very popular recently and has many asynchronous methods and is easy to use. (Note from Chenyuan: It claims to redefine PHP and completely spray NodeJS. Although the Swoole tool is good, I feel that the extension itself is not comparable to NodeJS)

4. Use redis Wait for the cache and queue to write data to the cache, and use background scheduled tasks to implement asynchronous processing of data.

This method should be very common in common high-traffic architectures

5. In extreme cases, the system can be called Command can pass data to background tasks for execution, but I personally feel that it is not very efficient.


$cmd = 'nohup php ./processd.php $someVar >/dev/null &';
`$cmd`
Copy after login

Sixth, the gringo’s ultimate move, I don’t understand it, PHP native support

http://nikic.github.io/2012/12/22/Cooperative-multitasking-using-coroutines-in-PHP.html

7. Install the pcntl extension and use pcntl_fork to generate a child process to perform tasks asynchronously. Personally, I think it is the most convenient, but it is also prone to zombie process.


if (($pid = pcntl_fork()) == 0) {
child_func(); //子进程函数,主进程运行
} else {
father_func(); //主进程函数
}
echo "Process " . getmypid() . " get to the end.\n";
function father_func() {
echo "Father pid is " . getmypid() . "\n";
}
function child_func() {
sleep(6);
echo "Child process exit pid is " . getmypid() . "\n";
exit(0);
}
Copy after login

Related recommendations:

php uses swoole to update the client in real time Data

Using Swoole to asynchronously capture web pages for practical sharing

php CGI, FastCGI , APACHE2HANDLER, detailed explanation of CLI operating mode

The above is the detailed content of Detailed explanation of PHP non-blocking mode. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template