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

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