Открытие файла

Для открытия файла в РНР служит функция fopen (). При этом необходимо указать, как файл будет использоваться. Этот способ использования носит название режима файла (file mode).

Режимы файлов

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

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

1. Файл можно открыть только для чтения, только для записи или для чтения и записи.

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

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

Функция fopen () поддерживает любые комбинации трех упомянутых вариантов.

Использование функции fopen () для открытия файла

Предположим, что требуется сохранить заказ клиента в файле заказов компании “Автозапчасти от Вована”. Этот файл можно открыть для записи с помощью следующего оператора:

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'w');

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

Первым параметром должен быть файл, который нужно открыть. При этом можно указать путь к файлу, как было сделано в приведенной выше строке кода — файл orders.txt находится в каталоге orders,. Мы использовали встроенную РНР-переменную $_SERVER [ ' DOCUMENT ROOT' ], но поскольку полные имена переменных слишком громоздкие, ей было присвоено короткое имя.

Эта переменная указывает на корень дерева документов вашего веб-сервера. Кроме того, с помощью символа . . обозначен “родительский каталог корневого каталога документов”. В целях безопасности этот каталог находится вне дерева документов. Мы не хотим, чтобы этот файл был доступен в Интернете, кроме как только через предоставляемый нами интерфейс. Этот путь называется относительным, поскольку он описывает позицию в файловой системе относительно корня дерева документов.

Как и в случае коротких имен для переменных формы, в начале сценария должна находиться следующая строка:

$DOCUMENT_ROOT = $_SERVER['DOCUMENT_ROOT'];

которая скопирует содержимое переменной длинного стиля в переменную короткого стиля.

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

$_SERVER['DOCUMENT_ROOT']

$ DOCUMENT_ROOT

$HTTP_SERVER_VARS['DOCUMENT_ROOT']

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

Вы можете также задать абсолютный путь к файлу. Этот путь ведет от корневого каталога ( / в системе UNIX и, как правило, С:\ в системе Windows). На используемом нами сервере на базе UNIX таким путем будет что-то вроде /home/book/orders. Проблема, связанная с подобным представлением пути, особенно если вы размещаете собственный сайт на чужом сервере, заключается в том, что абсолютный путь может меняться. Мы однажды убедились в этом на собственном горьком опыте после того, как пришлось изменять абсолютные пути во множестве сценариев, когда системные администраторы приняли “безобидное” решение без предупреждения изменить структуру каталогов.

Если путь не указан, система создаст файл или будет его искать в том же каталоге, в котором находится сам сценарий. Действия системы будут иными, если среда РНР функционирует в рамках той или иной оболочки CGI (Common Gateway Interface — общий шлюзовой интерфейс) и зависит от конфигурации сервера.

В среде UNIX в качестве разделителя каталогов используется прямой слеш (/). На Windows-платформах можно применять как прямой, так и обратный слеш (\). Если вы используете обратный слеш, то его следует литерализовать (пометить как специальный символ), чтобы функция fopen смогла правильно его интерпретировать. Для этого перед ним достаточно просто поместить еще один обратный слеш, например, так:

$fp = fopen("$DOCUMENT_ROOT\\..\\orders\\orders.txt", 'w');

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

Второй параметр функции fopen () — это режим файла, который должен иметь строковый тип. Передаваемая функции строка указывает, что вы намерены делать с файлом. В данном случае в функцию fopen () передается параметр 'w', что означает открытие файла для записи. Режимы файла перечислены в табл. 2.1.

Режимы файлов

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

$fp = fopen("$DOCUMENT_ROOT/../orders/orders.txt", 'ab');

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

$fp = fopen("orders.txt", 'ab', true);

Четвертый параметр функции fopen () также необязательный. Функция fopen () позволяет предварять имена файлов наименованием протокола (таким как http://) и открывать их в удаленных местоположениях. Некоторые протоколы допускают дополнительный параметр. Примеры такого применения функции fopen () рассматриваются далее.

Когда функции fopen () успешно открывает файл, она возвращает дескриптор или указатель на файл и сохраняет его в специальной переменной, в данном случае $fp. Эта переменная впоследствии используется для доступа к файлу, когда необходимо выполнить чтение или запись.