Home >Backend Development >PHP Tutorial >PHP non-blocking mode (reprinted from Chenyuan), phpchengyuan_PHP tutorial

PHP non-blocking mode (reprinted from Chenyuan), phpchengyuan_PHP tutorial

WBOY
WBOYOriginal
2016-07-12 08:58:04820browse

PHP non-blocking mode (reprinted from Chenyuan), php Chenyuan

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.

help
01 02 03 04 05 06 07 08 09 10 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);

In the output of this example, you can see that the session returns after the output program start., so the debug output browser cannot receive it, but the log.txt file can fully receive the three completion times.

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

help
1 2 3 4 5 6 7 8 $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.1rn";    $http .= "Host: www.example.comrn";    $http .= "Connection: Closernrn"; fwrite($fp,$http); fclose($fp);

Use curl_multi_* functions in cURL to send asynchronous requests

help
1 2 3 4 5 6 $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 "Endn";

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 destroy NodeJS. Although the Swoole tool is good, I feel that the extension itself is not comparable to NodeJS)

4. Use redis and other caches and queues to write data to the cache, and use background scheduled tasks to achieve asynchronous processing of data.
This method should be very common in common high-traffic architectures

5. In extreme cases, system commands can be called and data can be passed to background tasks for execution. Personally, I feel it is not very efficient.

help
1 2 $cmd = 'nohup php ./processd.php $someVar >/dev/null  &'; `$cmd`

6. I don’t understand the gringo’s big move, it’s natively supported by PHP
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 processes.

help
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 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); }

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/1104657.htmlTechArticlePHP non-blocking mode (reposted from Chen Yuan), php Chen Yuan allows PHP to no longer block when PHP needs to be completed as a back-end processing Some long-term processing, in order to quickly respond to page requests, no result return judgment is made...
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