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);
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);
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";
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`
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); }
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!