close

在程式裡要產生出別的系統上的報表是否存在的清單,原本這樣寫:

<?php
        $url = 'https://abc.com/test.htm';
        $query = get_headers($url);
        if (isset($query[0])) {
            $status_code = $query[0];
            // HTTP status code 200, 301, 302, 500 都算是檔案存在,只有 404 視為檔案不存在
            if ($status_code != "HTTP/1.1 404 Not Found") {
               echo "<a href='".$url."</a><br />";
            }
?>

但是程式上線後不知道被什麼資安產品還是什麼神秘原因給擋了,會跑很久,直到出現 HTTP status code 504 (Gateway Timeout)。

同事建議我改成這樣:

<?php
        $url = 'https://abc.com/test.htm';
        $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
        $curl = curl_init();
        curl_setopt ($curl, CURLOPT_URL, $url);
        curl_setopt ($curl, CURLOPT_USERAGENT, $agent);
        curl_setopt ($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt ($curl, CURLOPT_VERBOSE, false);
        curl_setopt ($curl, CURLOPT_TIMEOUT, 2);
        curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, 2);

        curl_setopt ($curl, CURLOPT_HEADER, true);
        curl_setopt ($curl, CURLOPT_NOBODY, true);
        curl_setopt ($curl, CURLOPT_MAXREDIRS, 2); //  避免遞迴

        curl_setopt ($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt ($curl, CURLOPT_SSLVERSION, 6); //  使用 TLS 1.2,代碼對照表可查 PHP 官網的 curl_setopt
        curl_setopt ($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        $page = curl_exec($curl);
        $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
        // HTTP status code 200, 301, 302, 500 都算是檔案存在,只有 404 視為檔案不存在
        if ($httpcode != 404) {
            echo "<a href='".$url."</a><br />";
        }
?>

 

這樣改就沒事了耶!

 

arrow
arrow
    創作者介紹
    創作者 小攻城師 的頭像
    小攻城師

    小攻城師的戰場筆記

    小攻城師 發表在 痞客邦 留言(0) 人氣()