【问题标题】:PHP: Check if a website is onlinePHP:检查网站是否在线
【发布时间】:2015-05-26 10:32:01
【问题描述】:

我在 php 中有一个基于 curl 的函数来检查网站是否在线,但我注意到它只适用于 http 链接,而不适用于 https 链接。

有谁知道如何更新此功能以支持 https 链接。

function isDomainAvailible($domain){
    // Check, if a valid url is provided
    if(!filter_var($domain, FILTER_VALIDATE_URL)){
        return false;
    }

    // Initialize curl
    $curlInit = curl_init($domain);
    curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
    curl_setopt($curlInit,CURLOPT_HEADER,true);
    curl_setopt($curlInit,CURLOPT_NOBODY,true);
    curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);

    // Get answer
    $response = curl_exec($curlInit);

    curl_close($curlInit);

    if ($response){ 
        return true;
    } else { 
        return false;
    }
}

【问题讨论】:

  • 或者你可以试试这个进行域检查phpwhois.org
  • 感谢您的链接,但我不想要可用性,而是想要网站的当前在线/离线状态。我的功能工作正常,但仅适用于 http 而不是 https。我觉得需要添加一些额外的卷曲。

标签: php curl web


【解决方案1】:

如果你想使用你的功能,那么你需要 https 支持。您可以下载此文件cacert.pem 并在您的函数中添加路径,例如:

function isDomainAvailible($domain){
// Check, if a valid url is provided
if(!filter_var($domain, FILTER_VALIDATE_URL)){
    return false;
}

// Initialize curl
$curlInit = curl_init($domain);
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curlInit, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
curl_setopt($curlInit, CURLOPT_PROTOCOLS, CURLPROTO_HTTP);
curl_setopt ($curlInit, CURLOPT_CAINFO, dirname(__FILE__)."/cacert.pem");
// Get answer
$response = curl_exec($curlInit);

curl_close($curlInit);

   if ($response){ 
    return 1;
   } else { 
    return 0;
   }
}
$domain = 'https://www.facebook.com';
$avi = isDomainAvailible($domain);
echo $avi;

【讨论】:

  • 感谢这很好用,2 个快速问题。 1) 是否有一个页面包含有关证书 (pem) 的更多信息,以及 2) 我知道它是有效的,但为什么你在代码中使用 1 和 0 而不是真假布尔值有什么具体原因吗?
  • 不客气。 1 和 0 没有具体原因。只是为了测试:)
【解决方案2】:

尝试在 curl 函数中添加这个

curl_setopt($curlInit, CURLOPT_SSL_VERIFYPEER, false);

【讨论】:

    【解决方案3】:

    当您说“我注意到它仅适用于 http 链接而不适用于 https 链接”时,您到底是什么意思?无论哪种方式,cURL 的工作方式都是一样的,您只需使用 https 协议而不是 http 传递一个 url。问题可能是别的。这听起来像你遇到的麻烦吗? How to send HTTPS posts using php

    【讨论】:

    • 我的意思是,如果你传递一个 https 链接,它会由于某种原因返回为 false。我刚刚接受了一个使用证书来解决此问题的答案。
    • 啊,我看到你添加了额外的项目,它可以工作。我刚刚赞成你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多