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

С помощью функции fopen () можно открывать для чтения или записи не только локальные файлы, но и удаленные; при этом используются протоколы FTP (File Transfer Protocol — протокол передачи файлов) и HTTP (Hypertext Transfer Protocol — протокол передачи гипертекста). Данную возможность можно запретить, отключив директиву allow url fopen в файле php.ini. Если возникают проблемы при открытии удаленных файлов с помощью fopen (), просмотрите существующий файл php. ini.

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

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

http://www.example.соm/

но не

http://www.example.соm

При указании второй формы адреса (без завершающей косой черты) веб-сервер обычно использует HTTP-перенаправление, чтобы направить вас по первому адресу (с косой чертой). Проверьте это в своем браузере.

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

Возможные проблемы при открытии файлов

Типичная ошибка, которую вы можете совершить при открытии файла, — это отсутствие разрешения на чтение этого файла или на запись в него. (Как правило, данная ошибка возникает в средах Unix-подобных операционных систем, хотя иногда с ней можно столкнуться и в Windows-средах.) В таком случае РНР выводит соответствующее предупреждение, подобное показанному на рис. 2.2.Открытие файлов через FTP или HTTP

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

В большинстве систем сценарий выполняется под именем пользователя веб-сервера. Если сценарий находится в каталоге системы UNIX, например, ~/public_html/chapter02/, то можно создать общедоступный для записи каталог для хранения в нем заказов, набрав следующие команды:

mkdir ~/orders
chmod 777 ~/orders

Имейте в виду, что каталоги, в которых любой пользователь может записать все, что угодно, несут в себе потенциальную опасность. У вас не должно быть каталогов, которые доступны для записи непосредственно из среды Интернет. Именно по этой причине наш каталог orders размещается на два подкаталога выше каталога public html.

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

Если вызов функции fopen () завершается неудачей, она возвращает значение false.

Обработку ошибок можно сделать более удобной для пользователя, для чего потребуется подавить сообщение об ошибке от РНР и вывести собственное, более осмысленное сообщение:

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

if (!$fp) {

echo "<p><strong>B настоящий момент ваш запрос не может быть обработан. ".

"Пожалуйста, попытайтесь позже.</strong></p></body></html>";

exit;

}

Символ @ перед обращением к функции fopen () указывает РНР на необходимость подавления любых сообщений об ошибках, генерируемых по результатам вызова функции. Всегда полезно знать, по какой причине что-то выполняется неправильно, но в рассматриваемом случае мы с этой проблемой будем разбираться в другом месте.

Первую строку можно записать и в следующем виде:

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

Однако такая форма записи делает ее менее понятной, к тому же затрудняется отладка кода.

Оператор if проверяет переменную $fp с целью выяснения, возвратила ли функция fopen () допустимый указатель файла; если это не так, выводится сообщение об ошибке, после чего выполнение сценария завершается. Поскольку здесь завершается и страница, обратите внимание на закрывающие HTML-дескрипторы, обеспечивающие получение правильного HTML-кода.

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

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