php file get file name

basename

(PHP 4, PHP 5, PHP 7, PHP 8)

basename — Возвращает последний компонент имени из указанного пути

Описание

При передаче строки с путём к файлу или каталогу, данная функция вернёт последний компонент имени из данного пути.

Список параметров

На платформах Windows в качестве разделителей имён директорий используются оба слеша (прямой / и обратный \ ). В других операционных системах разделителем служит прямой слеш ( / ).

Возвращаемые значения

Примеры

Пример #1 Пример использования функции basename()

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 30 notes

It’s a shame, that for a 20 years of development we don’t have mb_basename() yet!

There is only one variant that works in my case for my Russian UTF-8 letters:

If your path has a query string appended, and if the query string contains a «/» character, then the suggestions for extracting the filename offered below don’t work.

In such a case, use:

It might be useful to have a version of the function basename working with arrays too.

Here is a quick way of fetching only the filename (without extension) regardless of what suffix the file has.

// your file
$file = ‘image.jpg’ ;

There is a real problem when using this function on *nix servers, since it does not handle Windows paths (using the \ as a separator). Why would this be an issue on *nix servers? What if you need to handle file uploads from MS IE? In fact, the manual section «Handling file uploads» uses basename() in an example, but this will NOT extract the file name from a Windows path such as C:\My Documents\My Name\filename.ext. After much frustrated coding, here is how I handled it (might not be the best, but it works):

If you want the current path where youre file is and not the full path then use this 🙂

www dir: domain.com/temp/2005/january/t1.php

Exmaple for exploding 😉 the filename to an array

A simple way to return the current directory:
$cur_dir = basename(dirname($_SERVER[PHP_SELF]))

since basename always treats a path as a path to a file, e.g.

/var/www/site/foo/ indicates /var/www/site as the path to file
foo

Even though yours is shorter, you can also do:

$ext = end(explode(«.», basename($file

Additional note to Anonymous’s mb_basename() solution: get rid of trailing slashes/backslashes!

echo mb_basename ( «/etc//» ); # «etc»
?>

I got a blank output from this code

suggested earlier by a friend here.

So anybody who wants to get the current directory path can use another technique that I use as

//suppose you’re using this in pageitself.php page

once you have extracted the basename from the full path and want to separate the extension from the file name, the following function will do it efficiently:

On windows systems, filenames are case-insensitive. If you have to make sure the right case is used when you port your application to an unix system, you may use a combination of the following:

//assume the real filename is mytest.JPG:

Because of filename() gets «file.php?var=foo», i use explode in addition to basename like here:

to get the base url of my website

Basename without query string:

Источник

Php file get file name

(PHP 4, PHP 5, PHP 7, PHP 8)

file — Reads entire file into an array

Description

Reads an entire file into an array.

You can use file_get_contents() to return the contents of a file as a string.

Parameters

A URL can be used as a filename with this function if the fopen wrappers have been enabled. See fopen() for more details on how to specify the filename. See the Supported Protocols and Wrappers for links to information about what abilities the various wrappers have, notes on their usage, and information on any predefined variables they may provide.

The optional parameter flags can be one, or more, of the following constants: FILE_USE_INCLUDE_PATH Search for the file in the include_path. FILE_IGNORE_NEW_LINES Omit newline at the end of each array element FILE_SKIP_EMPTY_LINES Skip empty lines

Return Values

Each line in the resulting array will include the line ending, unless FILE_IGNORE_NEW_LINES is used.

Note: If PHP is not properly recognizing the line endings when reading files either on or created by a Macintosh computer, enabling the auto_detect_line_endings run-time configuration option may help resolve the problem.

Errors/Exceptions

Emits an E_WARNING level error if the file does not exist.

Examples

Example #1 file() example

// Get a file into an array. In this example we’ll go through HTTP to get
// the HTML source of a URL.
$lines = file ( ‘http://www.example.com/’ );

Notes

When using SSL, Microsoft IIS will violate the protocol by closing the connection without sending a close_notify indicator. PHP will report this as «SSL: Fatal Protocol Error» when you reach the end of the data. To work around this, the value of error_reporting should be lowered to a level that does not include warnings. PHP can detect buggy IIS server software when you open the stream using the https:// wrapper and will suppress the warning. When using fsockopen() to create an ssl:// socket, the developer is responsible for detecting and suppressing this warning.

See Also

User Contributed Notes 15 notes

this may be obvious, but it took me a while to figure out what I was doing wrong. So I wanted to share. I have a file on my «c:\» drive. How do I file() it?

Don’t forget the backslash is special and you have to «escape» the backslash i.e. «\\»:

= file ( «C:\\Documents and Settings\\myfile.txt» );

read from CSV data (file) into an array with named keys

. with or without 1st row = header (keys)
(see 4th parameter of function call as true / false)

?>

fuction call with 4 parameters:

?>

PS: also see: http://php.net/manual/de/function.fgetcsv.php to read CSV data into an array
. and other file-handling methods

Be aware that using file() to count lines can cause OOM on the server as it’ll allocate all lines into an array.

If you’re dealing with files that can have thousands of lines, SplFileObject might be a better idea and with little changes you can get the same result.

As of PHP 5.6 the file(), file_get_contents(), and fopen() functions will return false if you are referencing a source URL that doesn’t have a valid SSL certificate. Presumably, you will run into this a lot in your development environments this will drive you crazy.

You will need to create a stream context and provide it as an argument to the various file operations to tell it to ignore invalid SSL credentials.

$args = array(«ssl»=>array(«verify_peer»=>false,»verify_peer_name»=>false),»http»=>array(‘timeout’ => 60, ‘user_agent’ => ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/3.0.0.1’));

(«file()’s problem with UTF-16» is wrong. This is updated.
The former may miss the last line of the string.)

file() seems to have a problem in handling
UTF-16 with or without BOM.

file() is likely to think «\n»=LF (0A) as a line-ending.
So, not only «000A» but also «010A, 020A. FE0A, FF0A. «
are regarded as line-endings.

Moreover, file() causes a serious problem in UTF-16LE.
file() loses first «0A» (the first half of «0A00»)!
And the next line begins with «00» (the rest of «0A00»).
So lines after the first «0A» are totally different.

?>

instead of
$file = file($file_path);

$file_array = file(‘test.txt’); // an empty file

A user suggested using rtrim always, due to the line ending conflict with files that have an EOL that differs from the server EOL.

Using rtrim with it’s default character replacement is a bad solution though, as it removes all whitespace in addition to the ‘\r’ and ‘\n’ characters.

A good solution using rtrim follows:

Here’s my CSV converter
supports Header and trims all fields
Note: Headers must be not empty!

Note: Now that file() is binary safe it is ‘much’ slower than it used to be. If you are planning to read large files it may be worth your while using fgets() instead of file() For example:

I did a test on a 200,000 line file. It took seconds with fgets() compared to minutes with file().

This note applies to PHP 5.1.6 under Windows (although may apply to other versions).

It appears that the ‘FILE_IGNORE_NEW_LINES’ flag doesn’t remove newlines properly when reading Windows-style text files, i.e. files whose lines end in ‘\r\n’.

Solution: Always use ‘rtrim()’ in preference to ‘FILE_IGNORE_NEW_LINES’.

Источник

pathinfo

(PHP 4 >= 4.0.3, PHP 5, PHP 7, PHP 8)

pathinfo — Возвращает информацию о пути к файлу

Описание

Подробнее о получении информации о текущем пути, можно почитать в разделе Предопределённые зарезервированные переменные.

Список параметров

Если flags не указан, то возвращаются все доступные элементы.

Возвращаемые значения

Если path содержит больше одного расширения, то PATHINFO_EXTENSION возвращает только последний и PATHINFO_FILENAME удаляет только последнее расширение. (смотрите пример ниже).

Если path не содержит расширения, то не будет возвращён элемент extension (смотрите ниже второй пример).

Если basename параметра path начинается с точки, то все последующие символы интерпретируются как расширение файла ( extension ) и имя файла filename будет пустым (смотрите третий пример).

Примеры

Пример #1 Пример использования функции pathinfo()

Результат выполнения данного примера:

Результатом выполнения данного примера будет что-то подобное:

Пример #3 Пример pathinfo() для файла, начинающегося с точки

Результатом выполнения данного примера будет что-то подобное:

Смотрите также

User Contributed Notes 37 notes

// result:
// string(11) «lib.inc.php»
// string(15) «/www/htdocs/inc»
?>

pathinfo() is locale aware, so for it to parse a path containing multibyte characters correctly, the matching locale must be set using the setlocale() function.

Reality:
var_dump(pathinfo(‘中国人2016.xls’));
exit();
array(4) < 'dirname' =>string(1) «.» ‘basename’ => string(8) «2016.xls» ‘extension’ => string(3) «xls» ‘filename’ => string(4) «2016» >

Expect(Solve):
setlocale(LC_ALL, ‘zh_CN.UTF-8’);
var_dump(pathinfo(‘中国人2016.xls’));
exit();
array(4) < 'dirname' =>string(1) «.» ‘basename’ => string(17) «中国人2016.xls» ‘extension’ => string(3) «xls» ‘filename’ => string(13) «中国人2016» >

Use this function in place of pathinfo to make it work with UTF-8 encoded file names too

Here is a simple function that gets the extension of a file. Simply using PATHINFO_EXTENSION will yield incorrect results if the path contains a query string with dots in the parameter names (for eg. &x.1=2&y.1=5), so this function eliminates the query string first and subsequently runs PATHINFO_EXTENSION on the clean path/url.

Checked with version 5.5.12:

It works fine with filenames with utf-8 characters, pathinfo will strip them away:

( pathinfo ( «/mnt/files/飛兒樂團光茫.mp3» ));
?>

.. will display:

Array
(
[dirname] => /mnt/files
[basename] => 飛兒樂團光茫.mp3
[extension] => mp3
[filename] => 飛兒樂團光茫
)

Note that this function seems to just perform string operations, and will work even on a non-existent path, e.g.

( pathinfo ( ‘/no/where/file.txt’ ));
?>

which will output:
Array
(
[dirname] => /no/where
[basename] => file.txt
[extension] => txt
[filename] => file
)

if you call pathinfo with a filename in url-style (example.php?with=parameter), make sure you remove the given parameters before, otherwise they will be returned as part of the extension.

unexpected, but longtime (all versions?) consistent, behaviour with trailing slash (Linux):

with Linux I am used, to add a trailing slash,
or just to keep that of the command line completion by [TAB],
to avoid mistyping a path on cp or mv with a same filename instead of a directory

// using php tags here only for syntax highlighting

php > var_dump ( pathinfo ( ‘/home/USER/www.2021-05/’ ));
array( 4 ) <
[ «dirname» ]=> string ( 10 ) «/home/USER»
[ «basename» ]=> string ( 11 ) «www.2021-05»
[ «extension» ]=> string ( 7 ) «2021-05»
[ «filename» ]=> string ( 3 ) «www»
>

When you need to get the file extension to upload a file with a POST method, try this way:

//[‘tmp_name] gets the temporal name of the file (not the real name), which will be used later

//Here is the magic of pathinfo to get the file extension

Источник

Работа с файлами в PHP

Чтение файла: file_get_contents()

С помощью функции file_get_contents() можно получить содержимое файла:

Также мы можем получить html-код какой-либо страницы в интернете:

Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.

Чтение файла: file()

Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.

Создадим в корне сайта файл data.txt со следующим содержимым:

Теперь запустим скрипт index.php со следующим кодом:

При запуске этого скрипта мы получим в браузере:

Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.

Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :

Теперь у всех строк будет по 5 символов.

Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES :

Разумеется, мы можем передать сразу две константы:

Создание файла и запись в файл: file_put_contents()

Функция file_put_contents() позволяет создать файл и заполнить его данными.

Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :

Также вторым параметром можно передать массив:

Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:

Создание папки или структуры папок

Создать папку можно с помощью функции mkdir() (make directory):

Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :

Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :

Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:

Проверка существования файла или папки

Проверить существование папки или файла можно с помощью функции file_exists() :

Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :

Проверка прав доступа

Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:

Копирование, перенос и удаление файла

Для удаления файлов используется функция unlink() :

Чтобы скопировать файл, используем функцию copy() :

Для переименования и переноса файла в другую папку используется функция rename() :

Работа с файлами с помощью fopen()

Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.

Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :

Для построчного чтения файла используется функция fgets() :

Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.

Источник

Как прочитать большой файл средствами PHP (не грохнув при этом сервак)

PHP разработчикам не так уж часто приходится следить за расходом памяти в своих приложениях. Сам движок PHP неплохо подчищает мусор за нами, да и модель веб-сервера с контекстом исполнения, «умирающим» после выполнения каждого запроса, позволяет даже самому плохому коду не создавать больших долгих проблем.

Однако, в некоторых ситуациях, мы можем столкнуться с проблемами нехватки оперативной памяти — например, пытаясь запустить композер на маленьком VPS, или при открытии большого файла на сервере не богатом ресурсами.

e5d8ded81c6b152ac53fd5fcb5d187f9

Последняя проблема и будет рассмотрена в этом уроке.

Мерила Успеха

При проведении любых оптимизаций кода, мы всегда должны замерять результаты его выполнения до и после, для того чтобы оценивать эффективность(или пагубность) наших оптимизаций.

Обычно измеряют загрузку CPU и использование оперативной памяти. Часто бывает, что экономия одного, ведёт к увеличенным затратам другого и наоборот.

В асинхронной модели приложения(мультипроцессорные и многопоточные) всегда очень важно следить как за процессором, так и за памятью. В классических приложениях контроль ресурсов становится проблемой лишь при приближении к лимитам сервера.

Измерять использование CPU внутри PHP плохая идея. Лучше использовать какую-либо утилиту, как top из Ubuntu или macOS. Если вы у вас Windows, то можно использовать Linux Subsystem, чтобы иметь доступ к top.

В этом уроке мы будем измерять использование памяти. Мы посмотрим, как память расходуется в традиционных скриптах, а затем применим парочку фишек для оптимизации и сравним результаты. Надеюсь, к концу статьи, читатель получит базовое понимание основных принципов оптимизации расхода памяти при чтении больших объемов данных.

Будем замерять память так:

Эту функцию мы будем использовать в конце каждого скрипта, и сравнивать полученные значения.

Какие есть варианты?

Существует много разных подходов для эффективного чтения данных, но всех их условно можно разделить на две группы: мы либо считываем и сразу же обрабатываем считанную порцию данных(без предварительной загрузки всех данных в память), либо вовсе преобразуем данные в поток, не заморачиваясь над его содержимым.

Давайте представим, что для первого варианта мы хотим читать файл и отдельно обрабатывать каждые 10000 строк. Нужно будет держать по крайней мере 10000 строк в памяти и передавать их в очередь(в какой бы форме она не была реализована).

Для второго сценария, предположим, мы хотим сжать содержимое очень большого ответа API. Нам не важно, что за данные там содержатся, важно вернуть их в сжатой форме.

В обоих случаях нужно считать большие объемы информации. В первом, нам известен формат данных, во втором, формат значения не имеет. Рассмотрим оба варианта.

Чтение Файла Строка За Строкой

Есть много функций для работы с файлами. Давайте напишем с их помощью свой ридер:

Тут мы считываем файл с работами Шекспира. Размер файла около 5.5MB и пиковое использование памяти 12.8MB.

А теперь, давайте воспользуемся генератором:

Файл тот же, а пиковое использование памяти упало до 393KB! Но пока мы не выполняем со считываемыми данными никаких операций, это не имеет практической пользы. Для примера, мы можем разбивать документ на части, если встретим две пустые строки:

Хотя мы разбили документ на 1,216 кусков, мы использовали лишь 459KB памяти. Всё это, благодаря особенности генераторов — объем памяти для их работы равен размеру самой большой итерируемой части. В данном случае, самая большая часть состоит из 101,985 символов.

Генераторы могут применяться и в других ситуациях, но данный пример хорошо демонстрирует производительность при чтении больших файлов. Возможно, генераторы один из лучших вариантов для обработки данных.

Пайпинг между файлами

В ситуациях, когда обработка данных не требуется, мы можем пробрасывать данные из одного файла в другой. Это называется пайпингом( pipe — труба, возможно потому что мы не видим что происходит внутри трубы, но видим что входит и выходит и неё). Это можно сделать с помощью потоковых методов. Но сперва, давайте напишем классический скрипт, который тупо передает данные из одного файла в другой:

Неудивительно, что этот скрипт использует намного больше памяти, чем занимает копируемый файл. Это связано с тем, что он должен читать и хранить содержимое файла в памяти до тех пор пока файл не будет скопирован полностью. Для маленьких файлов в этом нет ничего страшного, но не для больших.

Давайте попробуем стримить(или пайпить) файлы, один в другой:

Код довольно странный. Мы открываем оба файла, первый на чтение, второй на запись. Затем мы копируем первый во второй, после чего закрываем оба файла. Возможно будет сюрпризом, но мы потратили всего 393KB.

Для того чтобы осуществить задуманное этим способом потребовалось 581KB. Теперь попробуем сделать то же самое с помощью потоков.

Потратили немного меньше памяти(400KB) при одинаковом результате. А если б нам не нужно было сохранять картинку в памяти, мы могли бы сразу застримить её в stdout :

Другие потоки

Существуют и другие потоки, в/из которых можно стримить:

Фильтры

Есть еще одна фишка, которую мы можем использовать — это фильтры. Промежуточный вариант, который дает нам немного контроля над потоком, без необходимости детально погружаться в его содержимое. Допустим, мы хотим сжать файл. Можно применить zip extension:

Хороший код, но он потребляет почти 11MB. С фильтрами, получится лучше:

Здесь мы используем php://filter/zlib.deflate который считывает и сжимает входящие данные. Мы можем пайпить сжатые данные в файл, или куда-нибудь еще. Этот код использовал лишь 896KB.

Я знаю что это не совсем тот же формат, что и zip архив. Но задумайтесь, если у нас есть возможность выбрать иной формат сжатия, затратив в 12 раз меньше памяти, стоит ли это делать?

Чтобы распаковать данные, применим другой zip фильтр.

Вот парочка статей, для тех кому хотелось бы поглубже погрузиться в тему потоков: “Understanding Streams in PHP” и“Using PHP Streams Effectively”.

Кастомизация потоков

fopen и file_get_contents имеют ряд предустановленных опций, но мы можем менять их как душе угодно. Чтобы сделать это, нужно создать новый контекст потока:

В этом примере мы пытаемся сделать POST запрос к API. Прописываем несколько заголовков, и обращаемся к API по файловому дескриптору. Существует много других опций для кастомизации, так что не будет лишним ознакомиться с документацией по этому вопросу.

Создание своих протоколов и фильтров

Перед тем как закончить, давайте поговорим о создании кастомных протоколов. Если посмотреть в документацию, то можно увидеть пример:

Написание своей реализации такого тянет на отдельную статью. Но если все же озадачиться и сделать это, то можно будет легко зарегистрировать свою обертку для стримов:

Аналогичным образом, можно создать и кастомные фильтры потока. Пример класса фильтра из доков:

И его также легко зарегистрировать:

Хотя это не самая частая проблема, с которой мы мучаемся, очень легко накосячить при работе с большими файлами. В асинхронных приложениях, вообще очень просто положить весь сервер, если не контролировать использование памяти в своих скриптах

Надеюсь, что этот урок подарил вам несколько новых идей(или освежил их в памяти) и теперь вы сможете работать с большими файлами гораздо эффективнее. Познакомившись с генераторами и потоками( и перестав использовать функции по типу file_get_contents ) можно избавить наши приложения от целого класса ошибок. That seems like a good thing to aim for!

Источник

Моя дача
Adblock
detector