php 如何检查一个网站是否正常运行?

njthzxwz  于 2022-12-10  发布在  PHP
关注(0)|答案(8)|浏览(222)

我想使用PHP检查一个网站在某个特定的示例中是打开还是关闭。我知道curl会获取文件的内容,但我不想读取网站的内容。我只想检查网站的状态。有没有什么方法可以检查网站的状态?我们可以使用ping来检查状态吗?对我来说,获得如下状态信号就足够了(404,403等)。一小段代码可能会对我有很大帮助。

ldxq2e6h

ldxq2e6h1#

像这样东西应该有用

$url = 'yoururl';
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_exec($ch);
    $retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if (200==$retcode) {
        // All's well
    } else {
        // not so much
    }
mu0hgdu0

mu0hgdu02#

curl -Is $url | grep HTTP | cut -d ' ' -f2

curl -Is $url只输出标头。
grep HTTP过滤器到HTTP响应标头。
cut -d ' ' -f2将输出修剪为第二个“字”,在本例中为状态代码。
示例:

$ curl -Is google.com | grep HTTP | cut -d ' ' -f2
301
j2qf4p5b

j2qf4p5b3#

function checkStatus($url) {
    $agent = "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; pt-pt) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27";

    // initializes curl session
    $ch = curl_init();

    // sets the URL to fetch
    curl_setopt($ch, CURLOPT_URL, $url);

    // sets the content of the User-Agent header
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);

    // make sure you only check the header - taken from the answer above
    curl_setopt($ch, CURLOPT_NOBODY, true);

    // follow "Location: " redirects
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    // return the transfer as a string
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    // disable output verbose information
    curl_setopt($ch, CURLOPT_VERBOSE, false);

    // max number of seconds to allow cURL function to execute
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);

    // execute
    curl_exec($ch);

    // get HTTP response code
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if ($httpcode >= 200 && $httpcode < 300)
        return true;
    else
        return false;
}

// how to use
//===================
if ($this->checkStatus("http://www.dineshrabara.in"))
    echo "Website is up";
else
    echo "Website is down";
exit;
vhmi4jdf

vhmi4jdf4#

我是这样做的:我设置了用户代理,以最大限度地减少目标班宁我的可能性,并且禁用了SSL验证,因为我知道目标:

private static function checkSite( $url ) {
    $useragent = $_SERVER['HTTP_USER_AGENT'];

    $options = array(
            CURLOPT_RETURNTRANSFER => true,      // return web page
            CURLOPT_HEADER         => false,     // do not return headers
            CURLOPT_FOLLOWLOCATION => true,      // follow redirects
            CURLOPT_USERAGENT      => $useragent, // who am i
            CURLOPT_AUTOREFERER    => true,       // set referer on redirect
            CURLOPT_CONNECTTIMEOUT => 2,          // timeout on connect (in seconds)
            CURLOPT_TIMEOUT        => 2,          // timeout on response (in seconds)
            CURLOPT_MAXREDIRS      => 10,         // stop after 10 redirects
            CURLOPT_SSL_VERIFYPEER => false,     // SSL verification not required
            CURLOPT_SSL_VERIFYHOST => false,     // SSL verification not required
    );
    $ch = curl_init( $url );
    curl_setopt_array( $ch, $options );
    curl_exec( $ch );

    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return ($httpcode == 200);
}
wyyhbhjk

wyyhbhjk5#

你看过get_headers()函数吗?http://it.php.net/manual/en/function.get-headers.php。它似乎完全满足了你的需要。
如果直接使用curl和-I标志,它将返回HTTP头(404等)而不是页面HTML。在PHP中,等效的选项是curl_setopt($ch, CURLOPT_NOBODY, 1);

py49o6xq

py49o6xq6#

ping不会执行您要执行的操作--它只会告诉您机器是否已启动(并对ping做出响应),但这不一定意味着Web服务器已启动。
你可以尝试使用http_head方法--它会检索web服务器发回的头文件。如果服务器发回头文件,那么你就知道它已经启动并运行了。

nwlls2ji

nwlls2ji7#

你不能用ping测试一个web服务器,因为它是一个不同的服务。服务器可能在运行,但是web服务器守护进程可能会崩溃。所以curl是你的朋友。忽略它的内容。

ohtdti5x

ohtdti5x8#

此函数用于检查URL是否存在。检查时间最长为300ms,但您可以在cURL选项CURLOPT_TIMEOUT_MS中更改该参数

/*
 * Check is URL exists
 *
 * @param  $url           Some URL
 * @param  $strict        You can add it true to check only HTTP 200 Response code
 *                        or you can add some custom response code like 302, 304 etc.
 *
 * @return boolean true or false
 */
function is_url_exists($url, $strict = false)
{
    if (is_int($strict) && $strict >= 100 && $strict < 600 || is_array($strict)) {
        if(is_array($strict)) {
            $response = $strict;
        } else {
            $response = [$strict];
        }
    } else if ($strict === true || $strict === 1) {
        $response = [200];
    } else {
        $response = [200,202,301,302,303];
    }
    $ch = curl_init( $url );
    
    $options = [
        CURLOPT_NOBODY          => true,
        CURLOPT_FAILONERROR     => true,
        CURLOPT_RETURNTRANSFER  => true,
        CURLOPT_NOSIGNAL        => true,
        CURLOPT_SSL_VERIFYPEER  => false,
        CURLOPT_SSL_VERIFYHOST  => false,
        CURLOPT_HEADER          => false,
        CURLOPT_FOLLOWLOCATION  => true,
        CURLOPT_VERBOSE         => false,
        CURLOPT_USERAGENT       => ( $_SERVER['HTTP_USER_AGENT'] ?? '' ),
        CURLOPT_TIMEOUT_MS      => 300, // TImeout in miliseconds
        CURLOPT_MAXREDIRS       => 2,
    ];
    
    curl_setopt_array($ch, $options);
    
    $return = curl_exec($ch);
    $errno = curl_errno($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    curl_close($ch);
    
    if (!$errno && $return !== false) {
        return ( in_array($httpcode, $response) !== false );
    }
    
    return false;
}

你可以检查任何网址,从域,ip地址到图像,文件等,我认为这是最快的方法,证明是有用的。

相关问题