【发布时间】:2013-01-13 07:05:29
【问题描述】:
我正在尝试在 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。
更新
我在这里找到了替代解决方案: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);
}
这个似乎更适合我。
这是一个有效的解决方案吗?
【问题讨论】:
-
您在这里所做的只是发送请求并关闭连接。所以它不像你想象的那样异步。您可以分叉该进程,或打开一个新进程。 PHP 不具备多任务能力。
-
您使用的是网络服务器还是 CLI?
-
这是使用网络服务器。
-
您自己托管,您是否有权访问 system() 命令?
-
我们使用亚马逊网络服务自托管,所以我们控制所有机器实例等,并可以根据我们的需要设置服务器。如果我无权访问
system(),我可以请求启用它。
标签: php post curl asynchronous fire-and-forget