PHP射后不理POST请求(PHP Fire and Forget POST Request)

2019-08-08 18:03发布

我想在PHP创建一个火灾和忘记方法,这样我可以POST数据到Web服务器,而不必等待回应。 我读这可以通过使用来实现CURL如以下代码:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
curl_exec($ch);
curl_close($ch);

不过,我不认为它可以作为我的期望。 例如,如果我将请求发送到该URL有一个错误会引起我的脚本抛出一个错误也是如此。 如果是射后不理我预计不会发生。

谁能告诉我,我是否做错事或可供选择的建议。 我使用的是Windows本地和Linux的开发,分期和生产环境。

UPDATE

我已经找到一个替代的解决方案在这里: http://blog.markturansky.com/archives/205

我已经清理了到下面的代码:

function curl_post_async($url, $params = array())
{
    // create POST string   
    $post_params = array();
    foreach ($params as $key => &$val) 
    {
        $post_params[] = $key . '=' . urlencode($val);
    }
    $post_string = implode('&', $post_params);

    // get URL segments
    $parts = parse_url($url);

    // workout port and open socket
    $port = isset($parts['port']) ? $parts['port'] : 80;
    $fp = fsockopen($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: application/x-www-form-urlencoded\r\n";
    $output .= "Content-Length: " . strlen($post_string) . "\r\n";
    $output .= "Connection: Close\r\n\r\n";
    $output .= isset($post_string) ? $post_string : '';

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

这一个似乎工作对我来说更好。

它是一个有效的解决方案?

Answer 1:

是的,使用套接字是,如果你不关心从你调用的URL的响应要走的路。 这是因为插座式连接器可以直接发送请求,而无需等待后终止,而这正是你追求什么 - 消防和忘记。

有两点需要注意,虽然:

  1. 它不再是一个卷曲的请求,所以它的价值重命名功能。 :)
  2. 这是绝对值得一试是否插座可能已经被打开,以防止脚本,如果失败时以后抱怨:

     $fp = fsockopen($parts['host'], $port, $errno, $errstr, 30); if ( ! $fp) { return FALSE; } 

这是值得链接到你现在正在使用的fsocket()脚本的原始来源:
http://w-shadow.com/blog/2007/10/16/how-to-run-a-php-script-in-the-background/



文章来源: PHP Fire and Forget POST Request