Php exist: PHP: file_exists — Manual
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
.
Список параметров
-
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() — Определить, загружено ли расширение
Как проверить существование файла на 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 раз / Хабр
В 2014 уже писали про обыск массива, но вряд ли кто понял.
C тех пор вышло много версий PHP и не исправили значит обратная связь плохая и об этом мало кто знает. На питоне так же, и в 3* хуже чем в 2.7.
Иногда нужно найти строку в массиве строк — очень частая операция в разных алгоритмах и если массив небольшой и искать немного и не в цикле, то in_array нормально, на общую скорость не влияет, но если big data и искать надо массиве из миллиарда строк и миллиард раз, то это уже критично: лучше час вместо недели.
Простой тест показывает:
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 — проверьте, существует ли включение (или требование)
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…