Тарифы Услуги Сим-карты

Как записать в файл. Работа с файлами на php: открытие, запись, чтение

А сейчас будет достаточно большой, но не сложный урок о работе с файлами в php. Для начала, для чего нужны файлы? Ведь можно все хранить в базе данных MySQL или PostgreSQL или любой другой. Но иногда бывают такие задачи, когда использование БД, со всеми обработками и заботой о безопасности соединения, не целесообразно. Например нужно сделать обычный счетчик, а до этого в проекте у нас БД не использовалась. Так что нам, ради одного малюсенького счетчика заводить базу данных и хранить в ней всего пару строк? тут гораздо проще воспользоваться файлами. К тому же, иногда на хостинге вообще нет поддержки баз данных, тогда файлы вообще остаются единственным выходом.

Ну, допустим я вас убедил, что файлы необходимы:) Теперь давайте разбираться, как же с ними работать. Как создавать, открывать, записывать, перезаписывать, читать и так далее. Обо всем по порядку.

Создаем файл

В PHP для открытия файлов используется функция fopen. Тем не менее, она также может и создавать файлы. Если передать fopen имя файла, которого не существует, то она создаст его.

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

Если нужно создать файл, то указываем его имя и передаем параметр, что мы хотим записать в него данные. Обратите внимание: Мы должны обязательно сказать PHP, что мы пишем в файл, в противном случае она не будет создавать новый файл.
Пример:

$ourFileName = "testFile.txt"; $ourFileHandle = fopen($ourFileName, "w") or die("can"t open file"); fclose($ourFileHandle);

Первая строчка $ourFileName = testFile.txt создает , в которой мы будем хранить имя файла.
Вторая строчка $ourFileHandle = fopen($ourFileName, ‘w’) or die(«can’t open file») соответственно создает или открывает уже существующий файл на запись. Или же возвращает сообщение, что не может открыть файл.
Третья строчка fclose($ourFileHandle) закрывает файл. На самом деле все просто.

Параметры открытия файла в php

  • Первый параметр ‘r’ (read) — открывает файл только на чтение, записывать в него будет нельзя.
  • Второй параметр ‘w’ (write) — открывает для записи. При этом всегда запись будет идти с начала файла. Если там уже есть какая то информация — то она будет перезаписана.
  • Третий параметр ‘a’ (append) — открывает файл на запись, но при этом будет дописывать в конец файла, в отличие от w.

Расширенные параметры:

  • Параметр ‘r+’ — открывает и на чтение и на запись. Указатель будет в начале файла.
  • Параметр ‘w+’ — открывает и на чтение и на запись, НО удаляет всю информацию, которая была в файле!!!
  • араметр ‘a+’ — открывает на чтение и запись, но указатель будет в конце файла.

Естественно, что функции можно передать только один из этих параметров, а не несколько. Их нужно подставлять вместо ‘X’:

Fopen($ourFileName, "X")

Запись в файл

Ну, вот мы открыли файл, подобрали нужный нам параметр, что же дальше? Нужно в него что-то записать. Как это сделать? С помощью функции fwrite, которая принимает в качестве параметров указатель на файл и строку текста, которую хотим записать. Пример:

$myFile = "testFile.txt"; $fh = fopen($myFile, "w") or die("can"t open file"); $stringData = "Первая строчка\n"; fwrite($fh, $stringData); $stringData = "Вторая строчка\n"; fwrite($fh, $stringData); fclose($fh);

Создали файл testFile.txt, указатель на него хранится в переменной $fn. Записали в него строчку «Первая строчка» (в конце применили символ конца строки \n), а затем и «Вторая строчка». После чего закрыли файл.

ВНИМАНИЕ! Никогда не забывайте закрывать ваши файлы! Иначе в случае аварийного завершения выполнения скрипта — данные в файлах не сохранятся! Всегда после работы используйте fclose!!!

Чтение из файла

Записать записали, теперь давайте прочитаем! Это тоже не так сложно. Используем функцию fread. На вход ей подаем указатель на файл и количество байт, которое хотим прочитать. Например, один символ равен одному байту (зависит от кодировки), мы хотим прочитать 5 символов: $theData = fread($fh, 5).
Но если нужно получить всю информацию, которая есть в файле, то тут нам понадобится функция filesize, которая возвращает количество байт в файле, следовательно, если результат функции filesize передать в fread, то мы получим полностью всю информацию из файла:

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fread($fh, filesize($myFile)); fclose($fh); echo $theData;

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

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fgets($fh); fclose($fh); echo $theData;

В результате получим первую строчку из файла testFile.txt. Соответственно, чтобы пройтись по всем строчкам нужно использовать :

\n"; ?>

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

Об использовании функций fopen, fclose, feof, fgets, fgetss, и fscanf

Давайте перечислим все возможности

Одним из преимуществ работы с современными языками программирования, такими как PHP, является количество доступных возможностей. PHP легко мог бы присвоить девиз языка Perl, "Существует несколько способов сделать что-либо", особенно, когда речь идет об обработке файлов. Но при изобилии доступных средств, возникает вопрос, какое из них лучше для выполнения работы. Конечно, в действительности, ответ на этот вопрос зависит от того, какие цели вы ставите при обработке файла, поэтому изучение всех возможностей языка стоит потраченного времени.

Традиционные методы fopen

Методы fopen , возможно, лучше других знакомы программистам C и C++ былых времен, поскольку в большей или меньшей степени являются именно теми инструментами, которые на протяжении долгих лет были всегда у вас под рукой, если вы работали с этими языками программирования. Для любого из этих методов вы выполняете стандартную процедуру, используя fopen для открытия файла, функцию для чтения данных, а затем fclose для закрытия файла, как показано в Листинге 1.

Листинг 1. Открытие и чтение файла с помощью fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { $line = fgets($file_handle); echo $line; } fclose($file_handle);

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

  1. Открываете файл. $file_handle хранит ссылку на сам файл.
  2. Проверяете, не достигли ли вы конца файла.
  3. Продолжаете считывание файла, пока не достигнете конца, печатая каждую строку, которую читаете.
  4. Закрываете файл.

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

Функция fopen

Функция fopen устанавливает связь с файлом. Я говорю "устанавливает связь, " поскольку, кроме открытия файла, fopen может открыть и URL:

$fh = fopen("http://127.0.0.1/", "r");

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

Примечание: Параметр "r" , использованный в fopen , указывает на то, что файл открыт только для чтения. Поскольку запись в файл не входит в круг вопросов, рассматриваемых в данной статье, я не стану перечислять все возможные значения параметра. Тем не менее, вам необходимо изменить "r" на "rb" если вы производите чтение из двоичных файлов для межплатформенной совместимости. Ниже будет приведен пример данного типа.

Функция feof

Команда feof определяет, произведено ли чтение до конца файла, и возвращает значение True (Истина) или False (Ложь). Цикл, приведенный в продолжается, пока не будет достигнут конец файла "myfile." Обратите внимание, что feof также возвращает False, если вы читаете URL и произошло превышение времени ожидания подключения, поскольку не имеется более данных для считывания.

Функция fclose

Пропустим середину Листинга 1 и перейдем в конец; fclose выполняет задачу, противоположную fopen: она закрывает подключение к файлу или URL. После выполнения данной функции вы больше не сможете выполнять чтение из файла или сокета.

Функция fgets

Возвращаясь на несколько строк назад в Листинге 1, вы попадаете в самый центр процесса обработки файлов: непосредственно чтение файла. Функция fgets - это выбранное вами "оружие" для первого примера. Она захватывает строчку данных из файла и возвращает ее как строку. Оттуда вы можете выводить данные или обрабатывать их иным образом. В примере, приведенном в Листинге 1, распечатывается весь файл целиком.

Если вы решите ограничить размер порции данных, с которой работаете, можно добавить fgets аргумент для ограничения максимальной длины строки захватываемых данных. Например, используйте следующий программный код для ограничения длины строки в 80 символов:

$string = fgets($file_handle, 81);

Вспомните "\0", указатель конца строки в C и установите длину на один символ больше, чем вам в действительности необходимо. Как видите, в приведенном выше примере используется 81, тогда как вам нужно 80 символов. Сделайте вашей привычкой добавление дополнительного символа всегда, когда вам понадобится задать ограничение длины строки для данной функции.

Функция fread

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

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

$fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

В приведенном выше примере считывается 4096 байтов (4 KB) данных. Обратите внимание, что, независимо от указанного вами значения, fread будет считывать не более 8192 байтов (8 KB).

Допуская, что файл не более 8 KB, фрагмент программы, приведенный ниже, должен считывать весь файл в одну строку.

$fh = fopen("myfile", "rb"); $data = fread($fh, filesize("myfile")); fclose($fh);

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

Функция fscanf

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

list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

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

Функция fgetss

Функция fgetss отличается от традиционных функций для работы с файлами и дает вам лучшее представление о возможностях PHP. Она работает наподобие fgets , но отбрасывает любые обнаруженные ею теги HTML или PHP, оставляя только "голый" текст. Возьмем приведенный ниже HTML-файл.

Листинг 2. Пример файла HTML
My title

If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

Пропустим его через функцию fgetss .

Листинг 3. Использование fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { echo = fgetss($file_handle); } fclose($file_handle);

Вот что вы получите в качестве выходных данных:

My title If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

Функция fpassthru

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

fpassthru($fh);

Эта функция выводит данные на печать, поэтому вам не нужно помещать их в переменную.

Нелинейная обработка файла: перемещение по файлу

Конечно, описанные выше функции позволяют вам выполнять чтение из файла лишь последовательно. Более сложные файлы могут потребовать перемещения к разным частям файла в его начале или конце. Для этого вам потребуется функция fseek .

fseek($fh, 0);

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

fseek($fh, 1024);

Начиная с PHP V4.0, доступны также несколько других опций. Например, если нужно перейти вперед на 100 байт от вашей текущей позиции, вы можете использовать следующий код:

fseek($fh, 100, SEEK_CUR);

Аналогично, переход назад на 100 байт осуществляется посредством:

fseek($fh, -100, SEEK_CUR);

Если вы хотите перейти назад в положение 100 байт до конца файла, используйте вместо этого SEEK_END .

fseek($fh, -100, SEEK_END);

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

Примечание: вы не можете использовать fseek в дескрипторах файла, ссылающихся на URL.

Захват целого файла

Теперь мы переходим к рассмотрению некоторых уникальных возможностей PHP для обработки файлов: обработка больших блоков данных в одной или двух строках. Например, как можно захватить файл и вывести все его содержимое на вашу Web-страницу? Что же, вы видели пример использования цикла с fgets . Но как сделать это проще? Процесс почти смехотворно прост при использовании fgetcontents , которая помещает весь файл в строку.

$my_file = file_get_contents("myfilename"); echo $my_file;

Хотя это и не лучший вариант, вы можете записать эту команду еще короче:

echo file_get_contents("myfilename");

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

echo file_get_contents("http://127.0.0.1/");

Это команда фактически та же, что и:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

Должно быть, вы смотрите на эти примеры и думаете, "Это все-таки слишком трудоемкий способ". PHP-разработчики согласны с вами. Поэтому вы можете сократить приведенную выше команду до:

readfile("http://127.0.0.1/");

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

@readfile("http://127.0.0.1/");

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

$array = split("\n", file_get_contents("myfile"));

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

$array = file("myfile");

Следует заметить, что между двумя приведенными выше примерами есть небольшое отличие. Команда split удаляет знаки перехода на новую строку, тогда как при использовании команды file строки массива оканчиваются знаками перехода на новую строку (также, как и при использовании fgets).

Возможности PHP, тем не менее, далеко превосходят описанные выше. Вы можете разбить целые.ini-файлы в стиле PHP всего одной командой parse_ini_file . Команда parse_ini_file применима к файлам, сходным с приведенным в Листинге 4.

Листинг 4. Пример файла.ini
; Comment name = "King Arthur" quest = To seek the holy grail favorite color = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Следующие команды представляют файл в виде массива, а затем выводят этот массив на печать:

$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

В результате будут получены следующие выходные данные:

Листинг 5. Выходные данные
Array ( => King Arthur => To seek the Holy Grail => Blue => Mark Twain => Whoopi Goldberg)

Конечно, вы можете заметить, что данная команда объединила разделы. Это действие по умолчанию, но вы легко можете произвести необходимую настройку, воспользовавшись вторым аргументом parse_ini_file: process_sections , который является переменной логического типа (Boolean). Установите значение process_sections как True (истина).

$file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array;

И ваши выходные данные будут иметь вид:

Листинг 6. Выходные данные
Array ( => Array ( => King Arthur => To seek the Holy Grail => Blue) => Array ( => Mark Twain => Whoopi Goldberg))

PHP помещает данные в легко разбиваемый для анализа многомерный массив.

Но это лишь верхушка айсберга, если говорить об обработке файлов в PHP. Более сложные функции, например tidy_parse_file и xml_parse могут помочь вам с обработкой соответственно HTML- и XML-документов. Обратитесь к разделу , чтобы получить более подробную информацию о работе этих функций. Обе они стоят внимания, если вы будете работать с файлами указанных типов, но вместо рассмотрения всех возможных типов файлов, вы можете внимательно ознакомиться с содержанием данной статьи, где есть несколько неплохих общих правил по работе с функциями, описанными мной к настоящему моменту.

Хороший стиль программирования

Никогда не считайте, что все в вашей программе будет работать так, как было задумано. Например: что, если файл, который вы ищете, был перемещен? Что, если в результате изменения прав доступа вы не можете прочитать содержимое файла? Можно заранее проверить наличие файла и права на его чтение, воспользовавшись методами file_exists и is_readable .

Листинг 7. Использование file_exists и is_readable
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) { $fh = fopen($filename, "r"); # Processing fclose($fh); }

Тем не менее, на практике этот фрагмент программы будет, пожалуй, чрезмерным для вашей задачи. Обработка значений, возвращаемых fopen , проще и точнее.

if ($fh = fopen($filename, "r")) { # Processing fclose($fh); }

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

Как и fopen , функции file_get_contents , file и readfile возвращают значение False, если не удается открыть или обработать файл. Функции fgets , fgetss , fread , fscanf и fclose также возвращают значение False при возникновении ошибки. Конечно, за исключением fclose , вы, вероятно уже обработали возвращенные ими результаты. Что касается fclose , мало что можно сделать, если дескриптор файла не закрывается должным образом, поэтому проверка возвращенного значения функции fclose , как правило, является излишней.

Выбор за вами

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

Если вы обрабатываете большие объемы данных, вероятно, fscanf окажется более полезной и эффективной, чем, скажем, использование file в сочетании с последующими командами split и sprintf . Если же вы просто отображаете текст большого объема с незначительными изменениями, напротив, использование функций file , file_get_contents , или readfile , возможно, будет более целесообразным. Это решение, вероятно, будет верным при использовании PHP для кэширования или даже создания временного прокси сервера.

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

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

Общие замечания

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

Важным моментом в PHP является избыток функций работы с файлами и вариантов их использования. На практике достаточно применять простые, но работающие варианты. Файл - это, прежде всего, память программы. В нем можно хранить информацию. Цель любой программы, назначение любого сайта - представлять, обрабатывать и обеспечивать сохранность информации.

Существенное обстоятельство

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

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

Прочитать и изменить самого себя

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

Как и во всех остальных случаях, прежде всего файл нужно открыть. При этом не важно, существует этот файл или нет. Если известно, что файл существует (функция file_exists() дает положительный ответ), используется функция fopen() с доступом ‘r’, ‘r+’, ‘a’, ‘a+’. Если файла еще нет, то с доступом ‘a’, ‘a+’, ‘w’, ‘w+’. Результатом открытия файла будет его дескриптор. Закрывается файл функцией fclose().

Удобно использовать PHP чтение файла в массив, когда нет необходимости его обрабатывать в момент чтения.

if (file_exists($fName)) {

$aLines = file($fName)

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

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

$fvs = fopen($fName, "r")

while ((false !== ($cLine = fgets($fvs, 2000)))) {

$cLines .= "
" . $i . "). " . $cLine

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

Сохранение результатов

Полученная и обновленная информация записывается в файл функцией fputs() построчно или функцией file_put_contents() целиком.

$fName = $_SERVER["DOCUMENT_ROOT"] . "/tmp/scData.php"

$fvs = fopen($fName, "a")

flock($fvs, LOCK_EX)

$cLine = "1 line". chr(10)

fputs($fvs, $cLine)

$cLine = "2 line" . chr(10)

fputs($fvs, $cLine)

flock($fvs, LOCK_UN)

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

$file = " scData.php "

$cContents = file_get_contents($file)

// добавление записи

$cContents .= "новая запись\n"

// запись файла обратно

file_put_contents($file, $cContents)

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

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

Характерная черта PHP, MySQl, JavaScript, а особенно браузеров: тихо пускать на самотек некоторые ошибки. «Не распозналось, не сделалось …» - не слишком хорошая практика переднего края информационных технологий, но это учит разработчиков не ошибаться и писать чистый, качественный код, что тоже неплохо.

PHP и работа с реальными документами

PHP чтение PHP файла, безусловно, представляет практический интерес, но это сфера программирования. Пользователя и посетителя сайтов интересует информация прикладного характера, которую он привык видеть в виде таблиц и документов, в частности, в форматах *.xlsx и *.docx файлов. Это файлы в формате MS Excel и MS Word.

Списки товаров, цены, характеристики общепринято формировать в виде таблиц, поэтому PHP чтение Excel файла имеет существенное значение.

Для работ с такими файлами разработаны библиотеки PHPExcel и PHPWord. Однако содержимое файлов *.xlsx и *.docx представлено в стандарте OOXML, то есть реальный доступный пониманию документ представлен zip архивом. Zip архив - это множество файлов, включая картинки, объекты, формулы, вставки из других программ. Текстовые файлы здесь представлены описаниями в виде тегов. Прочитать такой файл мало, нужно его разобрать, чтобы получить содержимое и структуру для использования и изменения.

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

Excel-таблицы

include_once ‘PhpOffice/PhpExcel/IOFactory.php’

function scGetExcelFile($xls){

$objPHPExcel = PHPExcel_IOFactory::load($xls)

$objPHPExcel->setActiveSheetIndex(0)

//этот массив содержит массивы строк

$aSheet = $objPHPExcel->getActiveSheet()

$array = array()

//обработка

foreach($aSheet->getRowIterator() as $row){

$cellIterator = $row->getCellIterator()

foreach($cellIterator as $cell){

array_push($item, iconv("utf-8", "cp1251", $cell->getCalculatedValue()))

array_push($array, $item)

Чтение и обработка Excel-файлов значительно сложнее обработки документов Word. Лучший вариант, если необходимо реализовать серьезный проект для чтения и обработки прикладной информации, - сначала освоить библиотеку PHPWord. Это даст хороший опыт и быстрое вхождение в специфику вопроса.

Документы Word

Всего две строки:

$oWord = new \PhpOffice\PhpWord\PhpWord()

$oDocx = $this->oWord->loadTemplate($cFileName)

Теперь документ $cFileName доступен для обработки. Далее открывается архив, выбирается и анализируется его содержимое, которое можно отобразить на сайте, изменить и записать обратно.

$zipClass = new ZipArchive()

$zipClass->open($this->tempFileName)

// читаем все содержимое документа

for ($i=0; $i<$zipClass->numFiles; $i++) {

$cNameIn = $zipClass->getNameIndex($i)

$cNameInExt = substr($cNameIn, -4)

if (($cNameInExt == ".xml") || ($cNameInExt == "rels")) {

// файлы с расширениями ".xml" и ".xml.rels" сохраняются в таблице документа

// каждая xml-строка записывается с уникальным номером по порядку

$cBodyIn = $zipClass->getFromName($cNameIn)

$cBodyInLen = strlen($cBodyIn)

// все остальные файлы записываются в папку документа в том виде, как есть

$cNameOnly = substr($cNameIn, strrpos($cNameIn, "/") + 1)

$zipClass->getFromName($cNameIn, $cWorkPath); // содержимое в виде файла

Возможности, которые открываются при помощи PHP Excel и PHP Word, позволяют манипулировать реальными документами, делать их содержимое актуальным в каждый момент времени. В современном динамичном мире это становится очень важным. Центр тяжести уже давно перешел из локального использования компьютерной техники в виртуальное интернет-пространство. Потому создание таблиц и документов в локальных продуктах от Microsoft менее эффективно, чем работа с такими документами в автоматическом и полуавтоматическом режиме на сайте, который доступен не только создателю таблицы или документа, но и его потребителям.

Текстовые файлы, другая жизнь

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

Коль есть такая данность, как клиент и сервер (на первом властвует JavaScript, на втором - PHP), то даже механизмы cookie и sessions не справляются с необходимостью передачи информации между скриптами, страницами, теми или иными процессами.

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

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

Если подумать над тем, что текстовый файл - это содержание и структура от разработчика, PHP файл - это синтаксис интерпретатора плюс логика разработчика, а «теговые» описания html, css, xml - это более смысловые элементы, но регламентированные статичными стандартами. Можно прийти к мысли о том, что вероятно файлам уже пора приобрести новое содержание, и оно само должно определять их качество и логику применения. Именно потому, что программирование еще не готово к следующему этапу своего развития, файлы ныне остаются просто файлами, которые создает разработчик и определяет их использование.

Самое интересное и перспективное, когда PHP чтение PHP файла происходит самостоятельно, когда в этом возникает необходимость. А простое PHP чтение строки из файла приводит к созданию объекта, хотя бы в том состоянии, в котором он был сохранен. Это не совсем привычные идеи, но ведь в современном мире все так быстро меняется.

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

Чтобы создать файл на php в исполняемом скрипте надо всего лишь указать несколько функций:

Рассмотрим сразу пример:

$text = "Какой-то тут текст для записи в файл";
$fp = fopen("file.txt", "w");
fwrite($fp, $text);
fclose($fp);
?>

Тут вы должны знать :

fopen() - функция открывает файл чтения или для записи и уточнениями;

Это уточнения (параметр mode функции fopen) очень важно:

  • "r " - открыть файл в php ТОЛЬКО для чтения . Курсор помещается в начало.
  • "r+ " - открыть файл в php для чтения и для записи . Курсор помещается в начало. !!! - при этих двух режимах r и r+ файлы уже должны быть созданы(иначе вылезет ошибка Warning: fopen(file.txt) : failed to open stream: No such file or directory in ... ), а мы лишь читаем или у нас есть возможность дописывать.
  • "w " - открывается файл ТОЛЬКО для записи. Файл урезается до нулевой длины - то есть затирается. Записывается, что нужно и Курсор ставится в начало.
  • "w+ " - открывается файл для записи И ЧТЕНИЯ! Остальное то же самое что и в режиме "w". !!! - при этих двух режимах - если файл не был создан - ПРЕДПРИМЕТСЯ ПОПЫТКА ЕГО СОЗДАТЬ!
  • "a " - открыть файл ТОЛЬКО для записи. В отличие от "w" этот параметр не затирает содержимое файла, а ставит курсор в конец строки и добавляет в конец содержимое, которое мы хотели добавить.
  • "a+ " - открыть файл для записи и чтения.

fwrite ($fp, $text) - функция записи в файл на php - то есть то что находится в переменной $text записывается в файл, который находится в переменной $fp;

fclose ($fp) - функция закрытия файла, который мы записали в переменную $fp;

Все теперь вы спокойно можете создавать правильно файлы на php, открывать их для чтения и редактирования.

Полезные дополнения и функции PHP для работы с открытым файлом:

while(!feof($fp)){
$mytext = fgets($fp, 99);
echo $mytext."
";
}

здесь выполняется условие - "пока не достигнут конец файла то делай то то" while(!feof($fp))

1. Функция fgets ($fp, 99) - позволяет разделить все содержимое на участки в 99 байт и далее, чтобы это отчетливее увидеть мы помещаем тег

Эта функция string fgets (resource handle [, int length]) по умолчанию принимает в параметр length 1024 байта(1 килобайт), если не указать так и будет. Этот параметр необязателен с PHP 4.2.0 (В случае ошибки возвращает FALSE)

Доп функции для открытия, записи и создания файла

Функция - int readfile (string filename [, bool use_include_path [, resource context]]) - считываем файл как единое целое.

Читает файл и записывает содержимое в буфер вывода. И возвращает количество выведенных байт. В случае ошибки вернет, если не использована собачка - @readfile.

Что-то подобное получится:

В конце слова тег стоят
.

б. Функция - array file (string filename [, int use_include_path [, resource context]]), делает то же самое, что и функция readfile, за одним исключением она добавляет содержимое файла в массив:

Таким образом можно считывать любые странички в интернете: $lines = file("http://сайт/"); и перебрать массив через функцию foreach;

3а. Функция string file_get_contents (string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]]) - позволяет получить содержимое в виде одной строки.

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

Важно!!! - в этом случае функция заменяет сразу 3: fopen(), fread() и fclose() и таким образом избавляет от мароки.

3б. Функция int file_put_contents (string filename, mixed data [, int flags [, resource context]]) - идентична последовательному вызову функций fopen(), fwrite() и fclose() - возвращает количество записанных байт.

Последнее обновление: 1.11.2015

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

Чтение и запись файлов

Открытие и закрытие файлов

Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй - режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:

    "r" : файл открывается только для чтения. Если файла не существует, возвращает false

    "r+" : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false

    "w" : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

    "w+" : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет - то он создается

    "a" : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается

    "a+" : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается

Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.

После окончания работы файл надо закрыть с помощью функции fclose() , которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:

$fd = fopen("form.php", "r") or die("не удалось открыть файл"); fclose($fd);

Конструкция or die("текст ошибки") позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.

Чтение файла

Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets() , которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:

При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof() , которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().

Чтение файла полностью

При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.

Поблочное считывание

Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread() :

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

Запись файла

Для записи файла применяется функция fwrite() , которая записывает в файл строку:

Аналогично работает другая функция fputs() :

Работа с указателем файла

При открытии файла для чтения или записи в режиме "w", указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek , которая имеет следующее формальное определение:

Int fseek (resource $handle , int $offset [, int $whence = SEEK_SET ])

Параметр $handle представляет дескриптор файла. Параметр $offset - смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:

    SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла

    SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле

    SEEK_END : устанавливает смещение в offset байт от конца файла

В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.

Пример использования функции:

$fd = fopen("hello.txt", "w+") or die("не удалось открыть файл"); $str = "Привет мир!"; // строка для записи fwrite($fd, $str); // запишем строку в начало fseek($fd, 0); // поместим указатель файла в начало fwrite($fd, "Хрю"); // запишем в начало строку fseek($fd, 0, SEEK_END); // поместим указатель в конец fwrite($fd, $str); // запишем в конце еще одну строку fclose($fd);