如何检查 link 是否是 php 中的可下载文件?

How to check if link is downloadable file in php?

我正在尝试用 php 制作损坏的 link 检查器。 我修改了一些我在网上找到的 php 代码我不是 php 程序员。 它让我们在一些完整的 link 中,但没关系。 但是我对所有演示文稿、拉链等都有问题…… 基本上如果它被下载然后算法认为它已经死了 link.

<?php
    set_time_limit(0);
    //ini_set('memory_limit','512M');
    $servername = "localhost";
    $username   = "";
    $password   = "";

    try {
        $conn = new PDO("mysql:host=$servername;dbname=test", $username, $password);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected successfully" . "<br />";
        echo "----------------------------------------------------<br />";
    }
    catch (PDOException $e) {
        echo "Connection failed: " . $e->getMessage();
    }

    $sql    = "SELECT object,value FROM metadata where xpath = 'lom/technical/location'";
    $result = $conn->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    //print_r($result);

    $array_length = sizeof($result); //26373
    //$array_length = 26373;
    $i            = 0;

    $myfile = fopen("Lom_Link_patikra1.csv", "w") or die("Unable to open file!");
    $menu_juosta = "Objektas;Nuoroda;Klaidos kodas;\n";
    //fwrite($myfile,$menu_juosta);

    for ($i; $i < $array_length; $i++) {
        $new_id           = $result[$i]["object"];
        $sql1             = "SELECT published from objects where id ='$new_id'";
        $result_published = $conn->query($sql1)->fetchAll(PDO::FETCH_ASSOC);
        //print_r ($result_published);                 

        if ($result_published[0]["published"] != 0) {
            $var1             = $result[$i]["value"];
            $var1             = str_replace('|experience|902', '', $var1);
            $var1             = str_replace('|packed_in|897', '', $var1);
            $var1             = str_replace('|packed_in|911', '', $var1);
            $var1             = str_replace('|packed_in|895', '', $var1);
            $request_response = check_url($var1); // Puslapio atsakymas

            if ($request_response != 200) {
                $my_object = $result[$i]["object"] . ";" . $var1 . ";" . $request_response . ";\n";
                fwrite($myfile, $my_object);
            }
        }
    }
    fclose($myfile);
    $conn = null;

    function check_url($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $data    = curl_exec($ch);
        $headers = curl_getinfo($ch);
        curl_close($ch);
        return $headers['http_code'];
    }

Link 示例:http://lom.emokykla.lt/MO/Matematika/pazintis_su_erdviniais%20_kunais_1.doc

有什么解决办法、建议吗?

感谢大家 help.Now 它的运行速度更快。似乎空格有问题,但这更有趣。

看来我遇到的问题是理解 http 状态的工作原理,比如它 return 的工作原理以及原因。 Link 我标记为坏的,但在 301 或 302 - 重定向的地方工作。 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

谢谢大家的帮助。

尝试使用file_exists方法:http://php.net/manual/fr/function.file-exists.php

curlopt_nobody 设置为 TRUE 会发出 HTTP HEAD 请求而不是 GET 请求,因此请尝试使用 curl_setopt( $ch, CURLOPT_NOBODY, true );

对远程文件使用 CURL

function checkRemoteFile($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
// don't download content
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch)!==FALSE)
{
    return true;
}
else
{
    return false;
}
}

编辑:我可能误解了你,但如果你只是想检查 url 是否真的存在,下面的代码就是你所需要的。

function url_exists($url) {
if(@file_get_contents($url,0,NULL,0,1))
{return 1;}
else
{return 0;}
}