【问题标题】:GuzzleHttp Hangs When Using Localhost使用 Localhost 时 GuzzleHttp 挂起
【发布时间】:2022-04-28 18:53:22
【问题描述】:

这是一个简单的代码片段,但这只是挂起并且没有响应。

    $httpClient = new GuzzleHttp\Client(); // version 6.x

    $headers = ['X-API-KEY' => '123456'];

    $request = $httpClient->request('GET', 'http://localhost:8000/BlogApiV1/BlogApi/blogs/', $headers);
    $response = $client->send($request, ['timeout' => 2]);

    echo $request->getStatusCode();
    echo $request->getHeader('content-type');
    echo $request->getBody();
    die();

非常感谢任何指针。当我在上面使用我的用户名和密码尝试使用 github api 时,我确实收到了 200 响应和大量信息。

【问题讨论】:

  • 当您在浏览器中尝试http://localhost:8000/BlogApiV1/BlogApi/blogs/ 时会发生什么?
  • @teko 浏览器不断尝试加载某些内容,但从未加载。
  • 所以问题出在http://localhost:8000/BlogApiV1/BlogApi/blogs的脚本而不是上面的sn-p。
  • /blogs 中的脚本很好,并且可以生成格式良好的 Json(与邮递员的 get、post、put、delete 配合得很好)。上面的脚本访问它就是问题所在。

标签: php codeigniter rest guzzle


【解决方案1】:

问题是在使用php artisan serve 时,它使用的是single-threaded 的PHP 服务器。

Web 服务器只运行一个单线程进程,因此如果请求被阻止,PHP 应用程序将停止。

你可以这样做solution:

当调用自身时,线程阻塞等待自己的回复。解决方案是将提供应用程序和消费应用程序分离到它们自己的实例中,或者在 Apache 或 nginx 等多线程 Web 服务器上运行它。

或者,如果您正在寻找快速修复来测试您的更新 - 您可以通过打开两个命令提示符来完成此操作。第一个将运行php artisan serve(本地我的默认端口是8000,您将在http://localhost:8000 上运行您的站点)。第二个将运行php artisan serve --port 8001

然后您将发布请求更新为:

$request = $httpClient->request('GET', 'http://localhost:8001/BlogApiV1/BlogApi/blogs/', $headers);

这应该有助于您的测试,直到您能够将所有内容放在服务器或本地虚拟主机上。

【讨论】:

  • 是的,这正是我所面临的
  • 非常好的解决方案,我也这样做了。
  • 解释得很好,我花了一整天的时间来找出问题所在,我在想curl 有问题,但它是单线程服务器
  • 这解决了我的问题!非常感谢
【解决方案2】:

我遇到了同样的问题。我通过如下定义base_uri 解决了这个问题。

$client = new \GuzzleHttp\Client([
    'base_uri' => 'http://localhost:8000',
    'defaults' => [
        'exceptions' => false
    ]
]);

$response = $client->get('/api/user/1');

【讨论】:

  • 这工作正常,但是在使用带有 localhost URL 的 sendAsync 时它不起作用
【解决方案3】:

终于解决了。如果您从非标准端口运行,Guzzle(或具体来说是 CURL)会拒绝请求。

此外,这似乎是随机的,有时有效,有时无效。我搬到了 80 端口,瞧一切正常。

【讨论】:

  • 感谢以上分享。我无法弄清楚问题出在哪里。我将整个网站从笔记本电脑移到了网络服务提供商。它在那里工作,但当然现在我意识到这是因为显然他们使用端口 80。在本地,我使用端口 8000。再次感谢!
  • 对于 Laravel 开发者:我使用 Laravel Valet 解决了这个问题。看来 Guzzle 不喜欢 localhost。
  • @louisfischer:不是本地主机,而是对单线程 Web 服务器的多个请求是问题所在。您仍然可以使用 artisan,但您必须在另一个端口上运行另一个实例,例如使用 php artisan serve --port=8001 并告诉 Guzzle 改用此 base_uri (http://localhost:8001)(请参阅 stackoverflow.com/a/57573002/5816097)。
【解决方案4】:

您可以使用另一个端口运行另一个 Web 服务器实例,并将您的应用程序配置为在连接到您的 API 时使用此 base_uri:

php artisan serve \ 默认为端口 8000 \ 在另一个控制台中 php artisan serve --port=8001

$client->request('GET', 'http://localhost:8001/api/tests')

【讨论】:

    【解决方案5】:

    如果http://localhost:8000/BlogApiV1/BlogApi/blogs 的脚本运行良好,我敢打赌X-API-KEY 没有被发送。

    如果您查看文档 (http://docs.guzzlephp.org/en/latest/request-options.html#headers),似乎您的选项数组格式错误。

    应该是

     $headers = ['headers' => ['X-API-KEY' => '123456']];
    

    【讨论】:

    • 在上面试过但同样的事情。浏览器不断尝试加载。 Apache 变得无响应。
    • 所以,将我的代码移到网络服务器上的 FQD 上,没有问题!按预期收到 json 回复。因此,它与我的 Mac OSX 上 :8000 的 localhost 有关。有什么想法吗?
    • 本地主机上是否有任何已知的 guzzle 错误?完全相同的脚本适用于我的网络服务器和 fqd。
    • 已经用 8000 端口尝试了 localhost 和 127.0.0.1 并且结果相同。
    【解决方案6】:

    connect_timeout 设置为false 在本地开发(Laravel)上为我工作,请求通过只需要很长时间!

    $client = new Client([
        'connect_timeout' => false,
        'timeout'         => 30.0, // set higher if timeout still happens
    ]);
    

    【讨论】:

      【解决方案7】:

      这个问题已修复。 试试这个 -> 将你的 Laravel 文件配置到 IIS 或 XAMPP 服务器中,然后尝试通过你的本地 IP 地址运行,例如 (192.168.X.X)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        • 2021-11-28
        相关资源
        最近更新 更多