Fire and forget HTTP POST request trong PHP

Hướng dẫn gửi một POST request bằng PHP mà không đợi phản hồi (fire and forget).

Fire and forget HTTP POST request trong PHP
Hướng dẫn tao fire and forget POST bằng PHP

Có nhiều phương pháp để gửi POST request từ Server như dùng cURL, Stream Context hay các API trong PECL extension nhưng đều là những điều khiển bậc cao, luồng chương trình bị block để đợi kết quả trả về từ Server hoặc timeout.

Cách tiếp cận dưới đây giúp tạo một POST request bậc thấp, dùng socket để gửi đi rồi đóng luôn kết nối mà không quan tâm kết quả trả về. Hàm hỗ trợ cả HTTP và HTTPS.

function faf_post($url, $data, $content_type = "application/x-www-form-urlencoded") {
    $parts = parse_url($url);
    $is_https = isset($parts['scheme']) && ($parts['scheme'] === 'https');
    $scheme = $is_https ? 'ssl://' : '';
    $port = isset($parts['port']) ? $parts['port'] : ($is_https ? 443 : 80);

    // Create a socket connection to the server
    $fp = fsockopen($scheme . $parts['host'], $port, $errno, $errstr, 30);

    // create output string
    $output  = "POST " . $parts['path'] . " HTTP/1.1\r\n";
    $output .= "Host: " . $parts['host'] . "\r\n";
    $output .= "Content-Type: " . $content_type . "\r\n";
    $output .= "Content-Length: " . strlen($data) . "\r\n";
    $output .= "Connection: Close\r\n\r\n";
    $output .= $data;

    // send output to $url handle
    fwrite($fp, $output);
    fclose($fp);
}

Ví dụ 1: Gửi một POST request theo kiểu form.

$params = array("animal" => "dog", "action" => "bark");
faf_post( "https://www.example.com/action.php", http_build_query($params) );

Ví dụ 2: Gửi một POST request theo kiểu JSON

$params = array("animal" => "dog", "action" => "bark");
faf_post( "https://www.example.com/action.php", json_encode($params), "application/json" );

Phản hồi về bài viết

Cùng thảo luận chút nhỉ!

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.