Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP在url错误的curl函数循环上暂停_Php_Curl_Timeout - Fatal编程技术网

PHP在url错误的curl函数循环上暂停

PHP在url错误的curl函数循环上暂停,php,curl,timeout,Php,Curl,Timeout,我有一个包含几千个URL的数据库,我正在检查页面上的链接(最终查找特定的链接),因此我将下面的函数通过一个循环抛出,每隔一段时间,其中一个URL就坏了,然后整个程序只是暂停并停止运行,并开始积累使用的内存。我原以为添加CURLOPT_超时可以解决这个问题,但事实并非如此。有什么想法吗 $options = array( CURLOPT_RETURNTRANSFER => true, // return web page CURLOPT_HEADER

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

$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;

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

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


如果连接已暂停,则可能不考虑其他超时设置。我不完全确定,但请查看。

curl\u exec如果找不到URL,将返回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,如果 它找不到url。代码一直在运行。 但是,您的浏览器中可能没有任何内容 以及Firebug控制台中的一条消息,如“500内部服务器错误”。
也许这就是你所说的失速

您是否将该函数中的所有内容都放入循环中?该函数不在循环中定义,而是该函数,然后是my for循环,在每次迭代后调用该函数。您是否找到了脚本暂停的确切代码行?我只是好奇,因为你怎么知道它是具体的函数呢?如果是,那么这许多行中的哪一行?@hakre我假设它来自这个函数,考虑到剩下的代码是mysql connect和一个调用url的for循环,将其放入该函数中,然后打印源代码。阿弗兹亚玛不敢相信我错过了,谢谢。不过还是会停下来。