PHP Версии 3.0 - язык написания
сценариев, внедренный в HTML. Многое из
синтаксиса заимствовано из C, Java и Perl, с
добавлением специфичных для PHP
возможностей. Задача языка состоит в том,
чтобы дать возможность Web-разработчикам
легко и быстро создавать динамично
изменяемые html-страницы.
Об этом руководстве
Это руководство написано в SGML при помощи DocBook DTD, с использованием DSSSL (Стиль Документа и Язык Спецификаций Семантики) при форматировании. Инструментальные средства, используемые для форматирования HTML, TeX и RTF версий - Jade, написанный Джеймсом Кларком и The Modular DocBook Stylesheets, созданные Норманом Валшом. Структура документации PHP3 была разработана Стигом СЈзером Баккеном.
PHP версии 3.0 - язык описания сценариев, выполняемых на сервере, встроенный в HTML.
Возможно самая сильная и значимая возможность в PHP3 - уровень интеграции с базами данных. Написание веб-страницы работающей с базой данных невероятно проста. В настоящее временя поддерживаются следующие базы данных:
Oracle
Adabas D
Sybase
FilePro
mSQL
Velocis
MySQL
Informix
Solid
dBase
ODBC
Unix dbm
PostgreSQL
PHP был задуман где-то в конце 1994 года Расмусом Ледорфом(Rasmus Lerdorf). Ранние невыпущенные версии использовались на его домашней странице для того, чтобы следить за тем кто просматривал его интерактивное резюме. Первая используемая версия cтала доступна где-то в начале 1995 и была известна как Personal Home Page Tools. Она состояла из очень упрощенного движка синтаксического анализатора, который понимал только несколько специальных макрокоманд и ряд утилит, которые затем были в общем использовании на домашних страницах. Гостевые книги, счетчики и некоторые другие дополнения.
Довольно трудно дать какую-либо жесткую статистику, но отмечено, что к 1996 г. PHP/FI был использован по крайней мере на 15,000 веб-сайтах во всем мире. В середине 1997г. эта цифра выросла до более чем 50,000. В середине 1997г. также наблюдалось изменение в разработке PHP. Из частного любимого проекта Расмуса, которому способствовала горстка людей , это превратилось в намного более организованную рабочую группу. Синтаксический анализатор был заново переписан Зевом Сураски(Zeev Suraski) и Анди Гутмансом(Andi Gutmans), и этот новый синтаксический анализатор стал основой для PHP Версии 3.
Сегодня ( в середине -1998г.) как PHP/FI
так и PHP3 поставляется с рядом коммерческих
продуктов типа C2's StrongHold web server и RedHat Linux и
консервативной оценкой, основанной на
экстрaполяции чисел, предоставленных NetCraft
было бы то, что PHP используется на 150,000 cайтах
во всем мире. В перспективе, их больше чем
сайтов, запущенных на Netscape's flagship Enterprise server в
Интернете.
Содержание:
HTTP аутификация в PHP доступна только при использовании модуля Apache. В модуле Apache PHP-скрипт, может использовать функцию Header() для отправки сообщения "Authentication Required" браузеру клиента, вызвав тем самым окно диалога Username/Password. Как только пользователь заполняет поля username и password, URL содержащий PHP-скрипт будет вызван заново с переменными $PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE содержащими введенную информацию. В данном случае обеспечивается только "Основная" аутификация.
Фрагмент примера сценария, который производит аутентификацию клиента на странице, должен быть следующим:
Пример 2-1. Пример HTTP аутификации
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;
} else {
echo "Hello $PHP_AUTH_USER.<P>";
echo "You entered $PHP_AUTH_PW as your password.<P>";
}
?>
Вместо просто распечатывания $PHP_AUTH_USER и $PHP_AUTH_PW, Вы вероятно хотели бы проверить имя_пользователя и пароль для проверки правильности. Возможно, посылая запрос к базе данных, или, ища пользователя в dbm файле.
Будьте внимательны при использовании браузера Internet Explorer. Он весьма придирчив к порядку заголовков. Отправка заголовка WWW-Authenticate перед заголовком HTTP/1.0 401 возможно даст аутификацию в любом случае.
Чтобы предотвратить от записи кем - то сценарий , который определяет пароль для страницы, которая была опознана через традиционный внешний механизм, PHP_AUTH переменные не будут установлены, если допускается внешнее установление подлинности для той специфической страницы. В этом случае может быть использована переменная $REMOTE_USER чтобы идентифицировать внешне-опознанного пользователя.
Обратите внимание, однако, что вышеупомянутое не защищает от кого - то, кто может управлять не-аутифицированным URL используя перехваченный пароль из аутифицированных URL на том же самом сервере.
И Netscape и Internet Explorer очистит локальный кэш окна аутификации после получения ответа сервера 401. Это эффективно как мера отключения пользователей("log out"), вынуждающая их повторно ввести их username и пароль. Некоторые используют это для отключения пользователя по истечении интервала времени("time out"), или обеспечивают кнопку "Log Out". Эти методы не требуются в соответствии с Основным стандартом аутификации HTTP , так что Вы никогда не должны зависеть от этого. Тестирование с Lynx показало, что Lynx не очищает информацию аутификации с 401 ответом сервера, так что переход обратно и затем вперед снова откроет ресурс (пока требования удостоверения личности не изменились).
Также обратите внимание, что это не работает при использовании сервера Microsoft's IIS и CGI версии PHP из-за ограничений IIS.
PHP не ограничен созданием только HTML вывода. Он может также использоваться для создания файлов GIF, или даже более удобные потоки изображений GIF. Для этого вам надо скомпилировать PHP с библиотекой функций изображения - GD .
Пример 2-2. Создание GIF-файлов с помощью PHP
<?php
Header("Content-type: image/gif");
$string=implode($argv," ");
$im = imagecreatefromgif("images/button1.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($string))/2;
ImageString($im,3,$px,9,$string,$orange);
ImageGif($im);
ImageDestroy($im);
?>
Этот пример вызывается со страницы тегом: <img src="button.php3?text"> Вышеупомянутый скрипт button.php3 берет строку "text", накладывает сверху на основное изображение, которым в этом случае является " images/button1.gif " и выводит возникающее в результате изображение. Это - очень удобный способ не рисовать новые изображения кнопки, каждый раз, когда вы хотите изменить текст кнопки. Этим методом они будут динамически сгенерированы.
Экран загрузки файла может быть организован созданием специальной формы, которая выглядит примерно так:
Пример 2-3. Форма загрузки файла
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST> <INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000"> Send this file: <INPUT NAME="userfile" TYPE="file"> <INPUT TYPE="submit" VALUE="Send File"> </FORM>_URL_ должен указать на php html файл. Cкрытое поле MAX_FILE_SIZE должно предшествовать полю ввода файла и означает максимально допустимый размер файла. Значение определяется в байтах. Для этого файла при успешной загрузке будут определены следующие переменные :
$userfile - Временное имя файла под
которым загруженный файл загружается в
машину сервера.
$userfile_name - Исходное имя файла в системе
отправителя.
$userfile_size - Размер загруженного файла в
байтах.
$userfile_type - Тип MIME файла, если броузер
предоставил эту информацию. Например
может быть "image/gif". Обратите
внимание, что компонент вышеупомянутых
переменных "$userfile" - это любое
значение поля Name тега INPUT c TYPE=file
обозначенное в форме загрузки. В
приведенном выше примере формы загрузки
мы назвали его "userfile".
По умолчанию файлы будут сохранены в заданном по умолчанию временном каталоге сервера. Его можно изменить, установкой переменной среды TMPDIR в среде, в которой PHP выполняется. Хотя, использование при ее установке обращения PutEnv () изнутри сценария PHP не будет работать.
Скрипт PHP, который получает
загруженный файл, должен определить, что
должно быть выполнено с загруженным
файлом. Вы можете, например, использовать
переменную $file_size, чтобы отбросить любые
файлы, которые являются или слишком
маленькими или слишком большими. Вы могли
бы использовать переменную $file_type, чтобы
отбросить любые файлы, которые не
соответствуют некоторым критериям типа.
В любом случае, вы должны или удалить файл
из временного каталога или переместить
эго в другое место.
Файл будет удален из временного каталога
в конце запроса, если он не перемещен или
переименован.
Пожалуйста обратите внимание, что вебсервер CERN httpd, кажется, удаляет все начинающееся с первого пробела в заголовке content-type mime, полученном от клиента. Пока дело обстоит так, CERN httpd не будет поддерживать возможность загрузки файла.
PHP поддерживает HTTP cookies. Cookies -
механизм для сохранения данных в
удаленном браузере и, таким образом, -
трэкинг или идентификация пользователей.
Вы можете устанавливать файлы cookie
используя функцию setcookie(). Cookies - часть HTTP
заголовка, так что функция SetCookie() должна
вызваться прежде чем браузеру послан
какая-нибудь информация для вывода. Это -
то же самое ограничение, которое касается
и функции Header().
Любой cookie, посланный Вам от клиента будет
автоматически превращен в переменную PHP
точно так же как данные методов GET и POST.
Если вы желаете назначить множественные
значения одиночному cookie - просто добавьте
[] к имени cookie. Для более подробной
информации см. функцию setcookie ().
PHP поддерживает ряд различных баз данных, и в режиме работы в собственной системе команд и через ODBC, включая:
Adabas D
MySQL
dBase
Oracle
Empress
PostgreSQL
FilePro
Solid
Informix
Sybase
InterBase
Velocis
mSQL
Unix dbm
ereg()
ereg_replace()
eregi()
eregi_replace()
split()
Все эти функции принимают строку регулярного выражения как их первый параметр. PHP использует расширенные регулярные выражения POSIX как определено в POSIX 1003.2. Для полного описания регулярных выражений POSIX см. соответствующие разделы руководства (regex), в каталоге regex дистрибутива PHP.
Example 2-4. Пример регулярных выражений
ereg("abc",$string);
/* Возвращает 'истина', если "abc"
найдено в строке $string. */
ereg("^abc",$string);
/* Возвращает 'истина', если "abc"
найдено в начале строки $string. */
ereg("abc$",$string);
/* Возвращает 'истина', если "abc"
найдено в конце строки $string. */
eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);
/* Возвращает 'истина', если браузер клиента
- Netscape 2, 3 или MSIE 3. */
ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)",
$string,$regs);
/* Помещает три слова - $regs[1], $regs[2] и $regs[3], разделенные пробелом. */
ereg_replace("^","<BR>",$string);
/* Устанавливает тег <BR> в начало строки $string. */
ereg_replace("$","<BR>",$string);
/* Устанавливает тег <BR> в конец строки $string. */
ereg_replace("\n","",$string);
/* Отсекает символ "возврат каретки" в строке $string. */
1 - Нормальные Ошибки Функции(Normal Function Errors)
2 - Нормальные Предупреждения(Normal Warnings)
4 - Ошибки Синтаксического Анализатора(Parser Errors)
8 - Уведомления(Notices) : предупреждения, которые Вы можете проигнорировать но, которые могут подразумевать баги в вашем коде
Эти 4 типа комбинируются при определении ошибки, сообщая уровень. Ошибка по умолчанию, возвращает уровень 7, который является комбинацией 1 + 2 + 4, или все ошибки за исключением примечаний. Этот уровень может быть изменен в файле php3. ini директивой error_reporting. Он также может быть установлен в вашем файле Apache httpd.conf директивой php3_error_reporting, или же это может быть произведено во времени выполнения сценария, с использованием функции error_reporting ().
Все выражения PHP могут также вызываться с префиксом "@", который выключает сообщение об ошибке, специфичное для этого выражения. Если ошибка произошла во время выполнения такого выражения, и допускается возможность track_errors, Вы можете найти сообщения об ошибках в глобальной переменной $php_errormsg.
Эта глава является руководством по конфигурации и установке PHP3. Требуемые знания и программное обеспечение:
базовые навыки работы с UNIX (на уровне выполнения команды "make" и компилятора С);
компилятор ANSI C;
web server (очевидно);
Исходные коды последней версии можно найти по адресу: http://www.php.net.
1. gunzip apache_1.3.x.tar.gz
2. tar xvf apache_1.3.x.tar
3. gunzip php-3.0.x.tar.gz
4. tar xvf php-3.0.x.tar
5. cd apache_1.3.x
6. ./configure --prefix=/www
7. cd ../php-3.0.x
8. ./configure --with-mysql --with-apache=../apache_1.3.x --enable-track-vars
9. make
10. make install
11. cd ../apache_1.3.x
12. ./configure --prefix=/www --activate-module=src/modules/php3/libphp3.a
13. make
14. make install
Вместо этих шагов Вы можете просто
скопировать бинарный файл httpd поверх
вашего существующего бинарного файла.
Перед этим убедитесь, что Вы выключили
свой сервер.
15. cd ../php-3.0.x
16. cp php3.ini-dist /usr/local/lib/php3.ini
Вы можете отредактировать файл
/usr/local/lib/php3.ini для установления опций PHP.
Если Вы предпочитаете поместить этот файл
в другое место,
то используйте --with-config-file=/path в шаге 8.
17. Отредактируйте Ваш файл httpd.conf или srm.conf и
добавьте:
AddType application/x-httpd-php3 .php3
Вы можете выбрать здесь любое расширение
по Вашему желанию.
В данном случае мы просто рекомендуем
выбрать .php3.
18. Используйте Вашу обычную процедуру для
запуска сервера Apache.
(Вы должны остановить и перезапустить
сервер, а не просто перезагрузить сервер
с использованием сигнала HUP или USR1).
Имеется два пути конфигурирования PHP3.
используйте скрипт "setup", который поставляется с PHP3. Этот скрипт задает Вам ряд вопросов (практически совпадающих со сценарием "install" PHP/FI 2.0) и в конце запускает "configure". Для запуска этого скрипта наберите ./setup.
Этот сценарий также создает файл, называемый "do-conf", который содержит опции, установленные при конфигурации. Вы можете редактировать этот файл для изменения некоторых опций без перезапуска "setup". Тогда выполните ./do-conf и конфигурация запустится с новыми параметрами.
выполните конфигурацию вручную. Для просмотра параметров Вы можете выполнить ./configure --help.
Детали различных параметров конфигурации рассмотрены ниже. Модуль Apache:
Для построения PHP3 в качестве модуля Apache ответьте "yes" в пункте "Build as an Apache module?" (параметр конфигурации --with-apache= DIR ) и определить базовый каталог дистрибутива Apache. Если Вы распаковали свой дистрибутив Apache в директорию /usr/local/www/apache_1.2.4 то она и будет Вашей базовой директорией дистрибутива Apache. Директория по умолчанию /usr/local/etc/httpd. Модуль fhttpd:
При построении fhttpd в качестве модуля fhttpd ответьте "yes" в пункте "Build as an fhttpd module?" (параметр конфигурации --with-fhttpd= DIR ) и определить базовый каталог исходных кодов fhttpd. По умолчанию это /usr/local/src/fhttpd. Если Вы запускаете fhttpd, то построение PHP3 в качестве модуля даст лучшую производительность и возможность контроля за удаленным исполнением. Версия CGI:
По умолчанию PHP3 формируется как программа CGI. Если Вы используете web server с поддержкой PHP3 в качестве модуля, то в своих решениях Вы должны исходить из производительности. Однако CGI версия дает возможность пользователям Apache исполнять страницы с поддержкой PHP под различными идентификаторами пользователя. Пожалуйста, прочитайте Security chapter если Вы собираетесь исполнять PHP как CGI. Параметры поддержки базы данных:
PHP имеет собственную поддержку для нескольких баз данных (так же как ODBC):
--with-adabas =DIR
Компиляция с поддержкой Adabas D. Параметр - установочная директория Adabas D, по умолчанию /usr/local/adabasd.
--with-dbase
Включает условный атрибут поддержки Dbase. Не требует внешних библиотек.
--with-filepro
Включает условный атрибут поддержки filePro только для чтения. Не требует внешних библиотек.
--with-msql=DIR
Включает поддержку mSQL. Параметр этой опции - установочная директория mSQL, по умолчанию /usr/local/Hughes. Это директория по умолчанию дистрибутива mSQL 2.0 configure автоматически определяет, какую версию mSQL Вы используете, а PHP3 поддерживает как версию 1.0, так и 2.0, но если Вы компилируете PHP2 с версией mSQL1.0, то можете получить доступ только к базам данных mSQL1.0 и наоборот.
Посмотрите также директивы mSQL Configuration в configuration file.
--with-mysql=DIR
Включает поддержку MySQL. Параметр в этой опции - установочная директория MySQL, по умолчанию /usr/local. Она является директорией по умолчанию в дистрибутиве MySQL.
Посмотрите также директивы MySQL Configuration в configuration file.
--with-iodbc=DIR
Включает поддержку iODBC. Этот признак был разработан сначала для iODBC Driver Manager, перераспределяемого ODBC driver manager, который выполняется под множеством разновидностей UNIX. Параметром этой опции является установочная директория iODBC, по умолчанию /usr/local.
--with-openlink=DIR
Включает поддержку OpenLink ODBC. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/openlink.
--with-oracle=DIR
Включает поддержку Oracle. Протестирован и должен работать на версиях Oracle от 7.0 до 7.3. Параметром является директория ORACLE_HOME Вы не должны определять этот параметр, если была установлена среда окружения Oracle.
--with-pgsql=DIR
Включает поддержку PostgreSQL. Параметром является базовая установочная директория PostgreSQL, по умолчанию /usr/local/pgsql.
Посмотрите также директивы Postgres Configuration в configuration file.
--with-solid=DIR
Включает поддержку Solid. Параметром является установочная директория Solid, по умолчанию /usr/local/solid.
--with-sybase=DIR
Включает поддержку Sybase. Параметром является установочная директория Sybase, по умолчанию /home/sybase.
Посмотрите также директивы Sybase Configuration в configuration file.
--with-sybase-ct=DIR
Включает поддержку Sybase-CT. Параметром является установочная директория Sybase, по умолчанию /home/sybase.
Посмотрите также директивы Sybase-CT Configuration в configuration file.
--with-velocis=DIR
Включает поддержку Velocis. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/velocis.
--with-custom-odbc=DIR
Включает поддержку для произвольной custom ODBC library. Параметром является базовая директория, по умолчанию /usr/local.
Эта опция подразумевает, что Вы определили CUSTOM_ODBC_LIBS, когда исполняется сценарий конфигурации. Вы также должны иметь правильный заголовочный файл odbc.h где-нибудь в путях включения. Если у Вас его нет, то создайте свой заголовочный файл и включите его отсюда. Он может также требовать несколько внешних определений, особенно когда это на нескольких платформах. Определите их в CFLAGS.
Например Вы можете использовать Sybase SQL Anywhere on QNX следующим образом: CFLAGS=-DODBC_QNX LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc" ./configure --with-custom-odbc=/usr/lib/sqlany50
--disable-unified-odbc
Отключает Unified ODBC модуль, который является общим интерфейсом ко всем базам данных с интерфейсом, основанным на ODBC, таких как Solid и Adabas D. Это также работает для нормальных библиотек ODBC. Был проверен с iODBC, Solid, Adabas D и Sybase SQL Anywhere. Требуется, чтобы один (и только один) из этих модулей или модуль Velocis был включен или определена пользовательская библиотека ODBC. Этот параметр применим только если используется одна из следующих опций: --with-iodbc, --with-solid, --with-adabas, --with-velocis, или --with-custom-odbc,
Посмотрите также директивы Unified ODBC Configuration в configuration file.
--with-ldap=DIR
Включает поддержку LDAP (Lightweight Directory Access Protocol). ). Параметром является базовая установочная директория LDAP, по умолчанию /usr/local/ldap.
Более подробную информацию по LDAP можно найти в RFC1777 и RFC1778. Другие параметры конфигурации:
--enable-sysvsem
Включает поддержку для семафоров Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.
--enable-sysvshm
Включает поддержку разделяемой памяти для Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.
--with-xml
Включает поддержку для непроверенных синтаксических анализаторов XML, используя библиотеку от James Clark's expat library. Для больших подробностей обратитесь к XML function reference .
--enable-maintainer-mode
Включает дополнительные зависимости и предупреждения компилятора, используемые некоторыми разработчиками PHP3.
--with-system-regex
Использует библиотеку регулярных выражений прежде, чем собственные условия. Если Вы построили PHP3 в качестве модуля сервера, Вы должны использовать одинаковую библиотеку - и когда собираете PHP3 и когда собираете сервер. Включите эту опцию, если системные библиотеки обеспечивают специальные свойства, которые Вам требуются. Рекомендуется при возможности использовать собственные библиотеки.
--with-config-file-path=DIR
Маршрут, используемый для просмотра the php3.ini file при старте PHP.
--with-exec-dir=DIR
Разрешить только запуск исполнимых файлов в DIR при нахождении в защищенном режиме. По умолчанию это /usr/local/bin. Эта опция только устанавливает значение по умолчанию, которое потом можно изменить при помощи директивы safe_mode_exec_dir в configuration file.
--disable-debug
Не включает информацию об отладке в библиотеке или исполнимой программе. Отладочная информация просто точно указывает на ошибки, поэтому можно выключить отладку, пока PHP3 находится в стадии бета или альфа версий.
--enable-safe-mode
Включает защищенный режим (safe mode) по умолчанию. Это накладывает некоторые ограничения на действия PHP, таких как открытие файлов только внутри корня документа. Для более подробной информации смотрите Security chapter Пользователи CGI всегда должны включать безопасный режим. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы safe_mode configuration file.
--enable-track-vars
Указывает PHP3 отслеживать пришедшие переменные GET/POST/cookie в массивах HTTP_GET_VARS, HTTP_POST_VARS и HTTP_COOKIE_VARS. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы track_vars в configuration file.
--enable-magic-quotes
Включает по умолчанию системные квоты. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы magic_quotes_runtime в configuration file. Смотрим также директивы magic_quotes_gpc и magic_quotes_sybase.
--enable-debugger
Включает внутреннюю поддержку PHP3 debugger. Это свойство находится в стадии испытания. Смотрим также директивы Debugger Configuration в configuration file.
--enable-discard-path
Если это включено, то бинарный PHP CGI может быть безопасно помещен вне дерева web и пользователи не смогут обойти защиту .htaccess. Читайте об этой опции section in the security chapter.
--enable-bcmath
Включает стиль bc произвольной точности математических функций. Смотрим также опцию bcmath.scale в configuration file.
--enable-force-cgi-redirect
Включает проверку безопасности для внутренних переадресаций сервера (redirect). Вы должны использовать это, если запускаете CGI версию с Apache.
Когда PHP используется в качестве исполняемого CGI, PHP по умолчанию сначала всегда проверяет, что используется переадресацией (например под Apache, используя директивы Action). Это дает уверенность, что исполняемый PHP не может использоваться для того, чтобы обойти стандартные процедуры установления прав web сервера путем непосредственного вызова, как например http://my.host/cgi-bin/php/secret/doc.html. Этот пример, доступен на http://my.host/secret/doc.html но игнорирует все установленные httpd правила безопасности для директории /secret.
Не установленная опция отключает проверку и дает возможность обхода защиты httpd и настроек предъявления полномочий. Делайте это только тогда, когда программное обеспечение Вашего сервера неспособно указать, что была выполнена безопасная переадресация и все Ваши файлы в корне документа, а также директории пользователей общедоступны.
Читайте об этой опции в section in the security chapter .
--disable-short-tags
Отключает краткую форму <? ?>тегов PHP3. Вы должны отключить краткую форму, если хотите использовать PHP3 c XML. При отключенной краткой форме принимается только тег PHP3 <?php ?>. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы short_open_tag в configuration file.
--enable-url-includes
Дает возможность выполнять код на других HTTP и FTP серверах непосредственно из PHP3 с include(). Смотрим также опцию include_path в configuration file.
--disable-syntax-hl
Выключает синтаксическое выделение.
При сборке PHP3 установщик просматривает заголовочные и библиотечные файлы в различных директориях, измените соответственно переменные окружения CPPFLAGS и LDFLAGS. Если Вы используете нормальный shell, то вы должны написать LDFLAGS=-L/my/lib/dir CPPFLAGS=-I/my/include/dir ./configure Построение:
Когда PHP3 сконфигурирован, Вы готовы к построению исполнимых CGI или библиотеку PHP3. Об этом заботится команда make. Если Вы потерпели неудачу и не можете понять почему, то смотрите раздел Problems section.
Если Вы собрали PHP3 в качестве программы CGI, Вы можете проверить результат, выполнив команду make test. Это хорошая идея - проверить результат сборки. Этим способом Вы можете обнаружить проблему с Вашим PHP3 на ранней стадии, вместо того, чтобы бороться с этим позже. Контрольное тестирование:
Если Вы собрали PHP3 в качестве программы CGI,
Вы можете протестировать свою версию при
помощи команды make bench. Обратите
внимание, что если используется защищенный
режим по умолчанию, то тест может не
завершиться, если он требует больше, чем 30
секунд. Это происходит потому, что set_time_limit()
() не может быть использована в защищенном
режиме. Используйте max_execution_time
для контроля этого времени в Ваших
собственных сценариях. make bench
игнорирует configuration
file.
Это руководство по установке поможет Вам установить и сконфигурировать PHP3 на Ваших web серверах под Windows 9x/NT. Данное руководство составил Bob Silva. Последнюю версию можно найти по адресу http://www.umesd.k12.or.us/php/win32install.html.
Данное руководство обеспечивает поддержку установки на:
| Personal Web Server (рекомендуется новейшая версия) |
| Internet Information Server 3 or 4 |
| Apache 1.3.x |
| Omni HTTPd 2.0b1 |
Все модули теперь начинаются с префикса 'php3_'. Вы должны изменить свой файл php3.ini и/или все сценарии загрузки расширений с функцией dl() (либо везде удалите префикс 'php3_'). Это предотвратит путаницу между модулями PHP и их библиотеками обеспечения.
ChangeLog, FAQ и обновленную документацию всегда можно найти на официальном сайте PHP или любом из его зеркал.
Данные шаги должны быть выполнены при любой установке перед специфическими инструкциями сервера:
Распакуйте дистрибутивный файл в директорию по Вашему выбору. Неплохим вариантом будет "C:\PHP3\".
Скопируйте файл 'php3-dist.ini' в Вашу директорию '%WINDOWS%' и переименуйте его в 'php3.ini'. Ваша директория '%WINDOWS%' обычно:
| c:\windows for Windows 95/98 |
| c:\winnt or c:\winnt40 for NT servers |
Отредактируйте Ваш файл 'php3.ini':
вам потребуется изменить 'extension_dir' на путь к Вашей установочной директории PHP, либо куда Вы поместили файлы 'php3_*.dll' (например c:\php3);
установите 'doc_root' в путь, где располагается document_root web сервера (например c:\apache\htdocs или c:\webroot);
выберите, какие модули Вы желаете загружать при старте PHP. Вы можете раскомментировать линии 'extension=php3_*.dll' для загрузки соответствующих модулей. Некоторые модули требуют дополнительной установки некоторых библиотек в систему для корректной работы. В FAQ PHP можно получить больше информации о том, где получить библиотеки поддержки. Вы можете также загружать модули динамически, используя в сценарии dl("php_*.dll");
на PWS и IIS Вы можете установить browscap.ini в директории 'c:\windows\system\inetsrv\browscap.ini' для Windows 95/98 и 'c:\winnt\system32\inetsrv\browscap.ini' для Windows NT. Дополнительную информацию по использованию browscap в PHP можно на зеркале mirror, выберите кнопку "source", чтобы увидеть это в действии;
Рекомендуемый метод конфигурирования этих серверов состоит в использовании INF файлов, поставляемых с дистрибутивом (php_iis_reg.inf). Вы можете отредактировать этот файл и убедитесь, что расширения и установочная директория PHP соответствует Вашим параметрам. Или Вы можете следовать перечисленным ниже шагам, чтобы сделать это вручную.
ПРЕДУПРЕЖДЕНИЕ: Эти шаги включают в себя непосредственную работу с windows registry. Мы настоятельно рекомендуем вам сначала сделать резервную копию registry. Группа разработчиков PHP не несет ответственности, если Вы повредите Ваш registry.
Запустите Regedit;
Перейдите к: HKEY_LOCAL_MACHINE
/System/CurrentControlSet/Services
/W3Svc /Parameters/ScriptMap.
В меню редактирования выберите New->String Value.
Определите расширение, которое Вы хотите использовать для ваших сценариев PHP (например .php3).
Дважды щелкните на значении новой строки и введите путь к php.exe exe в поле данных (например c:\php3\php.exe %s %s). '%s %s' ОЧЕНЬ важны, PHP не будет работать без этого должным образом;
Повторите эти шаги для каждого расширения, которое Вы хотите ассоциировать со сценариями PHP;
Теперь перейдите к HKEY_CLASSES_ROOT;
В меню редактирования выберите New->Key;
Определите ключ к расширению, которое Вы установили в предыдущем разделе (например .php3
Выделите новый ключ, в правой части окна дважды щелкните "default value" и введите phpfile.
Повторите последний шаг для каждого расширения, которое Вы установили в предыдущей секции;
Теперь создайте другой New->Key под HKEY_CLASSES_ROOT и это имя phpfile.
Выделите новый ключ phpfile phpfile и в правой части окна, дважды щелкните "default value" и введите PHP Script.
Щелкните правой клавишей на phpfile и выберите New->Key, это имя Shell.
Щелкните правой клавишей на Shell и выберите New->Key, это имя open.
Щелкните правой клавишей на open и выберите New->Key, это имя command.
Выделите новый ключ command и в правой части окна дважды щелкните на "default value" и введите путь к php.exe. Например: c:\php3\php.exe -q %1. (не забудьте %1).
Выйдите из Regedit;
Пользователи PWS и IIS 3 теперь имеют полностью работающую систему. Пользователи IIS 3 могут использовать tool от Steven Genusa для конфигурирования своих карт сценариев.
Для установки PHP3 на NT Server с запущенным IIS4 следуйте следующим инструкциям:
В Internet Service Manager (MMC) выберите Web site или отправной каталог приложения;
Откройте меню свойства каталога (щелкните правой клавишей мыши и выберите свойства) и тогда щелкните Home Directory, Virtual Directory или Directory tab;
Щелкните кнопку Configuration и тогда выберите App Mappings tab;
Щелкните Add, в рамке Executable наберите c:\path-to-php-dir\php.exe %s %s. Вы ДОЛЖНЫ подставить в конце %s %s , PHP не будет функционировать правильно, если Вы этого не сделаете;
В рамке Extension определите расширение файла, которое Вы желаете ассоциировать со сценариями PHP (обычно (.php3 и .phtml);
Установите требуемую безопасность (это делается в Internet Service Manager) и, если Ваш NT Server использует файловую систему NTFS, добавьте права на исполнение для директории I_USR_, которая содержит php.exe.
Вы должны редактировать Ваш файл srm.conf или httpd.conf , чтобы сконфигурировать Apache для работы с исполняемыми PHP CGI.
Хотя может быть несколько вариантов конфигурирования PHP под Apache, это делается достаточно просто даже для новичка. Пожалуйста, обратитесь к документации по Apache для получения информации о директивах конфигурации.
ScriptAlias /php3/"c:/path-to-php-dir/php.exe"
AddType application/x-httpd-php3 .php3
AddType application/x-httpd-php3 .phtml
Action application/x-httpd-php3 "php3/php.exe"
Для обеспечения возможности использования исходного текста, просто создайте файл сценария PHP и вставьте этот код в: . Substitute original_php_script.php3php3 с именем желательного файла источника (это только один из путей). Обратите внимание, что на Win-Apache все обратные слеши в пути предложения, такого как "c:\directory\file.ext" должны быть заменены на прямые.
Данная конфигурация должно быть самая простая:
| Шаг 1: Установите Omni server; |
| Щелкните правой клавишей на голубой иконке OmniHTTPd в system tray и выберите Properties |
| Шаг 3: Щелкните на Web Server Global Settings |
| Шаг 4: На 'External' tab введите: virtual = .php3 | actual = c:\path-to-php-dir\php.exe |
| Шаг 5: На Mime tab, введите: virtual = wwwserver/stdcgi | actual = .php3 |
| Шаг 6: Щелкните OK |
Повторите шаги 2 - 6 для каждого расширения, которое Вы желаете ассоциировать с PHP.
Таблица 3-1. Модули PHP
| php3_calendar.dll | Функции преобразования календаря |
| php3_crypt.dll | Функции шифрования |
| php3_dbase.dll | Функции баз данных |
| php3_dbm.dll | Эмуляция GDBM посредством Berkely DB2 library |
| php3_filepro.dll | Доступ READ ONLY к базам данных filepro |
| php3_gd.dll | Библиотека функций GD для манипуляций с gif |
| php3_hyperwave.dll | Функции HyperWave |
| php3_imap4r2.dll | Функции IMAP 4 |
| php3_ldap.dll | Функции LDAP |
| php3_msql1.dll | Клиент mSQL 1 |
| php3_msql2.dll | Клиент mSQL 2 |
| php3_mssql.dll | Клиент MSSQL (требует MSSQL DB-Libraries) |
| php3_mysql.dll | Функции MySQL |
| php3_nsmail.dll | Функции Netscape mail |
| php3_oci73.dll | Функции Oracle |
| php3_snmp.dll | Функции SNMP (только для NT!) |
| php3_zlib.dll | Функции ZLib |
Некоторые проблемы встречаются чаще других. Наиболее распространенные описаны в PHP3 FAQ, который можно найти по адресу: http://www.php.net/FAQ.php3
Если Вы считаете, что нашли ошибку в PHP3, то сообщите о ней. Разработчики PHP3 вероятно не знают об этом и если Вы о ней не сообщите, то она так и не будет исправлена. Формы для сообщений об ошибках доступны на сети сайтов PHP3, главная форма находится по адресу: http://ca.php.net/bugs.php3.
Если Вы все еще не можете решить проблему, то возможно кто-нибудь из списка рассылки PHP3 способен Вам помочь. Вы прежде всего должны проверить архив на тот случай, если кто-нибудь уже ответил людям с подобными проблемами. Архив можно найти по адресу http://www.tryc.on.ca/php3.html. Для того, чтобы подписаться на список рассылки PHP3 пошлите пустое письмо по адресу php3-subscribe@lists.php.net. Адрес списка рассылки php3@lists.php.net.
Если Вы хотите получить помощь через
список рассылки, пожалуйста, попробуйте
быть точным и дать необходимые детали о
Вашем окружении (операционная система,
версия PHP, какой используется web server,
запускаете Вы PHP как CGI или в качестве модуля
и т.д.) и желательно было бы предоставить код,
чтобы другие могли воспроизвести и
протестировать Вашу проблему.
PHP является мощным инструментом. Как и в случае с другими мощными средствами, Вы можете навредить сами себе. PHP функционирует таким образом, что если его небрежно использовать, то могут возникнуть проблемы с безопасностью на Вашей системе. Лучший путь для предотвращения такой ситуации - всегда знать, что Вы делаете.
Файл php3.ini читается при запуске синтаксического анализатора PHP. Для версий серверного модуля PHP, это случается только один раз, когда запускается веб-сервер. Для версии CGI это случается на каждом вызове.
Только для каждой директивы указанной
здесь, имеется соответствующая директива
Apache в httpd.conf. Просто добавьте Вы можете посмотреть установочные
параметры большинства значений
конфигурации вызвав функцию phpinfo().
Определяет имя файла, который
автоматически проверяется после
основного файла. Файл включается так же,
как если бы была вызвана функция include(),
с использованием include_path.
Специальное значение none
запрещает авто-добавление.
Примечание: Если сценарий
обрывается функцией exit(),
авто-добавление не
произойдет. Определяет имя файла, который
автоматически проверяется перед
основным файлом. Файл включается так же,
как если бы была вызвана функция include(),
с использованием include_path.
Специальное значение none
запрещает авто-добавление. Это определяет, должны ли ошибки
печататься на экране как часть HTML вывода
или нет. Главный каталог("root directory") PHP на
сервере. Используется только когда он не
пустой. Если PHP сконфигурирован при
помощи safe mode, то никакие
другие файлы за пределами этого каталога
не обслуживаются. Эта директива действительно полезна
только в модуле PHP под Apache. Это
используется на сайтах, где необходимо
включать и выключать синтаксический
анализ PHP на определенные каталоги и
виртуальные серверы. Установкой php3_engine
off в допустимом месте файла httpd.conf,
PHP можно запрещать и разрешать. Имя файла, куда сохраняется журнал
ошибок(log file) сценариев. Если используется
специальное значение syslog,
ошибки отправляются в системный журнал(system
logger). В UNIX'е это syslog(3), а в Windows NT это журнал
событий (event log). Системный журнал не
поддерживается в Windows 95. Устанавливает уровень сообщений об
ошибках. Параметр является целым,
представляющим битовую область. Добавьте
те значения уровней сообщений об ошибках,
которые Вы хотите.
Таблица 4-1. Уровни сообщений об
ошибках Ограничивает файлы, которые могут
открываться PHP в определенном директории-дереве.
Когда сценарий пытается открыть файл с
помощью, например, fopen или gzopen, наличие/расположение
файла проверяется. Когда файл находится
за пределами определенного директория-дерева,
PHP откажется открыть его. Все символьные
ссылки определены, так что нет
возможности избежать этого ограничения с
помощью symlink.
Специальное значение . показывает
что каталог, в котором находится сценарий,
используется как основной каталог.
По умолчанию допускается открытие всех
файлов. Устанавливает допустимость GET/POST/COOKIE в
анализе. Установка по умолчанию этой
директивы - "GPC". Установка ее в
"GP", например, вынудит PHP полностью
игнорировать cookies и перезапишет любые
переменные метода GET переменными метода
POST с одинаковыми именами. Определяет список каталогов где будут
располагаться файлы для функций require()
, include() и fopen_with_path()
. Формат подобен формату системной
переменной окружения PATH :
список каталогов разделяется двоеточием
в UNIX или точкой с запятой в Windows. Пример 4-1. UNIX include_path
Пример 4-2. Windows include_path
Сообщает, что независимые сообщения об
ошибке сценария должны регистрироваться
в журнале ошибок сервера. Этот выбор
таким образом является специфичным для
сервера. Устанавливает magic_quotes состояние для GPC
(Get/Post/Cookie) операций. Когда magic_quotes включено
(on), все ' (одиночные кавычки), " (двойные
кавычки), \ (обратные слэши) и нулевые
значения (NUL's) записываются с обратной
косой чертой автоматически. Если также
включено magic_quotes_sybase, одиночная кавычка
записывается с дополнительной одиночной
кавычкой вместо обратной косой черты. Если magic_quotes_runtime разрешено,
большинство функций, которые возвращают
данные из любого внешнего источника
разной природы, включая базы данных и
текстовые файлы, будут иметь кавычки,
записанные с обратной косой чертой. Если magic_quotes_sybase
также включены, одиночная кавычка
записывается с дополнительной одиночной
кавычкой вместо обратной косой черты. Если magic_quotes_sybase также
разрешено, одиночная кавычка
записывается с дополнительной одиночной
кавычкой вместо обратной косой черты,
если magic_quotes_gpc или magic_quotes_runtime
разрешены. Эта установка определяет максимальное
время в секундах допустимое для сценария,
прежде чем он будет прекращен
анализатором. Это помогает
предохраниться от плохо/некорректно
написанных сценариев. Эта установка определяет максимальный
размер памяти в байтах, допустимый для
этого сценария. Это помогает запретить
плохо/некорректно написанным сценариям
использовать всю доступную память на
сервере. Задает допустимость короткой формы (
<? ?> тегов PHP . Если вы хотите
использовать PHP совместно с XML, эту опцию
необходимо отключить. Если опция
отключена, вы должны использовать
длинную форму тегов ( <?php
?> ). Если опция разрешена, последнее
сообщение об ошибке всегда будет
представлена в глобальной переменной $php_errormsg. Если опция разрешена, входящая
информация GET, POST и cookie может быть найдена
в глобальных ассоциативных массивах $HTTP_GET_VARS
, $HTTP_POST_VARS и $HTTP_COOKIE_VARS
, соответственно. Временный каталог, используемый для
хранения файлов при их загрузке на сервер.
Должен допускать запись, независимо от
того, каким пользователем PHP используется. Основное имя каталога, используемого в
домашнем каталоге пользователей для
файлов PHP, например public_html . Если разрешено, эта опция выдает при
выводе PHP сообщение когда оператор плюс(
+ ) используется в строке. Это должно
облегчить поиск сценариев, которые
должны быть перезаписаны с заменой на (
. ) - string concatenator.
Имя DNS или IP адрес сервера SMTP, который
должен использоваться PHP под Windows для
отправки сообщения функцией mail()
. Определяет "From:" - почтовый адрес,
который используется в сообщении,
отправленном PHP под Windows. Указывает где может быть найдена
программа sendmail , обычно это /usr/sbin/sendmail
или /usr/lib/sendmail Системы не использующие sendmail должны
установить оболочку/замену sendmail их
предлагаемой системой почты, если
имеется. Например, Qmail
пользователи могут указать /var/qmail/bin/sendmail
.
Устанавливает допустимость PHP safe mode.
Читайте главу
Безопасность (Security) для большей
информации Если PHP используется в safe mode, system()
и другие функции, выполняющие
системные программы, отказываются
запускать программы, которые находятся
не в этом каталоге.
DNS-имя или IP-адрес хоста используемого
отладчиком. Номер порта используемого отладчиком. Задает допустимость использования
отладчика.
Эта директива действительно полезна
только в модуле PHP под Apache. Вы можете
разрешать/запрещать динамическую
загрузку расширений PHP функцией dl()
раздельно по каталогам и/или по
виртуальным серверам.
Основная причина для выключения
динамической загрузки - безопасность. С
динамической загрузкой, можно
игнорировать все ограничения safe_mode и
open_basedir.
По умолчанию динамическая загрузка
должна допускаться, за исключением
случаев, когда используется safe-mode. В safe-mode
всегда недопустимо использование dl()
. В каком каталоге PHP должен искать
динамически загружаемые расширения. Какие динамически загружаемые
расширения загрузить, при запуске PHP.
Допустить постоянные/устойчивые MySQL
соединения. Максимальное число постоянных MySQL
соединений за один процесс. Максимальное число MySQL соединений за
процесс, включая постоянные соединения.
Допустить постоянные mSQL соединения. The maximum number of persistent mSQL connections per process. Максимальное число постоянных mSQL
соединений за один процесс.
Допустить постоянные/устойчивые
соединения Postgres. Максимальное число постоянных
соединений Postgres за процесс. Максимальное число Postgres соединений за
процесс, включая постоянные соединения.
Допустить постоянные Sybase соединения. Максимальное число постоянных Sybase
соединений за процесс. Максимальное число Sybase соединений за
процесс, включая постоянные соединения.
Допустить постоянные Sybase-CT соединения.
По умолчанию включено. Максимальное число постоянных Sybase-CT
соединений за процесс. По умолчанию
значение -1 означающее неограниченное
количество. Максимальное число Sybase-CT соединений за
процесс, включая постоянные соединения.
По умолчанию значение -1 означающее
неограниченное количество. Сообщения Сервера со степенью более чем
или равной sybct.min_server_severity будут сообщены
как предупреждения. Эта величина может
также устанавливаться из сценария
вызовом sybase_min_server_severity() .
Значение по умолчанию - 10 , которое
сообщает ошибки строгости информации,
или выше. Сообщения библиотеки Клиента со
строгостью более чем или равной
sybct.min_client_severity будут сообщены как
предупреждениях. Эта величина может
также устанавливаться из сценария
вызовом sybase_min_client_severity() . По
умолчанию - 10, что эффективно запрещает
вывод. Максимальное время (в секундах)
ожидания повторной попытки соединения,
прежде чем будет отказ. Имейте в виду, что
если max_execution_time превышен когда время
попытки соединения закончится, ваш
сценарий будет расторгнут прежде, чем
будут предприняты какие-либо действия на
случай отказа. По умолчанию - одна минута. Максимальное время(в секундах)ожидания
окончания select_db или выполнения запроса.
Имейте в виду, что если max_execution_time
превышен, когда время функционирования
истекает, ваш сценарий будет расторгнут
прежде, чем будут предприняты какие-либо
действия на случай отказа. По умолчанию
не ограничено. Имя хоста, с которым вы хотите
соединиться, для показа sp_who. По умолчанию
- none.
Количество десятичных цифр для всех
функций bcmath.
имя файла возможностей браузера.
ИСТОЧНИК ДАННЫХ ODBC, для использования,
если ничего не определено в odbc_connect()
или odbc_pconnect()
. Имя пользователя, используемое если нет
определений в odbc_connect()
или odbc_pconnect()
. Пароль, используемый, если не
определено в odbc_connect()
или odbc_pconnect()
. Допустить постоянные/устойчивые ODBC
соединения. Максимальное число постоянных ODBC
соединений за процесс. Максимальное число ODBC соединений за
процесс, включая постоянные соединения.
PHP - мощный язык и интерпретатор,
независимо от того, включен ли он в веб-сервер
как модуль или выполняется как разделение
исполнимых файлов(binary) CGI, он
может иметь доступ к файлам, выполнять
команды и открывать сетевые соединения на
сервере. Эти свойства дают возможность
выполнять что-нибудь на веб-сервере
небезопасное по умолчанию. PHP разработан
специально для того чтобы быть более
безопасным языком для написания программ
CGI, чем Perl или C. Как есть много разных путей использования
PHP, есть и большой выбор конфигураций,
управляющих поведением PHP. Большой выбор
опций гарантирует, что вы можете
использовать PHP для многих целей, но это
также означает что есть комбинации этих
опций и, также, конфигураций сервера,
которые заканчиваются небезопасной
установкой. Эта глава объясняет различные
комбинации опций конфигурации и ситуации, в
которых они могут быть удачно использованы.
Использование PHP как исполнимых файлов CGI
- выбор для установок, которые по некоторой
причине не хотят внедрить PHP как модуль в
программное обеспечение сервера (подобно
Apache), или PHP будет использоваться с другими
типами оболочек CGI, чтобы создать надежное
окружение chroot и setuid для сценариев. Эта
установка обычно включает установку
выполняемого(binary) PHP в каталог cgi-bin на веб-сервере.
Бюллетень CERT CA-96.11
рекомендует кроме того, устанавливать
любые интерпретаторы в cgi-bin. Даже если
исполнимый PHP может быть использован в
качестве автономного интерпретатора, PHP
разработан для того чтобы предохранить от
атаки, которую эта установка делает
возможной:
Доступ к системным файлам: http://my.host/cgi-bin/php?/etc/passwd
Информация запроса в url после знака
вопроса (?) проходит как аргументы
командной строки интерпретатору через
интерфейс CGI. Обычно переводчики
открывают и выполняют файл указанный как
первый аргумент в командной строке.
Вызванный как исполняемый CGI-файл, PHP
отказывается интерпретировать командные
аргументы строки. Доступ к любым веб-документам на
сервере: http://my.host/cgi-bin/php/secret/doc.html
Часть URL с информацией о пути, стоящая
после имени PHP-файла, /secret/doc.html
обычно используется, чтобы определить
имя файла, который должен открываться и
интерпретироваться CGI
программой. Обычно некоторые директивы
конфигурации веб-сервера(Apache: Action)
используются, чтобы перенаправить
запросы к документам подобно http://my.host/secret/script.php3
на PHP интерпретатор. С такой установкой
веб-сервер сначала проверяет разрешения
доступа в каталоге /secret , и
потом создает запрос перенаправления http://my.host/cgi-bin/php/secret/script.php3
. К несчастью, если запрос не дается
изначально в этой форме, веб-сервер не
проверяет доступ к файлу /secret/script.php3
, но только для файла /cgi-bin/php
. Таким образом любой пользователь,
имеющий доступ к /cgi-bin/php ,
получает доступ к любым защищенным
документам на сервере.
В PHP, опция compile-time конфигурации --enable-force-cgi-redirect
и директивы runtime-конфигурации doc_root
и user_dir может
использоваться для того чтобы отразить
эту атаку, если дерево документов сервера
имеет любые директории с ограничениями
доступа. Смотрите ниже для полного
объяснения других комбинаций. Если ваш сервер не имеет какой-либо
информации, которая не ограничивается
паролем или управлением доступом на основе
ip, нет потребности в этих опциях
конфигурации. Если ваш веб-сервер не
позволяет вам производить перенаправление,
или сервер не имеет пути, чтобы связаться с
исполнимым PHP, который запрашивает
благополучно перенаправленный запрос, вы
можете указать опцию --disable-force-cgi-redirect
для конфигурирования сценария. Перенаправление может быть
сконфигурировано, например в Apache,
директивами AddHandler и Action (см. ниже).
Эта compile-time опция предохраняет от вызова PHP
напрямую с URL подобно http://my.host/cgi-bin/php/secretdir/script.php3.
Вместо того чтобы выполнить запрос, PHP
выполняет только грамматический разбор в
этом способе если он выполнил правила
перенаправления вебсервера.
Обычно переадресация в конфигурации Apache
сделана со следующими директивами:
Эта опция была протестирована только с
веб-сервером Apache, и полагается на Apache чтобы
установить не-стандартную внешнюю
переменную CGI REDIRECT_STATUS для
перенаправленных запросов. Если ваш сервер
паутины не поддерживает какого-либо
способа сообщать что запрос прямой или
перенаправленный, Вы не можете
использовать эту опцию и Вы должны
использовать один из других путей запуска
версии CGI, документированной здесь.
Размещение активного содержания, такого
как скрипты и модули, в каталогах
документов веб-сервера иногда является
небезопасной практикой. Если при некоторой
ошибке конфигурации сценарии не
выполняются, они отображаются как обычные
HTML документы, что может закончиться утечкой
интеллектуальной собственности или
информации безопасности подобно паролям.
Поэтому многие сисадмины предпочитают
устанавливать другие каталоги для
сценариев, которые будут доступны только
через PHP CGI и, следовательно, всегда
проинтерпретированы и не отображены как
таковые.
Также, если недоступен метод
перенаправления неуверенных запросов, как
описано в предыдущем разделе, необходимо
установить корневой каталог(doc_root)
сценариев, который отличается от корневого
каталога веб-документов.
Вы можете установить корневой каталог для
скриптов директивой конфигурации doc_root
в файле php3.ini , или вы можете
установить переменную окружения PHP_DOCUMENT_ROOT.
Если это установлено, CGI-версия PHP всегда
будет добавлять doc_root и
путь к файлу в запросах, так что вы всегда
будете уверенны что за пределами этого
каталога скрипты выполняться не будут (кроме
user_dir //см.ниже).
Другая используемая опция - user_dir.
Когда user_dir - не установлена, открытием файла
управляет только doc_root.
Открытие URL подобно http://my.host/~user/doc.php3
не даст результата при открытии файла из
каталога пользователя, но вызывается файл ~user/doc.php3
из каталога doc_root (да,имя каталога
начинается с тильды [~]).
Если user_dir установлена, например как public_php,
запрос, подобный http://my.host/~user/doc.php3
откроет файл doc.php3 в каталоге public_php
домашнего каталога пользователя. Если это /home/user,
то выполняется /home/user/public_php/doc.php3.
user_dir задается
независимо от doc_root, так
что вы можете контролировать доступ к document
root и user directory отдельно.
Очень безопасная опция должна установить
синтаксический анализатор PHP где-нибудь вне
дерева файлов web. В /usr/local/bin,
например. Обратная сторона этой опции
заключается в том что вы должны вставлять
строку подобно:
Чтобы PHP получил возможность корректно
оперировать с PATH_INFO и PATH_TRANSLATEDпри
такой установке, php анализатордолжен быть
скомпилирован с опцией конфигурации --enable-discard-path
Когда PHP используется как Apache модуль, не
наследуются права пользователя Apache (обычно
таковые - "nobody"). Синтаксис PHP заимствован непосредствено
из C. Java и Perl также повлияли на синтаксис
данного языка.
Есть три способа выхода из HTML и перехода в
"режим PHP кода": Пример 5-1. Способы перехода из HTML
Инструкции (утверждения) разделяются также как
в C или Perl - точкой с запятой.
Закрывающий тэг (?>) тоже подразумевает конец
утверждения, поэтому следующие записи
эквивалентны:
PHP поддерживает переменные следующих
типов:
Тип переменной обычно не устанавливается
программистом; вместо этого, он
определяется PHP во время выполнения
программы, в зависимости от контекста в
котором данная переменная используется.
Если вам нравится указывать тип
переменной непосредственно, вы можете
использовать для этого инструкцию cast
либо функцию settype().
Учтите, что переменная может вести себя по
разному в определенных ситуациях, в
зависимости от того, какой тип определен
для нее в данное время. Более подробно это
описано в разделе Изменение
типа.
Для инициализации переменной в PHP вы
просто присваиваите ей значение. Для
большинства переменных это именно так; для
массивов и объектных переменных, однако,
может использоваться несколько иной
механизм.
Массив может инициализироваться одним из
двух способов: последовательным
присвоением значений, или посредством
конструкции array()
(которая описана в разделе Функции
Массивов).
При последовательном добавлении значений
в массив вы просто записываете значения
элементов массива, используя пустой индекс.
Каждое последующее значение будет
добавляться в качестве последнего элемента
массива.
Как в C и Perl, элементы массива нумеруются
начиная с 0, а не с 1.
Для инициализации объектной переменной
используйте новое предписание для
сопоставления данного объекта объектной
переменной.
Областью переменной является контекст,
внутри которого она определена. Главным
образом, все переменные PHP имеют одну
область. Однако, внутри функций
определенных пользователем, представлена
локальная область функции. Любая
переменная, определенная внутри функции, по
умолчанию ограничена локальной областью
функции. Например:
Этот скрипт не выдаст что-либо на выходе,
поскольку инструкция echo относится к
локальной версии переменной $a, значение
которой присваивается не внутри этой
области. Вы можете заметить, что здесь
имеется некоторое отличие от языка C, в том
что глобальные переменные в C автоматически
действуют и внутри функций, если только
они не переписываются локальными
определениями. Это может вызвать некоторые
проблемы, т.к. по неосторожности можно
изменить глобальную переменную. В PHP
глобальные переменные должны быть
продекларированы глобально внутри функции,
если предполагается их использование в
данной функции. Например:
Вышеописанный скрипт выдаст значение
"3". Поскольку $a и $b декларируются
глобально внутри функции, ссылки на данные
переменные трактуются как ссылки на их
глобальные версии. Нет ограничений на
количество глобальных переменных, которыми
можно манипулировать внутри функции.
Вторым способом доступа к переменным из
глобальной области является использование
специального опеределяемого PHP массива
$GLOBALS. При этом предыдущий пример может быть
записан как:
Массив $GLOBALS является ассоциативным
массивом, в котором имя глобальной
переменной является ключом, а значение этой
переменной является значением элемента
массива.
Другой важной характеристикой от области
определения переменной является статическая
переменная. Статическая переменная
существует только в локальной области
функции, но она не теряет своего значения
когда программа, при исполнении, покидает
эту область. Рассмотрим следующий пример:
Эта функция совершенно бесполезна
практически, поскольку каждый раз при ее
вызове она устанавливает $a в 0 и выводит
"0". Выражение $a++ , которое
увеличивает значение переменной, так же
бесполезно, поскольку при выходе из функции
переменная $a исчезает. Для придания
дееспособности функции подсчета, которая
не теряла бы нить текущего счета,
переменная $a декларируется как статическая:
Теперь, каждый раз при вызове функции Test()
она будет выводить значение $a и увеличивать
его.
Статические переменные также весьма
существенны, когда функции вызываются
рекурсивно. Рекурсивные функции - это те,
которые вызывают сами себя. Составлять
рекурсивную функцию нужно внимательно, т.к.
при неправильном написании можно сделать
рекурсию неопределенной. Вы должны быть
уверены в адекватности способа прекращения
рекурсии. Следующая простая функция
рекурсивно считает до 10:
Иногда бывает удобно давать переменным
изменяемые имена. Такие имена могут
изменяться динамически. Обычная переменая
устанавливается так:
Изменяемая переменная берет некое
значение и обрабатывает его как имя
переменной. В приведенном выше примере
значение hello может быть
использовано как имя переменной,
посредством применения двух записанных
подряд знаков доллара, т.е.:
С этой точки зрения, две переменных
определены и сохранены в символьном дереве
PHP: $a с содержимым "hello" и $hello с
содержимым "world". Так, инструкция:
осуществляет то же самое, что и инструкция:
а именно, обе они выводят: hello
world.
Чтобы использовать изменяемые переменные
с массивами, необходимо решить проблему
неоднозначности. Это означает, что если вы
пишете $$a[1], то синтаксическому анализатору
необходимо знать, имеете ли вы в виду
использовать $a[1] как переменую, или вы
предполагаете $$a как переменную а [1] как
индекс этой переменной. Синтаксис для
разрешения подобной неоднозначности такой:
${$a[1]} для первого случая и ${$a}[1] для второго.
Когда программой-обработчиком формы
является PHP-скрипт, переменные этой формы
автоматически доступны для данного скрипта
PHP. Например, рассмотрим следующую форму: Пример 5-2. Простая переменная формы
При активизации формы PHP создаст
переменную $name, значением
которой будет то содержимое, которое было
введено в поле Name: данной формы.
PHP также воспринимает массивы в контексте
переменных формы, но только одномерные. Вы
можете, например, группировать
взаимосвязанные переменные вместе или
использовать это свойство для определения
значений переменных при множественном
выборе на входе: Пример 5-3. Более сложные переменные
формы
Если PHP-атрибут track_vars включен, через
установку конфигурации track_vars
или директивой <?php_track_vars?>,
тогда переменные, активизированные
посредством методов POST или GET, будут также
находиться в глобальных ассоциативных
массивах $HTTP_POST_VARS и $HTTP_GET_VARS соответственно.
При активизации (запуске) формы можно
использовать рисунок (изображение) вместо
стандартной кнопки запуска, в тэге подобном
этому:
Когда пользователь нажимает кнопку мыши
где-либо над таким рисунком, сопровождающая
форма передается на сервер с двумя
дополнительными переменными, sub_x и sub_y. Они
содержат координаты места нажатия кнопки
мыши пользователем внутри данного рисунка.
Можно отметить, что практически, реальные
имена переменных передаваемые браузером,
содержат точку вместо символа
подчеркивания, но PHP конвертирует точку в
элемент подчеркивания (underscore)
автоматически.
PHP очевидным образом поддерживает HTTP
кукисы, как это определено в Netscape's
Spec. Кукисы являются механизмом хранения
данных в удаленном браузере, используемым
для поддержки процедуры обмена или
идентификации ответа пользователя.
Кукисы можно устанавливать используя
функцию SetCookie().
Кукисы являются частью заголовка HTTP,
поэтому функция SetCookie()
должна вызываться прежде чем какие-либо
передаваемые данные посылаются браузеру.
Это такое же ограничение, как и для функции Header().
Любые кукисы, посылаемые вам клиентом,
автоматически преобразовываются в
переменные PHP, также как данные методов GET и
POST.
Если необходимо назначить множественные
значения одному кукису, просто добавьте
квадратные скобки [ ] к имени кукиса.
Например:
Учтите, что текущий кукис заменит
предыдущий с тем же именем в вашем браузере,
если только путь или домен не являются
различными. Поэтому, при работе с
программами обслуживания карт вы можете
использовать для сохранения данных счетчик
и посылать его значения дальше и т.п. Пример 5-4. Пример функции SetCookie
PHP автоматически создает переменные
окружения, как и обычные переменные.
Хотя при поступлении информации
механизмы GET, POST и Cookie также атоматически
создают переменные PHP, иногда лучше явным
образом прочитать переменную окружения,
для того чтобы быть уверенным в получении
ее правильной версии. Для этого может
использоваться функция getenv().
Для установки значения переменной
окружения пользуйтесь функцией putenv().
PHP не требует явного определения типа при
объявлении переменной, тип переменной
определяется по контексту в котором она
используется. То есть, если вы присваиваете
строковое значение переменной var,
var становится строкой.
Если затем присвоить переменной var
значение целого (числа), то она станет
целым.
Примером автоматического преобразования
типа в PHP может служить оператор сложения '+'.
Если какой-либо из оперендов является
числом с дробной частью (тип double), то затем
все операнды оцениваются как double и
результат будет иметь тип double. Иначе, эти
операнды будут интерпретированы как целые
(integers) и результат будет так же иметь тип
integer. Отметим, что при этом НЕ меняются типы
самих операндов, меняется только оценка
этих операндов.
Если последние два примера выше кажутся
неясными, смотрите Преобразование
строк.
Если вы хотите чтобы переменная
принудительно оценивалась как имеющая
определенный тип, смотрите раздел Приведение
типа. Если вы желаете изменить тип
переменной, смотрите settype().
Поскольку PHP определяет типы переменных и
преобразует их (в общем) по мере
необходимости, не всегда очевидно какой тип
данная переменная имеет в какой-то
отдельный момент. Поэтому PHP включает
несколько функций, которые позволяют
определить текущий тип переменной. Это
функции gettype(),
is_long(), is_double(),
is_string(), is_array(),
и is_object().
Приведение типа работает в PHP во многом
так же как в C: название требуемого типа
записывается в круглых скобках перед
переменной, которая должна быть приведена к
данному типу.
Допускается следующее приведение типов:
Заметим, что табуляция и пробелы
допускаются внутри круглых скобок, поэтому
следующее функционально эквивалентно:
Когда строковая переменная оценивается
как числовая, результирующее значение и тип
переменной определяются следующим образом.
Переменная string будет оценена как double, если
она содержит любой из символов '.', 'e', или 'E'.
Иначе она будет оценена как integer.
Данное значение задается начальной
частью строковой переменной. Если строка
начинается с допустимых цифровых данных, то
это значение и будет использоваться. Иначе,
будет значение 0 (ноль). Допустимые цифровые
данные - это конструкция из факультативного
символа, следующего за одной или
несколькими цифрами (содержащими
факультативно десятичную точку),
обозначающего экспоненту. Экспонента может
обозначаться символом 'e' или 'E', который
может следовать за одной или несколькими
цифрами.
Дополнительную информацию смотрите в
руководстве Unix страница для strtod(3).
PHP поддерживает как скалярные так и
ассоциативные массивы. Фактически, между
ними нет разницы. Вы можете создать массив
используя функции list()
или array(), или
можно явно задать значение каждого
элемента массива.
Можно также создать массив просто
добавляя в него значения.
Массив может сортироваться функциями asort(),
arsort(), ksort(),
rsort(), sort(),
uasort(), usort(),
и uksort() в
зависимости от типа желаемой сортировки.
Подсчет количества элементов массива
осуществляется функцией count().
Перемещаться по массиву позволяют
функции next() и prev().
Другим типовым способом перемещения по
массиву является использование функции each(). Любой скрипт PHP состоит из
последовательности операторов. Оператор
может быть присваиванием, вызовом функции,
циклом, условным выражением или пустым
выражением (ничего не делающим). Операторы
обычно заканчиваются точкой с запятой.
Также операторы могут быть объединены в
группу заключением группы операторов в
фигурные скобки. Группа операторов также
является оператором. В этой части описаны
различные типы операторов.
PHP определяет несколько констант и
предоставляет механизм для определения
Ваших констант. Константы похожи на
переменные, но они имеют слегка изменЈнный
синтаксис.
ПредопределЈнные константы - это __FILE__ and
__LINE__, которые соответствуют имени файла и
номеру строки, которая выполняется в
настоящий момент. Вы можете определить дополнительные
константы с помощью функций define() и undefine()
. Выражения - это краеугольный камень PHP. В PHP
почти всЈ является выражениями. Простейший
и наиболее точный способ определить
выражение - это "что-то, имеющее значение".
Простейший пример, приходящий на ум это
константы и переменные. Когда вы печатаете
"$a = 5", вы присваиваете значение '5'
переменной $a. '5', очевидно, имеет значение 5,
иными словами'5' это выражение со значением5
(в данном случае'5' это целочисленная
константа).
После этого присваивания вы считаете
значением $a 5, также, если вы напишете $b = $a,
вы будете ожидать того же как, если бы вы
написали $b = 5. Другими словами, $a это также
выражение со значением 5. Если всЈ написано
правильно, то именно так оно и случиться.
Несколько более сложные примеры
выражений - это функции. К примеру,
подумайте на следующей функцией :
Подразумевая, что вы знакомы с
концепциями функции (если нет, взгляните на
часть, посвящЈнную функциям), вы считаете,
что $c = foo() это практически то же самое,
что написать $c = 5 и вы правы. Функции -
это выражения с тем значением, которое они
возвращают. Так как foo() возвращает 5,
значение выражение 'foo()' - 5. Обычно функции
подсчитывают возвращаемое значение,а не
возвращают постоянное значение.
Конечно, значения в PHP не обязаны быть
целыми и зачастую они не являются таковыми.
PHP поддерживает 3 скалярных типа значений :
целое, число с плавающей точкой и строки (
скалярные выражения вы не можете "разбить"
на более маленькие части, как, к примеру,
массивы). PHP поддерживает 2 составных (нескалярных)
типа : массивы и объекты. Каждое из таких
значений может быть присвоено переменной
или возвращено функцией.
Итак, пользователи PHP/FI 2 не должны
почувствовать каких-то перемен. PHP это язык,
ориентированный на выражения, практически
всЈ является выражениями.Обратимся к
примеру, с которым мы уже разобрались, '$a = 5'.
Легко заметить, что тут задействованы два
значения - значение целой константы 5 и
значение $a, которое также становиться
равным 5.На самом деле здесь присутствует
ещЈ одно значение, значение самого
присваивания. Само присваивание
становиться равным присваиваемому
значению, в данном случае - 5.На практике это
означает, что '$a = 5', не обращая внимания на
то, что оно равно выражению со значением 5.
То есть, запись типа '$b = ($a = 5)' похожа на
запись'$a = 5; $b = 5;' (точка с запятой отмечает
конец выражения). Так как присваивания
рассматриваются справа налево, вы также
можете написать '$b = $a = 5'.
Другой хороший пример направления
Основные директивы
конфигурации
bit value
допустимые
сообщения
1
нормальные ошибки
2
нормальные
предупреждения
4
ошибки
синтаксического анализатора
8
некритичные
предупреждения стиля
include_path=.:/home/httpd/php-lib
Значением по умолчанию этой директивы
является . (только текущий
каталог).
include_path=".;c:\www\phplib"
Директивы Конфигурации
Почты
configure делает честную попытку
определить это за вас и устанавливает
значение по умолчанию, но в случае
неудачи вы можете установить это здесь.
Директивы Конфигурации
Safe Mode
Debugger Configuration Directives
Директивы Загрузки
Расширений(Extension Loading)
Директивы конфигурации MySQL
Директивы конфигурации mSQL
Директивы конфигурации
Postgres
Директивы Конфигурации Sybase
Директивы Конфигурации
Sybase-CT
Директивы Конфигурации BC
Math
Директивы Конфигурации
Возможностей Броузера
Директивы Конфигурации
Унифицированных ODBC
Модуль Apache
Директивы конфигурации
модуля Apache
Модуль CGI переадресации
module/action
CGI
Виртуальные хосты
Безопасность
С правильным выбором compile-time и runtime опций
конфигурации он дает вам как раз ту
комбинацию свободы и безопасности, которая
вам нужна.
CGI binary
Возможные
атаки
Вариант 1:
обслуживаются только общие(public) файлы
Вы все еще должны убедиться, что ваши
сценарии PHP не полагаются на этот или другой
путь вызова сценария, ни непосредственно http://my.host/cgi-bin/php/dir/script.php3,
ни переадресацией http://my.host/dir/script.php3.
Вариант 2:
использование --enable-force-cgi-redirect
Action php3-script /cgi-bin/php
AddHandler php3-script .php3
Вариант 3:
установка doc_root или user_dir
Вариант 4: PHP
синтаксический анализатор вне дерева web
#!/usr/local/bin/php
Модуль Apache
Глава 5. Синтаксис и
грамматика
Переход из HTML
1. <? echo("простейший способ, инструкция обработки SGML\n"); ?>
2. <?php echo("при работе с XML документами делайте так\n"); ?>
3. <script language="php">
echo ("некоторые редакторы (подобные FrontPage) не
любят обрабатывающие инструкции");
</script>;
4. <% echo("От PHP 3.0.4 можно факультативно применять ASP-тэги"); %>
Разделение инструкций
<php
echo "Это тест";
?>
<php echo "Это тест" ?>
Типы переменных
Инициализация переменной
Инициализация Массивов
$names[] = "Jill"; // $names[0] = "Jill"
$names[] = "Jack"; // $names[1] = "Jack"
Инициализация объектов
class foo {
function do_foo () {
echo "Doing foo.";
}
}
$bar = new foo;
$bar -> do_foo ();
Область Переменной
$a = 1; /* глобальная область */
Function Test () {
echo $a; /* ссылка на переменную локальной области */
}
Test ();
$a = 1;
$b = 2;
Function Sum () {
global $a, $b;
$b = $a + $b;
}
Sum ();
echo $b;
$a = 1;
$b = 2;
Function Sum () {
$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
}
Sum ();
echo $b;
Function Test () {
$a = 0;
echo $a;
$a++;
}
Function Test () {
static $a = 0;
echo $a;
$a++;
}
Function Test () {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
Test ();
}
$count--;
}
Изменяемые переменные
$a = "hello";
$$a = "world";
echo "$a ${$a}";
echo "$a $hello";
Переменные вне PHP
HTML Формы (GET и POST)
<form action="foo.php3" method="post">
Name: <input type="text" name="name"><br>
<input type="submit">
</form>
<form action="array.html" method="post">
Name: <input type="text" name="personal[name]"><br>
Email: <input type="text" name="personal[email]"><br>
Beer: <br>
<select multiple name="beer[]">
<option value="warthog">Warthog
<option value="guinness">Guinness
</select>
<input type="submit">
</form>
Имена переменных РИСУНКА
АКТИВИЗАЦИИ
<input type=image src="image.gif" name="sub">
HTTP Кукисы
SetCookie ("MyCookie[]", "Testing", time()+3600);
$Count++;
SetCookie ("Count", $Count, time()+3600);
SetCookie ("Cart[$Count]", $item, time()+3600);
Переменные окружения
echo $HOME; /* Показывает переменную окружения HOME,
если она установлена. */
Директивы конфигурации сервера
Изменение типа
$foo = "0"; // $foo является строкой (ASCII 48)
$foo++; // $foo является строкой "1" (ASCII 49)
$foo += 1; // $foo сейчас является целым (2)
$foo = $foo + 1.3; // $foo сейчас имеет тип double (3.3)
$foo = 5 + "10 Little Piggies"; // $foo является целым (15)
$foo = 5 + "10 Small Pigs"; // $foo является целым (15)
Определение типов переменных
Приведение типа
$foo = 10; // $foo is an integer
$bar = (double) $foo; // $bar is a double
$foo = (int) $bar;
$foo = ( int ) $bar;
Преобразование строк
$foo = 1 + "10.5"; // $foo тип double (11.5)
$foo = 1 + "-1.3e3"; // $foo тип double (-1299)
$foo = 1 + "bob-1.3e3"; // $foo тип integer (1)
$foo = 1 + "bob3"; // $foo тип integer (1)
$foo = 1 + "10 Small Pigs"; // $foo тип integer (11)
$foo = 1 + "10 Little Piggies"; // $foo тип integer (11);
// строка содержит 'e'
Манипуляции с массивом
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world"
Глава 6. Элементы языка
Константа
Пример 6-1. Использование __FILE__ и __LINE__
<?php
function report_error($file, $line, $message) {
echo "An error occured in $file on line $line: $message.";
}
report_error(__FILE__,__LINE__, "Something went wrong!");
?>
Пример 6-2. Описание констант
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
undefine ("CONSTANT");
?>
Выражения
function foo () {
return 5;
}