Открытие файлов через FTP или HTTP
C помощью функции fopen()
можно открывать для чтения или записи не только локальные файлы, но и удаленные; при этом используются протоколы FTP (протокол передачи файлов) и HTTP (протокол передачи гипертекста). Данную возможность можно запретить, отключив директиву allow_url_fopen
в файле php.ini
. Если возникают проблемы при открытии удаленных файлов с помощью fopen()
, просмотрите существующий файл php.ini
.
Если используемое имя файла начинается с ftp://, открывается FTP-соединение в пассивном режиме с указанным вами сервером и возвращается указатель на начало файла.
Если используемое имя файла начинается с http://, открывается HTTP-соединение с указанным вами сервером и возвращается указатель на ответ от сервера. В случае применения режима HTTP в старых версиях РНР обязательно следует указывать завершающие символы косой черты в именах каталогов, как показано далее:
https://sevidi.ru/
но не
https://sevidi.ru
При указании второй формы адреса (без завершающей косой черты), веб-сервер обычно использует HTTP-перенаправление, чтобы направить вас по первому адресу с косой чертой.
В версиях РНР, предшествующих 4.0.5, функция fopen()
не поддерживает HTTP-перенаправление, поэтому необходимо указывать URl-адреса (унифицированный указатель информационного ресурса), которые ссылаются на каталоги с завершающими символами косой черты.
Как и в версиях РНР 4.3.0, вы можете открывать файлы, пользуясь прототоколом SSL (протокол защищенных сокетов), после того, как скомпилируете пакет OpenSSl, активизируете его поддержку и будите начинать имена файлов с https://.
Помните, что имена доменов в URL-адресах нечувствительны к регистру, с то время как пути и имена файлов могут зависеть от регистра.
Проблемы, возникающие при открытии файлов
Типичная ошибка, которую вы можете совершить при открытии файла — это отсутствие разрешения на чтение этого файла или на запись в него. Как правило данная ошибка возникает в UNIX-подобных операционных системах, хотя иногда с ней можно столкнуться и в Windows. В таком случае РНР выводит соответствующее предупреждение.
В случае получения сообщения об ошибке необходимо убедиться, имеет ли пользователь, от имени которого выполняется сценарий, право доступа к файлу, которым вы пытаетесь воспользоваться. В зависимости от настройки сервера сценарий может выполняться либо от имени пользователя веб-сервера, либо от имени владельце каталога, в котором храниться сценарий.
В большинстве систем сценарий выполняется под именем пользователя веб-сервера. Если сценарий находится в каталоге, например, ~phpstroy/test/
системы UNIX, вы могли бы создать общедоступный для записи каталог для хранения в нем заказов, набрав следующие команды:
mkdir ~/orders
chmod 777 ~ /orders
Имейте в виду, что каталоги, в которых любой пользователь может записать все, что угодно, несут в себе потенциальную опастность. У вас не должно быть каталогов, которые доступны для записи непосредственно из веб среды. Именно по этой причине наш каталог orders
размещается на два подкаталога выше каталога phpstroy
.
Некорректные настройки прав доступа, по -видимому, представляют собой наиболее часто встречающуюся ошибку во время открытия файла, однако она далеко не единственная. Если файл не может быть открыт, то вы должны об этом знать, чтобы не предпринимать дальнейших попыток считывать из него или записывать в него данные.
Если вызов функции fopen()
завершается неудачей, она возвращает значение false
. Обработку ошибок можно сделать более удобной для пользователя, для чего потребуется подавить сообщение об ошибке и вывести собственное, более осмысленное сообщение:
@ = fopen ('/storage/home/srv18790/htdocs/../orders/orders.txt', 'ab');
if (!)
{
echo '<p><strong>В настоящий момент ваш запрос не может быть обработан. '
.'Пожалуйста, попытайтесь позже. </strong></p></body></html>';
exit;
}
Символ @
перед обращением функции fopen()
указывает РНР на необходимость подавления любых сообщений об ошибках, генерируемых по результатам вызова функции. Всегда полезно знать, по какой причине что-то выполняется неправильно, но в рассматриваемом случае мы с этой проблемой будем разбираться в другом месте.
Первую строку можно записать и в следующем виде:
$fp = @ fopen ("$DOCUMENT_ROOT/../orders/orders.txt", 'ab');
Такая форма записи делает ее менее понятной, к тому же затрудняется отладка кода.
Описанный метод представляет собой простейший метод обработки ошибок.
Оператор if
проверяет переменную $fp
с целью выяснения, возвратила ли функция fopen()
допустимый указатель файла; если это не так, выводится сообщение об ошибке, после чего выполнение сценария завершается. Поскольку здесь завершается и страница, обратите внимание на завершающие HTML-дескрипторы, обеспечивающие получение правильного HTML-кода.
Добавьте код выводящий сообщение об ошибках в конец файла processorder.php
.
Откройте страницу с HTML-формой заказа, заполните ее и нажмите кнопку Отправить Заказ.
Комментарии(0)
Для добавления комментариев надо войти в систему и авторизоватьсяКомментирование статей доступно только для зарегистрированных пользователей:Зарегистрироваться