【问题标题】:Help fixing php/api/curl code please请帮助修复 php/api/curl 代码
【发布时间】:2011-05-27 21:19:05
【问题描述】:

我有一个域可用性检查,它连接到一个 API 并从 $tmp 输出“可用:和不可用:”。下面的代码只会检查可用性一次。

我想多次检查域的可用性(可能在循环中?),不必每次都重新启动 cURL 连接(因为它浪费时间 - 每次查询需要 300 毫秒到 1 秒)

我只是不知道如何连接到 cURL 并运行循环(通过 API 进行检查)。非常感谢帮助调整代码!最大限度地减少输出“可用/不可用”和循环检查所需的时间是关键。

谢谢。

当前代码

<?php

    function GetCurlPage ($pageSpec)
    {
      $ch = curl_init($pageSpec);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
      $tmp = curl_exec ($ch);
      curl_close ($ch);
      $tmp = preg_replace('/(?s)<meta http-equiv="Expires"[^>]*>/i', '', $tmp);
      $tmp = explode('<br>', $tmp);
      echo $tmp[0];
      echo "<br>";
      echo $tmp[1];
      echo "<br>";
      return $tmp;
    }

$returnUrl = "http://www.mysite.com.au/check.php";
$url = "https://www.apisite.com.au/availability/check.php?domain=testdomain&suffixes=.com.au";
$output = GetCurlPage("$url");

?>

@Marc B

    function getCurlPage($pageSpec) {
if (is_null($ch)) {
    $ch = curl_init($pageSpec);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
} else {
    curl_setopt($ch, CURLOPT_URL, $pageSpec);
}
  while ($i < 5) {
  $tmp = curl_exec ($ch);
  //curl_close ($ch);
  $tmp = preg_replace('/(?s)<meta http-equiv="Expires"[^>]*>/i', '', $tmp);
  $tmp = explode('<br>', $tmp);
  echo $tmp[0];
  echo "<br>";
  echo $tmp[1];
  echo "<br>";
  echo udate('H:i:s:u');
  echo "<br><br>";
  $i++;
  }
      return $tmp;
}

【问题讨论】:

  • 如果你暗示持久的 http 连接,你将不得不坚持你已经拥有的。 cURL 不是为这种方式设计的。
  • @goreSplatter - 是否可以循环 $tmp = curl_exec ($ch);使 $tmp 成为一个数组,即: $tmp(i) 并在每个循环中增加 i ?在每个循环上,输出..这会执行可用性检查和输出,还是不可能跳过对每个可用性检查执行 curl?
  • 有没有其他方法可以使用http-post来实现我想要的?
  • 我认为可以将GetCurlPage 包装在一个循环中。我仍然看不出在循环中快速执行一个相同的 HTTP 请求有什么意义……

标签: php api curl performance


【解决方案1】:

这应该回答你的问题:Persistent/keepalive HTTP with the PHP Curl library?

评论跟进:

function getCurlPage($pageSpec) {
    if (is_null($ch)) 
        static $ch = curl_init($pageSpec);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    } else {
        curl_setopt($ch, CURLOPT_URL, $pageSpec);
    }
    $tmp = curl_exec($ch);
    ... do NOT close the curl handle, otherwise do the rest the same as before ...
}

可能无法按原样工作,我只需要 2 个小时就完成这项工作,但这应该足以让您开始。

顺便说一下,GetCurlPage("$url") 不需要双引号,这是浪费解析器时间,因为 PHP 必须创建一个新的空字符串,将 $url 填充到其中,然后传递新字符串下。只需GetCurlPage($url)

【讨论】:

  • @Marc B - 谢谢!请原谅我缺乏 cURL 知识,但是如何在设置检查循环的同时使用上述代码实现它?抱歉打扰了。
  • 如果你让 curl 句柄超出范围,它会被 PHP 清理掉。在函数外部创建 curl 句柄并将其作为参数传入,或者将其存储在函数内部的静态变量中。无论哪种方式,不要每次都创建一个新句柄。只需在第二次和后续请求中重用它。您所要做的就是每次更改 URL。
  • 好吧,我的理解是在 GetCurlPage 函数之外创建这个“curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array('Connection: Keep-Alive', 'Keep-Alive: 300'));” ..其余的有点令人困惑。您是否有空闲时间用 cmets 标记我的代码,以便我可以插入所需的代码?再次抱歉..
  • 现在试一试..谢谢!过会儿再发。
  • 更新问题,底部有代码..如有必要请修改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2015-11-10
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
相关资源
最近更新 更多