【问题标题】:PHP stalls on loop of curl function with bad urlPHP 在 URL 错误的 curl 函数循环上停止
【发布时间】:2011-10-06 17:03:55
【问题描述】:

我有一个包含几千个 URL 的数据库,我正在检查页面上的链接(最终查找特定链接),因此我通过循环抛出以下函数,并且每隔一段时间,其中一个 URL 是错误的然后整个程序停止运行并开始建立使用的内存。我认为添加 CURLOPT_TIMEOUT 可以解决此问题,但事实并非如此。有什么想法吗?

$options = array(
    CURLOPT_RETURNTRANSFER => true,         // return web page
    CURLOPT_HEADER         => false,        // don't return headers
    CURLOPT_FOLLOWLOCATION => true,         // follow redirects
    CURLOPT_ENCODING       => "",           // handle all encodings
    CURLOPT_USERAGENT      =>  "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'",     // who am i
    CURLOPT_AUTOREFERER    => true,         // set referer on redirect
    CURLOPT_TIMEOUT        => 2,          // timeout on response
    CURLOPT_MAXREDIRS      => 10,           // stop after 10 redirects
    CURLOPT_POST            => 0,            // i am sending post data
       CURLOPT_POSTFIELDS     => $curl_data,    // this are my post vars
    CURLOPT_SSL_VERIFYHOST => 0,            // don't verify ssl
    CURLOPT_SSL_VERIFYPEER => false,        //
    CURLOPT_VERBOSE        => 1                //
);

$ch      = curl_init($url);
curl_setopt_array($ch,$options);
$content = curl_exec($ch);
$err     = curl_errno($ch);
$errmsg  = curl_error($ch) ;
$header  = curl_getinfo($ch);
curl_close($ch);

//  $header['errno']   = $err;
//  $header['errmsg']  = $errmsg;
$header['content'] = $content;

#Extract the raw URl from the current one
$scheme = parse_url($url, PHP_URL_SCHEME); //Ex: http
$host = parse_url($url, PHP_URL_HOST); //Ex: www.google.com
$raw_url = $scheme . '://' . $host; //Ex: http://www.google.com

#Replace the relative link by an absolute one
$relative = array();
$absolute = array();

#String to search
$relative[0] = '/src="\//';
$relative[1] = '/href="\//';

#String to remplace by
$absolute[0] = 'src="' . $raw_url . '/';
$absolute[1] = 'href="' . $raw_url . '/';

$source = preg_replace($relative, $absolute, $content); //Ex: src="/image/google.png" to src="http://www.google.com/image/google.png"

return $source;

【问题讨论】:

  • 您是否在循环中将该函数中的所有内容都扔掉了?
  • 这个函数没有在循环中定义,是这个函数然后我的for循环在每次迭代之后调用这个函数。
  • 您是否找到了脚本停止的确切代码行?我只是好奇,因为你怎么能说它是具体的功能?如果是的话,是哪几行?
  • @hakre 我假设它来自这个函数,考虑到其余代码是 mysql connect 和一个调用 url 的 for 循环,将其放入该函数,然后打印源代码。 afuzzyllama 不敢相信我错过了,谢谢。但仍然停滞不前。

标签: php curl timeout


【解决方案1】:

如果找不到 URL,curl_exec 将返回 false。 HTTP 状态代码将为零。 检查 curl_exec 的结果并检查 HTTP 状态 代码也是。

$content = curl_exec($ch);
$httpStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ( $content === false) {
   if ($httpStatus == 0) {
    $content = "link was not found";
   }
}
....

你目前的方式,代码行

header['content'] = $content;

将获得 false 的值。这不是你的 想。

我正在使用 curl_exec 并且我的代码在以下情况下不会停止 它找不到网址。代码继续运行。 不过,您最终可能会在浏览器中一无所获 以及 Firebug 控制台中的消息,例如“500 Internal Server Error”。 也许这就是你说的摊位的意思。

【讨论】:

    【解决方案2】:

    所以基本上你不知道,只是猜测 curl 请求正在停止。

    对于这个答案,我也只能猜测。您可能还需要设置以下 curl 选项之一:CURLOPT_CONNECTTIMEOUT

    如果连接已经停止,则可能不会考虑其他超时设置。我不完全确定,但请参阅Why would CURL time out in 1000ms when I have set up timeout upto 3000ms?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多