ขนาดไฟล์ระยะไกลโดยไม่ต้องดาวน์โหลดไฟล์


คำตอบ:


100

พบบางอย่างเกี่ยวกับสิ่งนี้ที่นี่ :

นี่เป็นวิธีที่ดีที่สุด (ที่ฉันพบ) ในการรับขนาดของไฟล์ระยะไกล โปรดทราบว่าคำขอ HEAD ไม่ได้รับเนื้อหาจริงของคำขอ แต่จะดึงข้อมูลส่วนหัว ดังนั้นการร้องขอ HEAD ไปยังทรัพยากรที่มีขนาด 100MB จะใช้เวลาเท่ากันกับคำขอ HEAD ไปยังทรัพยากรที่มีขนาด 1KB

<?php
/**
 * Returns the size of a file without downloading it, or -1 if the file
 * size could not be determined.
 *
 * @param $url - The location of the remote file to download. Cannot
 * be null or empty.
 *
 * @return The size of the file referenced by $url, or -1 if the size
 * could not be determined.
 */
function curl_get_file_size( $url ) {
  // Assume failure.
  $result = -1;

  $curl = curl_init( $url );

  // Issue a HEAD request and follow any redirects.
  curl_setopt( $curl, CURLOPT_NOBODY, true );
  curl_setopt( $curl, CURLOPT_HEADER, true );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );

  $data = curl_exec( $curl );
  curl_close( $curl );

  if( $data ) {
    $content_length = "unknown";
    $status = "unknown";

    if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    }

    if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
      $content_length = (int)$matches[1];
    }

    // http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
    if( $status == 200 || ($status > 300 && $status <= 308) ) {
      $result = $content_length;
    }
  }

  return $result;
}
?>

การใช้งาน:

$file_size = curl_get_file_size( "http://stackoverflow.com/questions/2602612/php-remote-file-size-without-downloading-file" );

5
แต่โปรดทราบว่าอาจมีการตอบกลับโดยไม่มีความยาวของเนื้อหา
VolkerK

4
จะไม่ดีกว่าcurl_getinfoไหมถ้าใช้อย่างที่ @macki แนะนำ?
Svish

1
@Svish ใช่เพราะแนวทางนั้นใช้งานได้จริง แนวทางที่นำเสนอในที่นี้ล้มเหลวใน URL ที่เปลี่ยนเส้นทางเนื่องจากใช้ความยาวของเนื้อหาแรกซึ่งไม่ใช่ความยาวของเนื้อหาขั้นสุดท้าย (จำเป็น?) จากประสบการณ์ของฉัน
Bobby Jack

12
สิ่งนี้ไม่ได้ผลสำหรับฉันเนื่องจากget_user_agent_string()ไม่ได้กำหนดไว้ การลบบรรทัดทั้งหมดออกทำให้ทุกอย่างใช้งานได้
Rapti

2
หากเซิร์ฟเวอร์ไม่รองรับ HEAD เซิร์ฟเวอร์จะส่งคืน 405
xiaoyifang

63

ลองใช้รหัสนี้

function retrieve_remote_file_size($url){
     $ch = curl_init($url);

     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);

     $data = curl_exec($ch);
     $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

     curl_close($ch);
     return $size;
}

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);หากยังไม่ได้ผลสำหรับคุณคุณอาจต้องการที่จะเพิ่ม
mermshaus

3
ไม่ได้ผลสำหรับฉันสำหรับรูปภาพ ฉันได้CURLOPT_FOLLOWLOCATIONตั้งค่าเป็นจริง
เนท

5
@Abenil เพิ่มพารามิเตอร์นี้ curl_setopt ($ curl, CURLOPT_SSL_VERIFYPEER เท็จ);
Davinder Kumar

1
@Davinder Kumar: ขอบคุณมากการเพิ่มรหัสของคุณทำให้รหัสข้างต้นใช้งานได้
Trung Le Nguyen Nhat

1
ยินดีต้อนรับ! @TrungLeNguyenNhat
Davinder Kumar

31

เป็นที่กล่าวถึงสองสามครั้ง, วิธีที่จะไปคือการดึงข้อมูลจากส่วนหัวของการตอบสนองของContent-Lengthข้อมูล

อย่างไรก็ตามคุณควรสังเกตว่า

  • เซิร์ฟเวอร์ที่คุณกำลังตรวจสอบไม่จำเป็นต้องใช้เมธอด HEAD (!)
  • ไม่จำเป็นต้องสร้างคำขอ HEAD ด้วยตนเอง (ซึ่งอาจไม่ได้รับการสนับสนุนอีกครั้ง) โดยใช้fopenหรือเหมือนกันหรือแม้แต่เรียกใช้ไลบรารี curl เมื่อ PHP มีget_headers()(โปรดจำไว้ว่า: KISS )

การใช้งานเป็นget_headers()ไปตามหลักการ KISS และทำงานได้แม้ว่าเซิร์ฟเวอร์ที่คุณกำลังตรวจสอบจะไม่รองรับคำขอ HEAD

ดังนั้นนี่คือเวอร์ชันของฉัน (กลไก: ส่งคืนขนาดรูปแบบที่มนุษย์อ่านได้ ;-)):

ส่วนสำคัญ: https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d (รุ่น curl และ get_headers)
get_headers () - เวอร์ชัน:

<?php     
/**
 *  Get the file size of any remote resource (using get_headers()), 
 *  either in bytes or - default - as human-readable formatted string.
 *
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @license MIT <http://eyecatchup.mit-license.org/>
 *  @url     <https://gist.github.com/eyecatchup/f26300ffd7e50a92bc4d>
 *
 *  @param   string   $url          Takes the remote object's URL.
 *  @param   boolean  $formatSize   Whether to return size in bytes or formatted.
 *  @param   boolean  $useHead      Whether to use HEAD requests. If false, uses GET.
 *  @return  string                 Returns human-readable formatted size
 *                                  or size in bytes (default: formatted).
 */
function getRemoteFilesize($url, $formatSize = true, $useHead = true)
{
    if (false !== $useHead) {
        stream_context_set_default(array('http' => array('method' => 'HEAD')));
    }
    $head = array_change_key_case(get_headers($url, 1));
    // content-length of download (in bytes), read from Content-Length: field
    $clen = isset($head['content-length']) ? $head['content-length'] : 0;

    // cannot retrieve file size, return "-1"
    if (!$clen) {
        return -1;
    }

    if (!$formatSize) {
        return $clen; // return size in bytes
    }

    $size = $clen;
    switch ($clen) {
        case $clen < 1024:
            $size = $clen .' B'; break;
        case $clen < 1048576:
            $size = round($clen / 1024, 2) .' KiB'; break;
        case $clen < 1073741824:
            $size = round($clen / 1048576, 2) . ' MiB'; break;
        case $clen < 1099511627776:
            $size = round($clen / 1073741824, 2) . ' GiB'; break;
    }

    return $size; // return formatted size
}

การใช้งาน:

$url = 'http://download.tuxfamily.org/notepadplus/6.6.9/npp.6.6.9.Installer.exe';
echo getRemoteFilesize($url); // echoes "7.51 MiB"

หมายเหตุเพิ่มเติม:ส่วนหัวความยาวของเนื้อหาเป็นทางเลือก ดังนั้นวิธีแก้ปัญหาทั่วไปจึงไม่สามารถพิสูจน์ได้ !



2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ ทรูContent-Lengthเป็นตัวเลือก แต่มันเป็นวิธีเดียวที่จะได้รับขนาดไฟล์โดยไม่ต้องดาวน์โหลดมัน - และเป็นวิธีที่ดีที่สุดที่จะได้รับget_headers content-length
Quentin Skousen

2
โปรดทราบว่าสิ่งนี้จะเปลี่ยนการตั้งค่าสำหรับวิธีการร้องขอเป็น HEAD ภายในคำขอ HTTP ที่ตามมาทั้งหมดสำหรับกระบวนการ PHP นี้ ใช้stream_context_createเพื่อสร้างบริบทแยกต่างหากเพื่อใช้สำหรับการโทรไปที่get_headers(7.1+)
MatsLindh

เพียงแค่เพิ่มว่าหาก URL หรือชื่อไฟล์ DOCUMENT ของคุณมีช่องว่างสิ่งนี้จะส่งกลับ -1
jasonflaherty


14

ฟังก์ชัน php ใช้get_headers()สำหรับฉันในการตรวจสอบความยาวของเนื้อหาเป็นไฟล์

$headers = get_headers('http://example.com/image.jpg', 1);
$filesize = $headers['Content-Length'];

รายละเอียดเพิ่มเติม: PHP Function get_headers ()


4
สำหรับฉัน (ที่มี nginx) ส่วนหัวคือ Content-Length
Pangamma

7

ฉันไม่แน่ใจ แต่คุณไม่สามารถใช้ฟังก์ชัน get_headers สำหรับสิ่งนี้ได้หรือไม่

$url     = 'http://example.com/dir/file.txt';
$headers = get_headers($url, true);

if ( isset($headers['Content-Length']) ) {
   $size = 'file size:' . $headers['Content-Length'];
}
else {
   $size = 'file size: unknown';
}

echo $size;

ด้วยตัวอย่างนี้เป็นไปได้ที่เซิร์ฟเวอร์เป้าหมายที่ $ url จะใช้ประโยชน์จาก get_headers ในการทำให้การเชื่อมต่อเปิดอยู่จนกว่ากระบวนการ PHP จะหมดเวลา (โดยการส่งคืนส่วนหัวอย่างช้ามากในขณะที่ไม่ช้าพอที่จะทำให้การเชื่อมต่อค้าง) เนื่องจากกระบวนการ PHP ทั้งหมดอาจถูก จำกัด โดย FPM จึงอาจทำให้เกิดการโจมตีแบบนางอายที่ช้าเมื่อ "ผู้ใช้" หลายคนเข้าถึงสคริปต์ get_headers ของคุณพร้อมกัน
Ted Phillips

6

ทางออกที่ดีที่สุดหนึ่งบรรทัด:

echo array_change_key_case(get_headers("http://.../file.txt",1))['content-length'];

php นั้นละเอียดเกินไป

function urlsize($url):int{
   return array_change_key_case(get_headers($url,1))['content-length'];
}

echo urlsize("http://.../file.txt");

3

การใช้งานที่ง่ายและมีประสิทธิภาพที่สุด:

function remote_filesize($url, $fallback_to_download = false)
{
    static $regex = '/^Content-Length: *+\K\d++$/im';
    if (!$fp = @fopen($url, 'rb')) {
        return false;
    }
    if (isset($http_response_header) && preg_match($regex, implode("\n", $http_response_header), $matches)) {
        return (int)$matches[0];
    }
    if (!$fallback_to_download) {
        return false;
    }
    return strlen(stream_get_contents($fp));
}

OP ระบุว่า "ไม่ต้องดาวน์โหลดไฟล์" วิธีนี้จะโหลดไฟล์ลงในหน่วยความจำจากเซิร์ฟเวอร์ระยะไกล (เช่นการดาวน์โหลด) แม้จะมีการเชื่อมต่อที่รวดเร็วระหว่างเซิร์ฟเวอร์ แต่ก็สามารถทำให้ไฟล์ขนาดใหญ่หมดเวลาหรือใช้เวลานานเกินไปได้อย่างง่ายดาย หมายเหตุ: คุณไม่เคยปิด $ fp ซึ่งไม่ได้อยู่ในขอบเขตสากล
Mavelo

1
ฟังก์ชันนี้ไม่ดาวน์โหลดเนื้อหานานที่สุด หากมีContent-Lengthส่วนหัว และการ$fpปิดอย่างชัดเจนนั้นไม่จำเป็น มันจะถูกปล่อยโดยอัตโนมัติเมื่อหมดอายุ php.net/manual/en/language.types.resource.php
mpyw

คุณสามารถยืนยันข้างต้นได้อย่างง่ายดายโดยใช้nc -l localhost 8080
mpyw

ที่จริงแล้ว*closeฟังก์ชันส่วนใหญ่ไม่จำเป็นใน PHP สมัยใหม่ มาจากเหตุผลทางประวัติศาสตร์สองประการ ได้แก่ ข้อ จำกัด ในการใช้งานและการเลียนแบบภาษาซี
mpyw

ส่วนหัวไม่น่าเชื่อถือและการดาวน์โหลดทางเลือกขัดต่อ OP สุดท้ายหากคุณเปิดไฟล์เพียงแค่ปิดมัน นักสะสมขยะไม่ใช่ข้อแก้ตัวสำหรับนักพัฒนาที่ขี้เกียจบันทึกโค้ดเพียงบรรทัดเดียว
Mavelo

2

เนื่องจากคำถามนี้ติดแท็ก "php" และ "curl" ไว้แล้วฉันจึงถือว่าคุณรู้วิธีใช้ Curl ใน PHP

หากคุณตั้งค่าไว้curl_setopt(CURLOPT_NOBODY, TRUE)คุณจะส่งคำขอ HEAD และอาจตรวจสอบส่วนหัว "ความยาวเนื้อหา" ของการตอบกลับซึ่งจะเป็นเพียงส่วนหัวเท่านั้น


2

ลองใช้ฟังก์ชันด้านล่างเพื่อรับขนาดไฟล์ระยะไกล

function remote_file_size($url){
    $head = "";
    $url_p = parse_url($url);

    $host = $url_p["host"];
    if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$host)){

        $ip=gethostbyname($host);
        if(!preg_match("/[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*/",$ip)){

            return -1;
        }
    }
    if(isset($url_p["port"]))
    $port = intval($url_p["port"]);
    else
    $port    =    80;

    if(!$port) $port=80;
    $path = $url_p["path"];

    $fp = fsockopen($host, $port, $errno, $errstr, 20);
    if(!$fp) {
        return false;
        } else {
        fputs($fp, "HEAD "  . $url  . " HTTP/1.1\r\n");
        fputs($fp, "HOST: " . $host . "\r\n");
        fputs($fp, "User-Agent: http://www.example.com/my_application\r\n");
        fputs($fp, "Connection: close\r\n\r\n");
        $headers = "";
        while (!feof($fp)) {
            $headers .= fgets ($fp, 128);
            }
        }
    fclose ($fp);

    $return = -2;
    $arr_headers = explode("\n", $headers);
    foreach($arr_headers as $header) {

        $s1 = "HTTP/1.1";
        $s2 = "Content-Length: ";
        $s3 = "Location: ";

        if(substr(strtolower ($header), 0, strlen($s1)) == strtolower($s1)) $status = substr($header, strlen($s1));
        if(substr(strtolower ($header), 0, strlen($s2)) == strtolower($s2)) $size   = substr($header, strlen($s2));
        if(substr(strtolower ($header), 0, strlen($s3)) == strtolower($s3)) $newurl = substr($header, strlen($s3));  
    }

    if(intval($size) > 0) {
        $return=intval($size);
    } else {
        $return=$status;
    }

    if (intval($status)==302 && strlen($newurl) > 0) {

        $return = remote_file_size($newurl);
    }
    return $return;
}

นี่เป็นเครื่องเดียวที่ใช้ได้กับฉันบนเซิร์ฟเวอร์ Ubuntu Linux apache ฉันต้องเริ่มต้น $ size และ $ status ที่จุดเริ่มต้นของฟังก์ชันมิฉะนั้นจะทำงานตามที่เป็นอยู่
Gavin Simpson

2

นี่เป็นอีกแนวทางหนึ่งที่จะใช้ได้กับเซิร์ฟเวอร์ที่ไม่รองรับHEADคำขอ

ใช้ cURL เพื่อส่งคำขอสำหรับเนื้อหาที่มีส่วนหัวช่วง HTTP ที่ขอไบต์แรกของไฟล์

หากเซิร์ฟเวอร์รองรับคำขอช่วง (เซิร์ฟเวอร์สื่อส่วนใหญ่จะ) เซิร์ฟเวอร์จะได้รับการตอบสนองตามขนาดของทรัพยากร

หากเซิร์ฟเวอร์ไม่ตอบสนองด้วยช่วงไบต์เซิร์ฟเวอร์จะมองหาส่วนหัวความยาวเนื้อหาเพื่อกำหนดความยาว

หากพบขนาดในส่วนหัวของช่วงหรือความยาวเนื้อหาการถ่ายโอนจะถูกยกเลิก หากไม่พบขนาดและฟังก์ชันเริ่มอ่านเนื้อหาการตอบสนองการถ่ายโอนจะถูกยกเลิก

นี่อาจเป็นแนวทางเสริมหากHEADคำขอส่งผลให้405วิธีการไม่รองรับการตอบกลับ

/**
 * Try to determine the size of a remote file by making an HTTP request for
 * a byte range, or look for the content-length header in the response.
 * The function aborts the transfer as soon as the size is found, or if no
 * length headers are returned, it aborts the transfer.
 *
 * @return int|null null if size could not be determined, or length of content
 */
function getRemoteFileSize($url)
{
    $ch = curl_init($url);

    $headers = array(
        'Range: bytes=0-1',
        'Connection: close',
    );

    $in_headers = true;
    $size       = null;

    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2450.0 Iron/46.0.2450.0');
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_VERBOSE, 0); // set to 1 to debug
    curl_setopt($ch, CURLOPT_STDERR, fopen('php://output', 'r'));

    curl_setopt($ch, CURLOPT_HEADERFUNCTION, function($curl, $line) use (&$in_headers, &$size) {
        $length = strlen($line);

        if (trim($line) == '') {
            $in_headers = false;
        }

        list($header, $content) = explode(':', $line, 2);
        $header = strtolower(trim($header));

        if ($header == 'content-range') {
            // found a content-range header
            list($rng, $s) = explode('/', $content, 2);
            $size = (int)$s;
            return 0; // aborts transfer
        } else if ($header == 'content-length' && 206 != curl_getinfo($curl, CURLINFO_HTTP_CODE)) {
            // found content-length header and this is not a 206 Partial Content response (range response)
            $size = (int)$content;
            return 0;
        } else {
            // continue
            return $length;
        }
    });

    curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) use ($in_headers) {
        if (!$in_headers) {
            // shouldn't be here unless we couldn't determine file size
            // abort transfer
            return 0;
        }

        // write function is also called when reading headers
        return strlen($data);
    });

    $result = curl_exec($ch);
    $info   = curl_getinfo($ch);

    return $size;
}

การใช้งาน:

$size = getRemoteFileSize('http://example.com/video.mp4');
if ($size === null) {
    echo "Could not determine file size from headers.";
} else {
    echo "File size is {$size} bytes.";
}

1
คำตอบของคุณช่วยฉันได้จริงๆ ส่งกลับคำตอบเสมอ แม้ว่าContent-Lengthจะไม่สามารถใช้ได้
Iman Hejazi

สวัสดีขอบคุณสำหรับการค้นหาและแสดงความคิดเห็น ฉันดีใจมากที่คุณพบว่ามีประโยชน์!
drew010

1

คำตอบส่วนใหญ่ที่นี่ใช้ CURL หรือขึ้นอยู่กับส่วนหัวของการอ่าน แต่ในบางสถานการณ์คุณสามารถใช้วิธีแก้ปัญหาที่ง่ายกว่านี้ได้ พิจารณาบันทึกในfilesize()เอกสาร 'บน PHP.net คุณจะพบคำแนะนำว่า: " ตั้งแต่ PHP 5.0.0 ฟังก์ชันนี้ยังสามารถใช้กับเครื่องห่อ URL บางประเภทได้โปรดดูโปรโตคอลและ Wrappers ที่รองรับเพื่อพิจารณาว่า Wrapper ใดที่รองรับกลุ่มฟังก์ชัน stat () "

ดังนั้นหากเซิร์ฟเวอร์และตัวแยกวิเคราะห์ PHP ของคุณได้รับการกำหนดค่าอย่างถูกต้องคุณสามารถใช้filesize()ฟังก์ชันป้อน URL แบบเต็มชี้ไปที่ไฟล์ระยะไกลขนาดที่คุณต้องการได้และปล่อยให้ PHP ทำทุกอย่าง


1

ลองสิ่งนี้: ฉันใช้มันและได้ผลลัพธ์ที่ดี

    function getRemoteFilesize($url)
{
    $file_headers = @get_headers($url, 1);
    if($size =getSize($file_headers)){
return $size;
    } elseif($file_headers[0] == "HTTP/1.1 302 Found"){
        if (isset($file_headers["Location"])) {
            $url = $file_headers["Location"][0];
            if (strpos($url, "/_as/") !== false) {
                $url = substr($url, 0, strpos($url, "/_as/"));
            }
            $file_headers = @get_headers($url, 1);
            return getSize($file_headers);
        }
    }
    return false;
}

function getSize($file_headers){

    if (!$file_headers || $file_headers[0] == "HTTP/1.1 404 Not Found" || $file_headers[0] == "HTTP/1.0 404 Not Found") {
        return false;
    } elseif ($file_headers[0] == "HTTP/1.0 200 OK" || $file_headers[0] == "HTTP/1.1 200 OK") {

        $clen=(isset($file_headers['Content-Length']))?$file_headers['Content-Length']:false;
        $size = $clen;
        if($clen) {
            switch ($clen) {
                case $clen < 1024:
                    $size = $clen . ' B';
                    break;
                case $clen < 1048576:
                    $size = round($clen / 1024, 2) . ' KiB';
                    break;
                case $clen < 1073741824:
                    $size = round($clen / 1048576, 2) . ' MiB';
                    break;
                case $clen < 1099511627776:
                    $size = round($clen / 1073741824, 2) . ' GiB';
                    break;
            }
        }
        return $size;

    }
    return false;
}

ตอนนี้ทดสอบดังนี้:

echo getRemoteFilesize('http://mandasoy.com/wp-content/themes/spacious/images/plain.png').PHP_EOL;
echo getRemoteFilesize('http://bookfi.net/dl/201893/e96818').PHP_EOL;
echo getRemoteFilesize('/programming/14679268/downloading-files-as-attachment-filesize-incorrect').PHP_EOL;

ผล:

24.82 กิโลไบต์

912 กิโลไบต์

101.85 กิโลไบต์


1

เพื่อให้ครอบคลุมคำขอ HTTP / 2 ฟังก์ชันที่มีให้ที่นี่https://stackoverflow.com/a/2602624/2380767จะต้องมีการเปลี่ยนแปลงเล็กน้อย:

<?php
/**
 * Returns the size of a file without downloading it, or -1 if the file
 * size could not be determined.
 *
 * @param $url - The location of the remote file to download. Cannot
 * be null or empty.
 *
 * @return The size of the file referenced by $url, or -1 if the size
 * could not be determined.
 */
function curl_get_file_size( $url ) {
  // Assume failure.
  $result = -1;

  $curl = curl_init( $url );

  // Issue a HEAD request and follow any redirects.
  curl_setopt( $curl, CURLOPT_NOBODY, true );
  curl_setopt( $curl, CURLOPT_HEADER, true );
  curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
  curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $curl, CURLOPT_USERAGENT, get_user_agent_string() );

  $data = curl_exec( $curl );
  curl_close( $curl );

  if( $data ) {
    $content_length = "unknown";
    $status = "unknown";

    if( preg_match( "/^HTTP\/1\.[01] (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    } elseif( preg_match( "/^HTTP\/2 (\d\d\d)/", $data, $matches ) ) {
      $status = (int)$matches[1];
    }

    if( preg_match( "/Content-Length: (\d+)/", $data, $matches ) ) {
      $content_length = (int)$matches[1];
    } elseif( preg_match( "/content-length: (\d+)/", $data, $matches ) ) {
        $content_length = (int)$matches[1];
    }

    // http://en.wikipedia.org/wiki/List_of_HTTP_status_codes
    if( $status == 200 || ($status > 300 && $status <= 308) ) {
      $result = $content_length;
    }
  }

  return $result;
}
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.