【问题标题】:Is there a maximum of simultaneous localhost cUrl request with PHP?PHP 是否有最多同时的 localhost cUrl 请求?
【发布时间】:2020-02-15 14:53:00
【问题描述】:

我正在设置一个 vuejs 应用程序和多个必须在它们之间进行通信的 Laravel 应用程序。 Laravel 应用程序之间的通信是通过 cUrl 请求完成的。现在,在 MAMP Pro (PHP 7.3) 的帮助下,一切都在我的开发机器上 (Last MacBook Pro - Mac OS Majove)。 问题是当我同时查询时,我有一个:

CURL error 28 communication timeout ... with 0 bytes received.

如果当然不是超时问题(我在所有应用程序和所有超时上尝试了 2 分钟 - 结果相同)。由于我正在使用 API,因此没有 PHP 会话(因此没有会​​话文件锁定)。

似乎 cUrl 连接已关闭,但我不知道为什么(我自己没有关闭它 - 而且它没有达到超时 (connect/read/global) )。

更直观:


vuejs --ajax1--> Laravel A --cUrl--> Laravel B --cUrl--> Laravel C
vuejs --ajax2--> Laravel A --cUrl--> Laravel B --cUrl--> Laravel C

vuejs <--500-- Laravel A --X-- Laravel B <---- Laravel C
vuejs <--500-- Laravel A --X-- Laravel B <---- Laravel C

ajax1 and ajax2 are sent at the same time.

如果ajax1ajax2 不是在同一时间发送,它会起作用。

我知道的:

  • 通信在Laravel ALaravel B 之间被切断,但Laravel B 执行代码并返回一个响应(我认为,因为连接已关闭,所以从未到达?)。但是,Laravel CLaravel C 的请求都可以运行。

我尝试了什么:

  • Apache 和 nginx
  • 禁用防火墙
  • 增加所有超时时间 (PHP - cUrl)
  • 增加内存限制 (PHP)
  • cUrl CURLOPT_FORBID_REUSECURLOPT_FRESH_CONNECT 选项
  • 更改 Laravel 应用程序的本地域名和 tld

我想知道的:

  • 我可以同时在同一台机器上使用 cUrl 执行的最大请求数(当然,我将 CURLOPT_MAXCONNECTS 设置为 20 - 没有成功)?
  • 是否有遗漏的 PHP.ini 配置?
  • 问题是否可能来自所有这些应用程序都在同一台机器上运行的事实?如果是,为什么?
  • 两个服务器(nginx 和 Apache)是否都限制来自同一 IP 的连接? (由于所有应用程序都在同一台机器上,它们都具有相同的 IP)。

【问题讨论】:

    标签: php laravel curl


    【解决方案1】:

    刚刚遇到了同样的问题。主后端充当代理,通过 curl(guzzle) 从其他后端获取数据。

    但我只有在同时执行 5 个以上的请求时才会超时。 所有应用程序都是实时的,我尝试设置一个新的 VPS 服务器以避免在同一台机器上拥有所有后端。 设置 CURLOPT_MAXCONNECTS 也不起作用。

    这是我的假代理代码(使用 laravel)

        $uri = $request->get('url');
        $api_url = env('URL');
    
        $token = env('TOKEN');
        $key = 'Bearer ' . $token;
    
        $client = new Client([
            'base_uri' => $api_url,
            'headers' => [
                'Accept' => 'application/json',
                'Content-Type' => 'application/json',
                'Authorization' => $key
            ]
        ]);
    
        $request = $client->request('GET', $uri, [
            'http_errors' => false
        ]);
    
    
        $response = $request->getBody()->getContents();
    
        return $response;
    

    我还没有找到解决方案。希望有人可以帮助我们解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2015-07-24
      • 1970-01-01
      • 2019-06-26
      • 2017-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多