代码之家  ›  专栏  ›  技术社区  ›  Shehab Mohamed

通过php curl的多个请求会影响我的vps速度

  •  0
  • Shehab Mohamed  · 技术社区  · 2 年前

    我有个问题,找不到解决办法。我有ovh的VP,内存64GB,三核CPU专用,不共享(A),VPS用于外部检查(B)。我的问题是,我在VPS(A)上托管的网站可以选择在购买前检查商品,我在领先网站的PHP后端中为检查过程添加了一个指向VPS(B)的外部链接。有时,许多客户同时点击检查按钮。我找到了主站点所在的VPS(A)。但是,由于多个请求,它无法打开,并且打开缓慢。我将curl请求从VPS(A)发送到VPS(B)。

    Curl-code-post方法

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 0);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_NOBODY, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd()."/cookie.txt");
    curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd()."/cookie.txt");
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    $data = curl_exec($ch);
    $error = curl_errno($ch);
    curl_close($ch);
    
    return $error ? json_encode(array('status' => 3, 
        'result' => 'Time out for Request', 'data' => "")) : $data;
    

    我的项目使用laravel、PHP和MySQL。我的VPS(A)是Ubuntu20,与Nginx一起工作,和VPS B一样。现在我想要一个解决这个问题的方法。它与我的curl代码或VPS设置有关吗?我如何处理来自买家的多个客户请求?

    我尝试将多个VPS作为VPS(B)并旋转它们,但仍然存在相同的问题。当许多客户到来时,VPS仍然很慢。

    0 回复  |  直到 2 年前
        1
  •  0
  •   IMSoP    2 年前

    你实际上扮演了两个人的角色, 二者都 有谁能让这一切变得更好。。。

    作为人员B,您正在运行一个提供一些数据的web服务。

    您可以努力使该web服务尽可能高效,例如检查对数据库的不必要或低效调用,或任何可能导致锁定的有状态调用。使用分析器找出代码中最慢的部分在哪里——不要猜测和浪费时间优化已经很快的东西。

    您可以实现缓存,以便在不重新获取数据的情况下为重复请求提供服务。您可以发送缓存生存期标头,以帮助客户端缓存其端的响应。

    您可以实现超时和速率限制,这样它在高负载下会更正常地失败,将结果返回给一些用户,将有用的错误返回给其他用户。

    当然,你可以在这个问题上投入更多的硬件,但一定要确定瓶颈在哪里。如果还没有,请将数据库和web服务器放在不同的服务器或容器上,这样它们就不会争夺CPU和RAM。如果Web服务器耗尽CPU或网络容量,考虑“扩展”,将多个Web服务器放在一个数据库前面。

    作为个人,您正在从web服务请求数据

    您可以实现数据缓存或HTTP响应缓存,这样就不需要经常调用服务。你可以问web服务的作者(你自己!)通过在响应中包含缓存生存期信息来帮助实现这一点。

    您可以限制单个用户按下按钮的频率,这样他们就不会使远程服务过载。

    您可以实现客户端超时并优雅地处理故障,如果服务没有响应,则返回到旧的缓存数据或有用的错误消息。

    使用第三方库,比如Guzzle或Symfony HTTP客户端,而不是手工创建curl调用,可能会让您受益匪浅。它们不会自动变得更快,但它们会使缓存和超时等功能的实现比PHP中内置的非常低级的函数容易得多。