file_exists — Проверяет наличие указанного файла или каталога | Руководство по PHP
(PHP 4, PHP 5, PHP 7)
file_exists — Проверяет наличие указанного файла или каталога
Описание
bool file_exists
( string $filename
)
Список параметров
-
filename
-
Путь к файлу или каталогу.
На платформах Windows, для проверки наличия файлов на сетевых ресурсах, используйте имена, подобные //computername/share/filename или \\computername\share\filename.
Возвращаемые значения
Возвращает TRUE
, если файл или каталог, указанный параметром
filename
, существует, иначе возвращает
FALSE
.
Замечание:
Данная функция возвращает
FALSE
для символических ссылок, указывающих на несуществующие файлы.
Замечание: Проверка происходит с помощью реальных UID/GID, а не эффективных идентификаторов.
Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.
Примеры
Пример #1 Проверка существования файла
<?php
$filename = '/path/to/foo.txt';if (
file_exists($filename)) {
echo "Файл $filename существует";
} else {
echo "Файл $filename не существует";
}
?>
Ошибки
В случае неудачного завершения работы генерируется ошибка уровня E_WARNING
.
Примечания
Замечание: Результаты этой функции кэшируются. Более подробную информацию смотрите в разделе clearstatcache().
Смотрите также
- is_readable() — Определяет существование файла и доступен ли он для чтения
- is_writable() — Определяет, доступен ли файл для записи
- is_file() — Определяет, является ли файл обычным файлом
- file() — Читает содержимое файла и помещает его в массив
Вернуться к: Файловая система
PHP: function_exists — Manual
(PHP 4, PHP 5, PHP 7)
function_exists — Возвращает TRUE
, если указанная функция определена
Описание
function_exists
( string $function_name
) : bool
Проверяет, есть ли в списке определённых функций, как встроенных (внутренних), так и
пользовательских, функция
.
Список параметров
-
function_name
-
Имя функции в виде строки.
Возвращаемые значения
Возвращает TRUE
, если function_name
существует и
является функцией, иначе возвращается FALSE
.
Замечание:
Эта функция возвращает
FALSE
для языковых конструкций, таких как include_once или echo.
Примеры
Пример #1 Пример использования function_exists()
<?php
if (function_exists('imap_open')) {
echo "Функции IMAP доступны.<br />\n";
echo "Функции IMAP недоступны.<br />\n";
}
?>
Примечания
Замечание:
Обратите внимание, что название функции может присутствовать, даже если саму функцию невозможно использовать из-за настроек конфигурации или опций компиляции (например, как для функций image).
Смотрите также
- method_exists() — Проверяет, существует ли метод в данном классе
- is_callable() — Проверяет, может ли значение переменной быть вызвано в качестве функции
- get_defined_functions() — Возвращает массив всех определённых функций
- class_exists() — Проверяет, был ли объявлен класс
- extension_loaded() — Определить, загружено ли расширение
Как проверить существование файла на 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 файлов всего за пару секунд.
function_exists — Возвращает TRUE, если указанная функция определена | Руководство по PHP
(PHP 4, PHP 5, PHP 7)
function_exists — Возвращает TRUE
, если указанная функция определена
Описание
bool function_exists
( string $function_name
)
Список параметров
-
function_name
-
Имя функции, строка.
Возвращаемые значения
Возвращает TRUE
, если function_name
существует и
является функцией, иначе возвращается FALSE
.
Замечание:
Эта функция возвращает
FALSE
для языковых конструкций, таких как include_once или echo.
Примеры
Пример #1 Пример использования function_exists()
<?php
if (function_exists('imap_open')) {
echo "IMAP функции доступны.<br />\n";
} else {
echo "IMAP функции недоступны.<br />\n";
}
?>
Примечания
Замечание:
Обратите внимание, что название функции может присутствовать, даже если саму функцию невозможно использовать из-за настроек конфигурации или опций компиляции (например, как для функций image).
Смотрите также
- method_exists() — Проверяет, существует ли метод в данном классе
- is_callable() — Проверяет, может ли значение переменной быть вызвано в качестве функции
- get_defined_functions() — Возвращает массив всех определённых функций
- class_exists() — Проверяет, был ли объявлен класс
- extension_loaded() — Определение, загружено ли расширение
Вернуться к: Управление функциями
array_key_exists ищет быстрее чем in_array в 500 раз / Хабр
C тех пор вышло много версий PHP и не исправили значит обратная связь плохая и об этом мало кто знает. На питоне так же, и в 3* хуже чем в 2.7.
Простой тест показывает:
in_array ищет за 6-9 сек ideone.com/Yb1mDa 6600ms
а array_key_exists ищет тоже самое, но быстрее в 250(php5.6/py3.*) в 400+ раз (php7.3/py2.7) ideone.com/gwSmFc (цикл увеличен в 100 раз) 12ms (6600/12=550раз +-10% разброс из-за нагрузки и кеша)
Почему же такое происходит? Рассмотрим подробно:
1) Поиск строк на чистом ассемблере/си это сортировка массива строк (быстрая или пузырьковая), затем бинарный поиск.
Число шагов в бинарном поиске log(n) раз и зависит от размера массива, и намного меньше чем простой перебор.
Отсортировать массив строк можно заранее, один раз и закешировать, а потом делать миллиард поисков. Но это не помогает.
По умолчанию сортировка происходит каждый раз снова, хотя писали что улучшили в 7.2 in_array через хеш, но немного.
2) Поиск индекса/key(как строки) в ассоц. массиве/словаре происходит по хешу строк и обработкой коллизий.(ошибок поиска по хешу). Хеш это числовой индекс массива и выборка из него как (адрес нулевого элемента) + смещение * размер указателя на массив строк с этим хешем) в 2 шага. +перебор коллизий, шагов в среднем меньше бинарного поиска.
Хеш индекса делается автоматически заранее один раз при создании элемента словаря $m[key]=val и кешируется.
Размер хеша, алгоритм хеширования зашит в движок пхп и его не поменять, хотя исходники открыты- можно скачать изменить и скомпилировать если сервер свой.
Дальше можно не читать, меняйте in_array на array_combine + array_key_exists и всё.
Число шагов при поиске по хешу зависит от количества коллизий и кол-ва строк с одинаковым хешем. Их нужно перебирать или также сортировать и бинарный поиск.
Для уменьшения коллизий можно выделить больше памяти, если возможно, что сейчас не такая проблема, как 50 лет назад когда 1 кб памяти на магн.катушках стоил как самолет. А именно тогда были придуманы все основные алгоритмы: sort/zip/gif/jpg/итд — им не надо много памяти, но они плохие, сейчас есть намного лучше, но им надо много памяти 1-16 Мб. Да, есть серверы с 256 Мб и на каждого отдельный поток и 16 Мб уже много, но на девайсе среднего юзера 1 Гб как минимум и 16 Мб это капля в море.
Еще больший эффект можно получить если заменить вызов функции array_key_exists на конструкцию isset($m[key]), она не чистит очередь команд и кеш, не использует стек и быстрее где-то на 20%.
Так же можно еще ускорить если создать массив 2х первых букв- 4*16кб и искать сначала по смещению (индекс=код 1го символа + 2го*256) указатель на массив хешей для остальной части строки, затем ищем уже среди маленького массива «хвостов» строк и коллизий на порядок меньше.
Это требует еще больше памяти и алгоритм сложнее, но поиск быстрее в 30+ раз. Но в пхп это не реализовано, можно написать свою библиотеку so/dll и вызывать, или попросить разработчиков добавить в 7.5.
Можно искать через mySQL, но надо группировать запросы и это будет все равно медленней.
P.S.: Этот способ нашел случайно методом тыка, интуиции и опыта когда ускорял один большой медленный сайт, таких тонкостей и приемов очень много, удалось добиться выгрузки данных в ексель с 40 сек до 0,8 сек, вывод списков с сортировкой и фильтрами и многих других вещей где стандартные приемы, либы и фреймворки делают это все слишком медленно, хотя конечно они удобны и разработку ускоряют.
Проверить, существует ли файл в PHP
- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Как я могу проверить, существует ли URL-адрес через PHP?
- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…
- Авторизоваться зарегистрироваться
-
текущее сообщество
- Переполнение стека Помогите болтать
- Переполнение мета-стека
— php: проверить, существует ли путь?
- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
php — проверьте, существует ли включение (или требование)
- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
Загрузка…