Как проверить существование файла на PHP?
Бывают случаи, когда вам необходимо проверить, существует ли указанный файл или нет, например, для того чтобы в последующем совершить с файлом какие-то действия.
Я тоже при разработке модуля столкнулся с этим вопросом. И нашел два варианта решения поставленной задачи.
Проверка существования файла по URL-ссылке
В PHP существует функция «fopen», с помощью которой можно открыть указанный URL.
Что мы делаем? Пытаемся открыть файл, и если нам это удается, значит, файл существует, а противном же случае – файла нет.
Реализация:
<?php
$file = "https://www.pandoge.com/logo.png"; // Ссылка на файл
if(@fopen($file, "r")) {
echo "Файл существует!";
} else {
echo "Файл отсутствует!";
}
?>
А что, если мы имеем не один файл, а несколько, так сказать, массив ссылок? Эта задача как раз и стояла изначально передо мной. И решение уже такой задачи следующее:
<?php
$images_all = [
"https://www.pandoge.com/logo.png",
"https://www.pandoge.com/logo_1.png",
"https://www.pandoge.com/logo_2.png",
"https://www.pandoge.com/logo_3.png",
"https://www.pandoge.com/logo_4.png",
"https://www.pandoge.com/logo_5.png"
]; // Исходный массив ссылок
foreach($images_all as $image) {
if(@fopen($image, "r")) {
echo $image;
}
}
?>
В этом случае мы получаем список только тех файлов, которые существуют.
Проверка существования локального файла
Под словом «локальный» подразумевается, что скрипт и файлы для проверки находятся на одном сервере. Если у вас довольно большой массив ссылок – этот вариант самый лучший для решения задачи, так как мы делаем не запрос на сторонний сервер, а сканирование указанных директорий.
В этом способе используется функция «file_exists», и по аналогии с предыдущим вариантом просто заменяется часть скрипта:
<?php
$file = "/logo.png"; // Ссылка на файл
if(file_exists($file)) {
echo "Файл существует!";
} else {
echo "Файл отсутствует!";
}
?>
И то же самое для массива ссылок:
<?php
$images_all = [
"/logo.png",
"/logo_1.png",
"/logo_2.png",
"/logo_3.png",
"/logo_4.png",
"/logo_5.png"
]; // Исходный массив ссылок
foreach($images_all as $image) {
if(file_exists($image)) {
echo $image;
}
}
?>
На что стоит обратить внимание? На то, что этот способ удобен для прогонки файлов, находящихся в пределах нашей файловой системы. Поэтому все ссылки желательно указывать относительные.
Кстати говоря, делая один из заказов, именно этим способом мне удалось просканировать порядка 135 000 файлов всего за пару секунд.