Как проверить, является ли ссылка загружаемым файлом в php?
Я пытаюсь сделать проверку битых ссылок с php. Я изменил некоторый PHP-код, который я нашел в Интернете, я не программист PHP. Это давай в какой-то неразбитой ссылке, но это нормально. Однако у меня есть проблемы со всеми презентациями, почтовыми индексами и так далее... В основном, если он загружен, то алгоритм считает, что это неработающая ссылка.
<?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'];
}
Пример ссылки: http://lom.emokykla.lt/MO/Matematika/pazintis_su_erdviniais%20_kunais_1.doc
Любые решения, советы?
Спасибо всем за помощь. Теперь это работает намного быстрее. Кажется, есть проблема с пробелами, но это даже интригует.
Кажется, проблема была в том, как я понял, как работает http-статус, что он возвращает и почему. Ссылка, которую я пометил как плохой, но работает там, где 301 или 302 - Перенаправление. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Спасибо всем за помощь.
3 ответа
Использование 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;}
}
curlopt_nobody, установленный в TRUE, отправляет HTTP-запрос HEAD вместо GET-запроса, поэтому попробуйте использовать curl_setopt( $ch, CURLOPT_NOBODY, true );
Попробуйте использовать метод file_exists: http://php.net/manual/fr/function.file-exists.php