首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在PHP中发出异步HTTP请求

如何在PHP中发出异步HTTP请求
EN

Stack Overflow用户
提问于 2008-09-23 23:00:53
回答 13查看 208.1K关注 0票数 234

在PHP中有没有一种方法可以进行异步HTTP调用?我不关心响应,我只想做一些像file_get_contents()这样的事情,而不是在执行剩下的代码之前等待请求完成。这对于在我的应用程序中引发某种类型的“事件”,或者触发较长的进程非常有用。

有什么想法吗?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-05-28 05:14:03

我之前接受的答案不起作用。它仍在等待回应。不过,这确实可以用,取自How do I make an asynchronous GET request in PHP?

代码语言:javascript
复制
function post_without_wait($url, $params)
{
    foreach ($params as $key => &$val) {
      if (is_array($val)) $val = implode(',', $val);
        $post_params[] = $key.'='.urlencode($val);
    }
    $post_string = implode('&', $post_params);

    $parts=parse_url($url);

    $fp = fsockopen($parts['host'],
        isset($parts['port'])?$parts['port']:80,
        $errno, $errstr, 30);

    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\r\n";
    $out.= "Content-Type: application/x-www-form-urlencoded\r\n";
    $out.= "Content-Length: ".strlen($post_string)."\r\n";
    $out.= "Connection: Close\r\n\r\n";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}
票数 43
EN

Stack Overflow用户

发布于 2008-09-23 23:35:27

您可以使用exec()来调用可以处理HTTP请求的东西,比如wget,但是您必须将程序的所有输出定向到某个地方,比如文件或/dev/null,否则PHP进程将等待该输出。

如果您想要将进程与apache线程完全分离,可以尝试这样的方法(我不确定这一点,但我希望您能理解):

代码语言:javascript
复制
exec('bash -c "wget -O (url goes here) > /dev/null 2>&1 &"');

这不是一项很好的业务,您可能需要一些类似于cron作业的东西来调用心跳脚本,该脚本轮询实际的数据库事件队列以执行真正的异步事件。

票数 20
EN

Stack Overflow用户

发布于 2018-07-09 14:02:24

截至2018年,Guzzle已经成为HTTP请求的事实上的标准库,并在几个现代框架中使用。它是用纯PHP编写的,不需要安装任何自定义扩展。

它可以很好地执行异步HTTP调用,甚至pool them,例如当您需要进行100个HTTP调用,但不想一次运行超过5个调用时。

并发请求示例

代码语言:javascript
复制
use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client(['base_uri' => 'http://httpbin.org/']);

// Initiate each request but do not block
$promises = [
    'image' => $client->getAsync('/image'),
    'png'   => $client->getAsync('/image/png'),
    'jpeg'  => $client->getAsync('/image/jpeg'),
    'webp'  => $client->getAsync('/image/webp')
];

// Wait on all of the requests to complete. Throws a ConnectException
// if any of the requests fail
$results = Promise\unwrap($promises);

// Wait for the requests to complete, even if some of them fail
$results = Promise\settle($promises)->wait();

// You can access each result using the key provided to the unwrap
// function.
echo $results['image']['value']->getHeader('Content-Length')[0]
echo $results['png']['value']->getHeader('Content-Length')[0]

请参阅http://docs.guzzlephp.org/en/stable/quickstart.html#concurrent-requests

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/124462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档