Home  >  Article  >  Backend Development  >  PHP asynchronous non-blocking implementation method

PHP asynchronous non-blocking implementation method

藏色散人
藏色散人forward
2019-01-10 09:33:094676browse

In order to prevent PHP from blocking when processing long-term tasks on the backend and quickly respond to page requests, the following measures can be taken:

1. Use fastcgi_finish_request()

If PHP and the Web server use PHP-FPM (FastCGI Process Manager), the session can be ended immediately through the fastcgi_finish_request() function, and the PHP thread can continue to run in the background.

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);

As can be seen from the output results, after the page prints program start..., the session returns after outputting the first line to log.txt, so the subsequent debug... will not run on the browser. Display, and the log.txt file can completely receive three completion times.

2. Use fsockopen()

Use fsockopen() to open a network connection or a Unix socket connection, and then use stream_set_blocking() to request in non-blocking mode:

$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);

3. Use cURL

Use the curl_multi_* function in cURL to send asynchronous requests

$mh = curl_multi_init();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://localhost/");
curl_multi_add_handle($mh, $ch);
curl_multi_exec($mh, $active);
curl_close($ch);
curl_multi_remove_handle($mh, $ch);
curl_multi_close($mh);
echo "End\n";

4.Use Gearman/Swoole extension

Gearman is a distributed asynchronous processing framework with PHP extensions that can handle large batches of asynchronous tasks.

Swoole has been very popular recently. It has many asynchronous methods and is easy to use.

5. Use caches and queues

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

6. Call system commands

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

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

7. Use pcntl_fork()

Install the pcntl extension and use pcntl_fork() to generate a child process to execute tasks asynchronously. Personally, I think it is the most convenient, but also easy. A zombie process appears.

$pid = pcntl_fork()
if ($pid == 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);
}

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

Statement:
This article is reproduced at:awaimai.com. If there is any infringement, please contact admin@php.cn delete
Previous article:What is service bus queueNext article:What is service bus queue