Руководство по РНР 3.0

Перевод Всероссийского Клуба Вебмастеров www.webclub.ru

 

 

Preface

PHP Версии 3.0 - язык написания сценариев, внедренный в HTML. Многое из синтаксиса заимствовано из C, Java и Perl, с добавлением специфичных для PHP возможностей. Задача языка состоит в том, чтобы дать возможность Web-разработчикам легко и быстро создавать динамично изменяемые html-страницы.

Об этом руководстве

Это руководство написано в SGML при помощи DocBook DTD, с использованием DSSSL (Стиль Документа и Язык Спецификаций Семантики) при форматировании. Инструментальные средства, используемые для форматирования HTML, TeX и RTF версий - Jade, написанный Джеймсом Кларком и The Modular DocBook Stylesheets, созданные Норманом Валшом. Структура документации PHP3 была разработана Стигом СЈзером Баккеном.

Глава 1. Введение в PHP3

Что такое PHP3?

PHP версии 3.0 - язык описания сценариев, выполняемых на сервере, встроенный в HTML.

Что может делать PHP3?

Возможно самая сильная и значимая возможность в PHP3 - уровень интеграции с базами данных. Написание веб-страницы работающей с базой данных невероятно проста. В настоящее временя поддерживаются следующие базы данных:

           Oracle
                                Adabas D
           Sybase
                                FilePro
           mSQL
                                Velocis
           MySQL
                                Informix
           Solid
                                dBase
           ODBC
                                Unix dbm
           PostgreSQL

Краткая История PHP

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 в Интернете.

Глава 2. Возможности PHP3

Содержание:

HTTP-аутификация средствами PHP

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.

Создание GIF-файлов с помощью PHP

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 " и выводит возникающее в результате изображение. Это - очень удобный способ не рисовать новые изображения кнопки, каждый раз, когда вы хотите изменить текст кнопки. Этим методом они будут динамически сгенерированы.

Поддержка file upload

PHP может принимать файлы, загруженные из любого браузера, отвечающего стандартам RFC-1867 (которыми являются, например, Netscape Navigator 3 или cтарше, Microsoft Internet Explorer 3 с исправлениями от Microsoft, или cтарше). Эта возможность позволяет людям загружать файлы. С PHP-аутификацией и функциями манипулирования файлами, вы имеете полный контроль над тем, кому позволять загружать файлы и что должно быть выполнено с файлом, если он был загружен.

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

Пример 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 не будет поддерживать возможность загрузки файла.

Поддержка HTTP cookie

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

Регулярные выражения

Регулярные выражения используются для сложного манипулирования строками в PHP. Функции, которые поддерживают регулярные выражения:
          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. */

Обработка ошибок

В PHP есть 4 типа ошибок и предупреждений. Это:

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.

Глава 3. Установка

Эта глава является руководством по конфигурации и установке PHP3. Требуемые знания и программное обеспечение:

Установка из исходных кодов на UNIX:

Загрузка исходных кодов:

Исходные коды последней версии можно найти по адресу: http://www.php.net.

Инструкции по быстрой установке (версия модуля Apache):

 


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.

 

Детали различных параметров конфигурации рассмотрены ниже. Модуль 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):

Adabas D
 
      --with-adabas =DIR

Компиляция с поддержкой Adabas D. Параметр - установочная директория Adabas D, по умолчанию /usr/local/adabasd.

Adabas home page

dBase
	--with-dbase

Включает условный атрибут поддержки Dbase. Не требует внешних библиотек.

filePro
	--with-filepro

Включает условный атрибут поддержки filePro только для чтения. Не требует внешних библиотек.

mSQL
	--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.

mSQL home page

MySQL
	--with-mysql=DIR

Включает поддержку MySQL. Параметр в этой опции - установочная директория MySQL, по умолчанию /usr/local. Она является директорией по умолчанию в дистрибутиве MySQL.

Посмотрите также директивы MySQL Configuration в configuration file.

MySQL home page

iODBC
	--with-iodbc=DIR

Включает поддержку iODBC. Этот признак был разработан сначала для iODBC Driver Manager, перераспределяемого ODBC driver manager, который выполняется под множеством разновидностей UNIX. Параметром этой опции является установочная директория iODBC, по умолчанию /usr/local.

FreeODBC home page

OpenLink ODBC
	--with-openlink=DIR

Включает поддержку OpenLink ODBC. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/openlink.

OpenLink Software's home page

Oracle
	--with-oracle=DIR

Включает поддержку Oracle. Протестирован и должен работать на версиях Oracle от 7.0 до 7.3. Параметром является директория ORACLE_HOME Вы не должны определять этот параметр, если была установлена среда окружения Oracle.

Oracle home page

PostgreSQL
	--with-pgsql=DIR

Включает поддержку PostgreSQL. Параметром является базовая установочная директория PostgreSQL, по умолчанию /usr/local/pgsql.

Посмотрите также директивы Postgres Configuration в configuration file.

PostgreSQL home page

Solid
	--with-solid=DIR

Включает поддержку Solid. Параметром является установочная директория Solid, по умолчанию /usr/local/solid.

Solid home page

Sybase
	--with-sybase=DIR

Включает поддержку Sybase. Параметром является установочная директория Sybase, по умолчанию /home/sybase.

Посмотрите также директивы Sybase Configuration в configuration file.

Sybase home page

Sybase-CT
	--with-sybase-ct=DIR

Включает поддержку Sybase-CT. Параметром является установочная директория Sybase, по умолчанию /home/sybase.

Посмотрите также директивы Sybase-CT Configuration в configuration file.

Velocis
	--with-velocis=DIR

Включает поддержку Velocis. Параметром этой опции является установочная директория OpenLink ODBC, по умолчанию /usr/local/velocis.

Velocis home page

A custom ODBC library
	--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

Unified ODBC
	--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.

LDAP
	--with-ldap=DIR

Включает поддержку LDAP (Lightweight Directory Access Protocol). ). Параметром является базовая установочная директория LDAP, по умолчанию /usr/local/ldap.

Более подробную информацию по LDAP можно найти в RFC1777 и RFC1778. Другие параметры конфигурации:

 

--enable-sysvsem
	--enable-sysvsem

Включает поддержку для семафоров Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.

--enable-sysvshm
	--enable-sysvshm

Включает поддержку разделяемой памяти для Sys V (поддерживается большинством разновидностей UNIX). Для получения подробной информации смотрим Semaphore and Shared Memory documentation.

--with-xml
	--with-xml

Включает поддержку для непроверенных синтаксических анализаторов XML, используя библиотеку от James Clark's expat library. Для больших подробностей обратитесь к XML function reference .

--enable-maintainer-mode
	--enable-maintainer-mode

Включает дополнительные зависимости и предупреждения компилятора, используемые некоторыми разработчиками PHP3.

--with-system-regex
	--with-system-regex

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

--with-config-file-path
	--with-config-file-path=DIR

Маршрут, используемый для просмотра the php3.ini file при старте PHP.

--with-exec-dir
	--with-exec-dir=DIR

Разрешить только запуск исполнимых файлов в DIR при нахождении в защищенном режиме. По умолчанию это /usr/local/bin. Эта опция только устанавливает значение по умолчанию, которое потом можно изменить при помощи директивы safe_mode_exec_dir в configuration file.

--disable-debug
	--disable-debug

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

--enable-safe-mode
	--enable-safe-mode

Включает защищенный режим (safe mode) по умолчанию. Это накладывает некоторые ограничения на действия PHP, таких как открытие файлов только внутри корня документа. Для более подробной информации смотрите Security chapter Пользователи CGI всегда должны включать безопасный режим. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы safe_mode configuration file.

--enable-track-vars
	--enable-track-vars

Указывает PHP3 отслеживать пришедшие переменные GET/POST/cookie в массивах HTTP_GET_VARS, HTTP_POST_VARS и HTTP_COOKIE_VARS. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы track_vars в configuration file.

--enable-magic-quotes
	--enable-magic-quotes

Включает по умолчанию системные квоты. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы magic_quotes_runtime в configuration file. Смотрим также директивы magic_quotes_gpc и magic_quotes_sybase.

--enable-debugger
	--enable-debugger

Включает внутреннюю поддержку PHP3 debugger. Это свойство находится в стадии испытания. Смотрим также директивы Debugger Configuration в configuration file.

--enable-discard-path
	--enable-discard-path

Если это включено, то бинарный PHP CGI может быть безопасно помещен вне дерева web и пользователи не смогут обойти защиту .htaccess. Читайте об этой опции section in the security chapter.

--enable-bcmath
	--enable-bcmath

Включает стиль bc произвольной точности математических функций. Смотрим также опцию bcmath.scale в configuration file.

--enable-force-cgi-redirect
	--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
	--disable-short-tags

Отключает краткую форму <? ?>тегов PHP3. Вы должны отключить краткую форму, если хотите использовать PHP3 c XML. При отключенной краткой форме принимается только тег PHP3 <?php ?>. Эта опция только устанавливает значение по умолчанию, которое потом можно включить или выключить при помощи директивы short_open_tag в configuration file.

--enable-url-includes
	--enable-url-includes

Дает возможность выполнять код на других HTTP и FTP серверах непосредственно из PHP3 с include(). Смотрим также опцию include_path в configuration file.

--disable-syntax-hl
	--disable-syntax-hl

Выключает синтаксическое выделение.

CPPFLAGS и LDFLAGS

При сборке PHP3 установщик просматривает заголовочные и библиотечные файлы в различных директориях, измените соответственно переменные окружения CPPFLAGS и LDFLAGS. Если Вы используете нормальный shell, то вы должны написать LDFLAGS=-L/my/lib/dir CPPFLAGS=-I/my/include/dir ./configure Построение:

 

Когда PHP3 сконфигурирован, Вы готовы к построению исполнимых CGI или библиотеку PHP3. Об этом заботится команда make. Если Вы потерпели неудачу и не можете понять почему, то смотрите раздел Problems section.

VPATH

Проверка:

 

Если Вы собрали PHP3 в качестве программы CGI, Вы можете проверить результат, выполнив команду make test. Это хорошая идея - проверить результат сборки. Этим способом Вы можете обнаружить проблему с Вашим PHP3 на ранней стадии, вместо того, чтобы бороться с этим позже. Контрольное тестирование:

 

Если Вы собрали PHP3 в качестве программы CGI, Вы можете протестировать свою версию при помощи команды make bench. Обратите внимание, что если используется защищенный режим по умолчанию, то тест может не завершиться, если он требует больше, чем 30 секунд. Это происходит потому, что set_time_limit() () не может быть использована в защищенном режиме. Используйте max_execution_time для контроля этого времени в Ваших собственных сценариях. make bench игнорирует configuration file.

Руководство по установке PHP3 для Windows

Это руководство по установке поможет Вам установить и сконфигурировать 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_'. Вы должны изменить свой файл php3.ini и/или все сценарии загрузки расширений с функцией dl() (либо везде удалите префикс 'php3_'). Это предотвратит путаницу между модулями PHP и их библиотеками обеспечения.

ChangeLog, FAQ и обновленную документацию всегда можно найти на официальном сайте PHP или любом из его зеркал.

Основные шаги установки:

Данные шаги должны быть выполнены при любой установке перед специфическими инструкциями сервера:

 

Windows 95/98/NT и PWS/IIS 3:

Рекомендуемый метод конфигурирования этих серверов состоит в использовании INF файлов, поставляемых с дистрибутивом (php_iis_reg.inf). Вы можете отредактировать этот файл и убедитесь, что расширения и установочная директория PHP соответствует Вашим параметрам. Или Вы можете следовать перечисленным ниже шагам, чтобы сделать это вручную.

ПРЕДУПРЕЖДЕНИЕ: Эти шаги включают в себя непосредственную работу с windows registry. Мы настоятельно рекомендуем вам сначала сделать резервную копию registry. Группа разработчиков PHP не несет ответственности, если Вы повредите Ваш registry.

 

 

Пользователи PWS и IIS 3 теперь имеют полностью работающую систему. Пользователи IIS 3 могут использовать tool от Steven Genusa для конфигурирования своих карт сценариев.

Windows NT и IIS 4

Для установки PHP3 на NT Server с запущенным IIS4 следуйте следующим инструкциям:

 

 

Windows 9x/NT и Apache 1.3.x

Вы должны редактировать Ваш файл srm.conf или httpd.conf , чтобы сконфигурировать Apache для работы с исполняемыми PHP CGI.

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

 

 

Для обеспечения возможности использования исходного текста, просто создайте файл сценария PHP и вставьте этот код в: . Substitute original_php_script.php3php3 с именем желательного файла источника (это только один из путей). Обратите внимание, что на Win-Apache все обратные слеши в пути предложения, такого как "c:\directory\file.ext" должны быть заменены на прямые.

Omni HTTPd 2.0b1 для Windows

Данная конфигурация должно быть самая простая:

 


Шаг 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.

Модули 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

Глава 3. Установка. Проблемы?

Читайте FAQ:

Некоторые проблемы встречаются чаще других. Наиболее распространенные описаны в 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 функционирует таким образом, что если его небрежно использовать, то могут возникнуть проблемы с безопасностью на Вашей системе. Лучший путь для предотвращения такой ситуации - всегда знать, что Вы делаете.

Глава 4. Конфигурация


Файл php3.ini

Файл php3.ini читается при запуске синтаксического анализатора PHP. Для версий серверного модуля PHP, это случается только один раз, когда запускается веб-сервер. Для версии CGI это случается на каждом вызове.

Только для каждой директивы указанной здесь, имеется соответствующая директива Apache в httpd.conf. Просто добавьте php3_ в начале имен директив, указанных здесь.

Вы можете посмотреть установочные параметры большинства значений конфигурации вызвав функцию phpinfo().


Основные директивы конфигурации
auto_append_file string

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

Специальное значение none запрещает авто-добавление.

Примечание: Если сценарий обрывается функцией exit(), авто-добавление не произойдет.

auto_prepend_filestring

Определяет имя файла, который автоматически проверяется перед основным файлом. Файл включается так же, как если бы была вызвана функция include(), с использованием include_path.

Специальное значение none запрещает авто-добавление.

cgi_ext string
display_errors boolean

Это определяет, должны ли ошибки печататься на экране как часть HTML вывода или нет.

doc_root string

Главный каталог("root directory") PHP на сервере. Используется только когда он не пустой. Если PHP сконфигурирован при помощи safe mode, то никакие другие файлы за пределами этого каталога не обслуживаются.

engine boolean

Эта директива действительно полезна только в модуле PHP под Apache. Это используется на сайтах, где необходимо включать и выключать синтаксический анализ PHP на определенные каталоги и виртуальные серверы. Установкой php3_engine off в допустимом месте файла httpd.conf, PHP можно запрещать и разрешать.

error_log string

Имя файла, куда сохраняется журнал ошибок(log file) сценариев. Если используется специальное значение syslog, ошибки отправляются в системный журнал(system logger). В UNIX'е это syslog(3), а в Windows NT это журнал событий (event log). Системный журнал не поддерживается в Windows 95.

error_reporting integer

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

Таблица 4-1. Уровни сообщений об ошибках
bit value допустимые сообщения
1 нормальные ошибки
2 нормальные предупреждения
4 ошибки синтаксического анализатора
8 некритичные предупреждения стиля

Значение по умолчанию - 7 (показываются нормальные ошибки, нормальные предупреждения и синтаксические ошибки).
open_basedir string

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

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

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

По умолчанию допускается открытие всех файлов.

gpc_order string

Устанавливает допустимость GET/POST/COOKIE в анализе. Установка по умолчанию этой директивы - "GPC". Установка ее в "GP", например, вынудит PHP полностью игнорировать cookies и перезапишет любые переменные метода GET переменными метода POST с одинаковыми именами.

include_path string

Определяет список каталогов где будут располагаться файлы для функций require() , include() и fopen_with_path() . Формат подобен формату системной переменной окружения PATH : список каталогов разделяется двоеточием в UNIX или точкой с запятой в Windows.

Пример 4-1. UNIX include_path

include_path=.:/home/httpd/php-lib

Пример 4-2. Windows include_path

include_path=".;c:\www\phplib"
Значением по умолчанию этой директивы является . (только текущий каталог).

isapi_ext string

 

log_errors boolean

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

magic_quotes_gpc boolean

Устанавливает magic_quotes состояние для GPC (Get/Post/Cookie) операций. Когда magic_quotes включено (on), все ' (одиночные кавычки), " (двойные кавычки), \ (обратные слэши) и нулевые значения (NUL's) записываются с обратной косой чертой автоматически. Если также включено magic_quotes_sybase, одиночная кавычка записывается с дополнительной одиночной кавычкой вместо обратной косой черты.

magic_quotes_runtime boolean

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

magic_quotes_sybase boolean

Если magic_quotes_sybase также разрешено, одиночная кавычка записывается с дополнительной одиночной кавычкой вместо обратной косой черты, если magic_quotes_gpc или magic_quotes_runtime разрешены.

max_execution_time integer

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

memory_limit integer

Эта установка определяет максимальный размер памяти в байтах, допустимый для этого сценария. Это помогает запретить плохо/некорректно написанным сценариям использовать всю доступную память на сервере.

nsapi_ext string

 

short_open_tag boolean

Задает допустимость короткой формы ( <? ?> тегов PHP . Если вы хотите использовать PHP совместно с XML, эту опцию необходимо отключить. Если опция отключена, вы должны использовать длинную форму тегов ( <?php ?> ).

sql.safe_mode boolean

 

track_errors boolean

Если опция разрешена, последнее сообщение об ошибке всегда будет представлена в глобальной переменной $php_errormsg.

track_vars boolean

Если опция разрешена, входящая информация GET, POST и cookie может быть найдена в глобальных ассоциативных массивах $HTTP_GET_VARS , $HTTP_POST_VARS и $HTTP_COOKIE_VARS , соответственно.

upload_tmp_dir string

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

user_dir string

Основное имя каталога, используемого в домашнем каталоге пользователей для файлов PHP, например public_html .

warn_plus_overloading boolean

Если разрешено, эта опция выдает при выводе PHP сообщение когда оператор плюс( + ) используется в строке. Это должно облегчить поиск сценариев, которые должны быть перезаписаны с заменой на ( . ) - string concatenator.


Директивы Конфигурации Почты

 

SMTP string

Имя DNS или IP адрес сервера SMTP, который должен использоваться PHP под Windows для отправки сообщения функцией mail() .

sendmail_from string

Определяет "From:" - почтовый адрес, который используется в сообщении, отправленном PHP под Windows.

sendmail_path string

Указывает где может быть найдена программа sendmail , обычно это /usr/sbin/sendmail или /usr/lib/sendmail
configure делает честную попытку определить это за вас и устанавливает значение по умолчанию, но в случае неудачи вы можете установить это здесь.

Системы не использующие sendmail должны установить оболочку/замену sendmail их предлагаемой системой почты, если имеется. Например, Qmail пользователи могут указать /var/qmail/bin/sendmail .


Директивы Конфигурации Safe Mode

 

safe_mode boolean

Устанавливает допустимость PHP safe mode. Читайте главу Безопасность (Security) для большей информации

safe_mode_exec_dir string

Если PHP используется в safe mode, system() и другие функции, выполняющие системные программы, отказываются запускать программы, которые находятся не в этом каталоге.


Debugger Configuration Directives

 

debugger.host string

DNS-имя или IP-адрес хоста используемого отладчиком.

debugger.port string

Номер порта используемого отладчиком.

debugger.enabled boolean

Задает допустимость использования отладчика.


Директивы Загрузки Расширений(Extension Loading)

 

enable_dl boolean

Эта директива действительно полезна только в модуле PHP под Apache. Вы можете разрешать/запрещать динамическую загрузку расширений PHP функцией dl() раздельно по каталогам и/или по виртуальным серверам.

Основная причина для выключения динамической загрузки - безопасность. С динамической загрузкой, можно игнорировать все ограничения safe_mode и open_basedir.

По умолчанию динамическая загрузка должна допускаться, за исключением случаев, когда используется safe-mode. В safe-mode всегда недопустимо использование dl() .

extension_dir string

В каком каталоге PHP должен искать динамически загружаемые расширения.

extension string

Какие динамически загружаемые расширения загрузить, при запуске PHP.


Директивы конфигурации MySQL

 

mysql.allow_persistent boolean

Допустить постоянные/устойчивые MySQL соединения.

mysql.max_persistent integer

Максимальное число постоянных MySQL соединений за один процесс.

mysql.max_links integer

Максимальное число MySQL соединений за процесс, включая постоянные соединения.


Директивы конфигурации mSQL

 

msql.allow_persistent boolean

Допустить постоянные mSQL соединения.

msql.max_persistent integer

The maximum number of persistent mSQL connections per process.

msql.max_links integer

Максимальное число постоянных mSQL соединений за один процесс.


Директивы конфигурации Postgres

 

pgsql.allow_persistent boolean

Допустить постоянные/устойчивые соединения Postgres.

pgsql.max_persistent integer

Максимальное число постоянных соединений Postgres за процесс.

pgsql.max_links integer

Максимальное число Postgres соединений за процесс, включая постоянные соединения.


Директивы Конфигурации Sybase

 

sybase.allow_persistent boolean

Допустить постоянные Sybase соединения.

sybase.max_persistent integer

Максимальное число постоянных Sybase соединений за процесс.

sybase.max_links integer

Максимальное число Sybase соединений за процесс, включая постоянные соединения.


Директивы Конфигурации Sybase-CT

 

sybct.allow_persistent boolean

Допустить постоянные Sybase-CT соединения. По умолчанию включено.

sybct.max_persistent integer

Максимальное число постоянных Sybase-CT соединений за процесс. По умолчанию значение -1 означающее неограниченное количество.

sybct.max_links integer

Максимальное число Sybase-CT соединений за процесс, включая постоянные соединения. По умолчанию значение -1 означающее неограниченное количество.

sybct.min_server_severity integer

Сообщения Сервера со степенью более чем или равной sybct.min_server_severity будут сообщены как предупреждения. Эта величина может также устанавливаться из сценария вызовом sybase_min_server_severity() . Значение по умолчанию - 10 , которое сообщает ошибки строгости информации, или выше.

sybct.min_client_severity integer

Сообщения библиотеки Клиента со строгостью более чем или равной sybct.min_client_severity будут сообщены как предупреждениях. Эта величина может также устанавливаться из сценария вызовом sybase_min_client_severity() . По умолчанию - 10, что эффективно запрещает вывод.

sybct.login_timeout integer

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

sybct.timeout integer

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

sybct.hostname string

Имя хоста, с которым вы хотите соединиться, для показа sp_who. По умолчанию - none.


Директивы Конфигурации BC Math

 

bcmath.scale integer

Количество десятичных цифр для всех функций bcmath.


Директивы Конфигурации Возможностей Броузера

 

browscap string

имя файла возможностей браузера.


Директивы Конфигурации Унифицированных ODBC

 

uodbc.default_db string

ИСТОЧНИК ДАННЫХ ODBC, для использования, если ничего не определено в odbc_connect() или odbc_pconnect() .

uodbc.default_user string

Имя пользователя, используемое если нет определений в odbc_connect() или odbc_pconnect() .

uodbc.default_pw string

Пароль, используемый, если не определено в odbc_connect() или odbc_pconnect() .

uodbc.allow_persistent boolean

Допустить постоянные/устойчивые ODBC соединения.

uodbc.max_persistent integer

Максимальное число постоянных ODBC соединений за процесс.

uodbc.max_links integer

Максимальное число ODBC соединений за процесс, включая постоянные соединения.


Модуль Apache


Директивы конфигурации модуля Apache

 


Модуль CGI переадресации module/action

 


CGI

 


Виртуальные хосты

 


Безопасность

PHP - мощный язык и интерпретатор, независимо от того, включен ли он в веб-сервер как модуль или выполняется как разделение исполнимых файлов(binary) CGI, он может иметь доступ к файлам, выполнять команды и открывать сетевые соединения на сервере. Эти свойства дают возможность выполнять что-нибудь на веб-сервере небезопасное по умолчанию. PHP разработан специально для того чтобы быть более безопасным языком для написания программ CGI, чем Perl или C.
С правильным выбором compile-time и runtime опций конфигурации он дает вам как раз ту комбинацию свободы и безопасности, которая вам нужна.

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


CGI binary

Возможные атаки

Использование PHP как исполнимых файлов CGI - выбор для установок, которые по некоторой причине не хотят внедрить PHP как модуль в программное обеспечение сервера (подобно Apache), или PHP будет использоваться с другими типами оболочек CGI, чтобы создать надежное окружение chroot и setuid для сценариев. Эта установка обычно включает установку выполняемого(binary) PHP в каталог cgi-bin на веб-сервере. Бюллетень CERT CA-96.11 рекомендует кроме того, устанавливать любые интерпретаторы в cgi-bin. Даже если исполнимый PHP может быть использован в качестве автономного интерпретатора, PHP разработан для того чтобы предохранить от атаки, которую эта установка делает возможной:

 


Вариант 1: обслуживаются только общие(public) файлы

Если ваш сервер не имеет какой-либо информации, которая не ограничивается паролем или управлением доступом на основе ip, нет потребности в этих опциях конфигурации. Если ваш веб-сервер не позволяет вам производить перенаправление, или сервер не имеет пути, чтобы связаться с исполнимым PHP, который запрашивает благополучно перенаправленный запрос, вы можете указать опцию --disable-force-cgi-redirect для конфигурирования сценария.
Вы все еще должны убедиться, что ваши сценарии PHP не полагаются на этот или другой путь вызова сценария, ни непосредственно http://my.host/cgi-bin/php/dir/script.php3, ни переадресацией http://my.host/dir/script.php3.

Перенаправление может быть сконфигурировано, например в Apache, директивами AddHandler и Action (см. ниже).


Вариант 2: использование --enable-force-cgi-redirect

Эта compile-time опция предохраняет от вызова PHP напрямую с URL подобно http://my.host/cgi-bin/php/secretdir/script.php3. Вместо того чтобы выполнить запрос, PHP выполняет только грамматический разбор в этом способе если он выполнил правила перенаправления вебсервера.

Обычно переадресация в конфигурации Apache сделана со следующими директивами:

Action php3-script /cgi-bin/php
AddHandler php3-script .php3

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


Вариант 3: установка doc_root или user_dir

Размещение активного содержания, такого как скрипты и модули, в каталогах документов веб-сервера иногда является небезопасной практикой. Если при некоторой ошибке конфигурации сценарии не выполняются, они отображаются как обычные 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 отдельно.


Вариант 4: PHP синтаксический анализатор вне дерева web

Очень безопасная опция должна установить синтаксический анализатор PHP где-нибудь вне дерева файлов web. В /usr/local/bin, например. Обратная сторона этой опции заключается в том что вы должны вставлять строку подобно:

 

#!/usr/local/bin/php
       

 

в первую строку любого документа, содержащего PHP тэги. Кроме того, вы должны сделать файлы выполнимыми. Точно так же, как Вы поступаете с любым другим сценарием CGI записанным в Perl или sh или любом другом языке, который использует #! shell-escape механизм для самозапуска.

Чтобы PHP получил возможность корректно оперировать с PATH_INFO и PATH_TRANSLATEDпри такой установке, php анализатордолжен быть скомпилирован с опцией конфигурации --enable-discard-path


Модуль Apache

Когда PHP используется как Apache модуль, не наследуются права пользователя Apache (обычно таковые - "nobody").

Глава 5. Синтаксис и грамматика

Синтаксис PHP заимствован непосредствено из C.   Java и Perl также повлияли на синтаксис данного языка.

Переход из HTML

Есть три способа выхода из HTML и перехода в "режим PHP кода":

Пример 5-1. Способы перехода из HTML

1.  <? echo("простейший способ, инструкция обработки SGML\n"); ?>

2.  <?php echo("при работе с XML документами делайте так\n"); ?>

3.  <script language="php"> 
        echo ("некоторые редакторы (подобные FrontPage) не
               любят обрабатывающие инструкции");
    </script>;

4.  <% echo("От PHP 3.0.4 можно факультативно применять ASP-тэги"); %>
     

Разделение инструкций

Инструкции (утверждения) разделяются также как в C или Perl - точкой с запятой.

Закрывающий тэг (?>) тоже подразумевает конец утверждения, поэтому следующие записи эквивалентны:

<php
    echo "Это тест";
?>

<php echo "Это тест" ?>
     

Типы переменных

PHP поддерживает переменные следующих типов:

Тип переменной обычно не устанавливается программистом; вместо этого, он определяется PHP во время выполнения программы, в зависимости от контекста в котором данная переменная используется.

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

Учтите, что переменная может вести себя по разному  в определенных ситуациях, в зависимости от того, какой тип определен для нее в данное время. Более подробно это описано в разделе Изменение типа.

Инициализация переменной

Для инициализации переменной в PHP  вы просто присваиваите ей значение. Для большинства переменных это именно так; для массивов и объектных переменных, однако, может использоваться несколько иной механизм.

Инициализация Массивов

Массив может инициализироваться одним из двух способов: последовательным присвоением значений, или посредством конструкции array() (которая описана в разделе Функции Массивов).

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

$names[] = "Jill";   // $names[0] = "Jill"
$names[] = "Jack";   // $names[1] = "Jack"
      

Как в C и Perl, элементы массива нумеруются начиная с 0, а не с 1.

Инициализация объектов

Для инициализации объектной переменной используйте новое предписание для сопоставления данного объекта объектной переменной.

class foo {
    function do_foo () { 
        echo "Doing foo."; 
    }
}

$bar = new foo;
$bar -> do_foo ();
      

Область Переменной

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

 
$a = 1; /* глобальная область */ 

Function Test () { 
    echo $a; /* ссылка на переменную локальной области */ 
} 

Test ();
    

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

$a = 1;
$b = 2;

Function Sum () {
    global $a, $b;

    $b = $a + $b;
} 

Sum ();
echo $b;
    

Вышеописанный скрипт выдаст значение "3". Поскольку $a и $b декларируются глобально внутри функции, ссылки на данные переменные трактуются как ссылки на их глобальные версии. Нет ограничений на количество глобальных переменных, которыми можно манипулировать внутри функции.

Вторым способом доступа к переменным из глобальной области является использование специального опеределяемого PHP массива $GLOBALS. При этом предыдущий пример может быть записан как:

$a = 1;
$b = 2;

Function Sum () {
    $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];
} 

Sum ();
echo $b;
    

Массив $GLOBALS является ассоциативным массивом, в котором имя глобальной переменной является ключом, а значение этой переменной является значением элемента массива.

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

Function Test () {
    $a = 0;
    echo $a;
    $a++;
}
    

Эта функция совершенно бесполезна практически, поскольку каждый раз при ее вызове она устанавливает $a в 0 и выводит "0".   Выражение $a++ , которое увеличивает значение переменной, так же бесполезно, поскольку при выходе из функции переменная $a исчезает. Для придания дееспособности функции подсчета, которая не теряла бы нить текущего счета, переменная $a декларируется как статическая:

Function Test () {
    static $a = 0;
    echo $a;
    $a++;
}
    

Теперь, каждый раз при вызове функции Test() она будет выводить значение $a и увеличивать его.

Статические переменные также весьма существенны, когда функции вызываются рекурсивно. Рекурсивные функции - это те, которые вызывают сами себя. Составлять рекурсивную функцию нужно внимательно, т.к. при неправильном написании можно сделать рекурсию неопределенной. Вы должны быть уверены в адекватности способа прекращения рекурсии. Следующая простая функция рекурсивно считает до 10:

Function Test () {
    static $count = 0;

    $count++;
    echo $count;
    if ($count < 10) {
        Test ();
    }
    $count--;
}
    

Изменяемые переменные

Иногда бывает удобно давать переменным изменяемые имена. Такие имена могут изменяться динамически. Обычная переменая устанавливается так:

$a = "hello";
    

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

$$a = "world";
    

С этой точки зрения, две переменных определены и сохранены в символьном дереве PHP: $a с содержимым "hello" и $hello с содержимым "world". Так, инструкция:

echo "$a ${$a}";
    

осуществляет то же самое, что и инструкция:

echo "$a $hello";
    

а именно, обе они выводят: hello world.

Чтобы использовать изменяемые переменные с массивами, необходимо решить проблему неоднозначности. Это означает, что если вы пишете $$a[1], то синтаксическому анализатору необходимо знать, имеете ли вы в виду использовать $a[1] как переменую, или вы предполагаете $$a  как переменную а [1] как индекс этой переменной. Синтаксис для разрешения подобной неоднозначности такой: ${$a[1]} для первого случая и ${$a}[1] для второго.

Переменные вне PHP

HTML Формы (GET и POST)

Когда программой-обработчиком формы является PHP-скрипт, переменные этой формы автоматически доступны для данного скрипта PHP. Например, рассмотрим следующую форму:

Пример 5-2. Простая переменная формы

<form action="foo.php3" method="post">
    Name: <input type="text" name="name"><br>
    <input type="submit">
</form>
      

При активизации формы PHP создаст переменную $name, значением которой будет то содержимое, которое было введено в поле Name: данной формы.

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

Пример 5-3. Более сложные переменные формы

<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>
      

Если PHP-атрибут track_vars включен, через установку конфигурации track_vars или директивой <?php_track_vars?>, тогда переменные, активизированные посредством методов POST или GET, будут также находиться в глобальных ассоциативных массивах $HTTP_POST_VARS и $HTTP_GET_VARS соответственно.

Имена переменных РИСУНКА АКТИВИЗАЦИИ

При активизации (запуске) формы можно использовать рисунок (изображение) вместо стандартной кнопки запуска, в тэге подобном этому:

<input type=image src="image.gif" name="sub">
      

Когда пользователь нажимает кнопку мыши где-либо над таким рисунком, сопровождающая форма передается на сервер с двумя дополнительными переменными, sub_x и sub_y. Они содержат координаты места нажатия кнопки мыши пользователем внутри данного рисунка. Можно отметить, что практически, реальные имена переменных передаваемые браузером, содержат точку вместо символа подчеркивания, но PHP конвертирует точку в элемент подчеркивания (underscore) автоматически.

HTTP Кукисы

PHP очевидным образом поддерживает HTTP кукисы, как это определено в Netscape's Spec. Кукисы являются механизмом хранения данных в удаленном браузере, используемым для поддержки процедуры обмена или идентификации ответа   пользователя. Кукисы можно устанавливать используя функцию SetCookie(). Кукисы являются частью заголовка HTTP, поэтому функция SetCookie() должна вызываться прежде чем какие-либо передаваемые данные посылаются браузеру. Это такое же ограничение, как и для функции Header(). Любые кукисы, посылаемые вам клиентом, автоматически преобразовываются в переменные PHP, также как данные методов GET и POST.

Если необходимо назначить множественные значения одному кукису, просто добавьте квадратные скобки [ ] к имени кукиса. Например:

SetCookie ("MyCookie[]", "Testing", time()+3600);
     

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

Пример 5-4. Пример функции SetCookie

$Count++;
SetCookie ("Count", $Count, time()+3600);
SetCookie ("Cart[$Count]", $item, time()+3600);
     

Переменные окружения

PHP автоматически создает переменные окружения, как и обычные переменные.

echo $HOME;  /* Показывает переменную окружения HOME, 
если она установлена. */
      

Хотя при поступлении информации механизмы GET, POST и Cookie также атоматически создают переменные PHP, иногда лучше явным образом прочитать переменную окружения, для того чтобы быть уверенным в получении ее правильной версии. Для этого может использоваться функция getenv(). Для установки значения переменной окружения пользуйтесь функцией putenv().

Директивы конфигурации сервера

Изменение типа

PHP не требует явного определения типа при объявлении переменной, тип переменной определяется по контексту в котором она используется. То есть, если вы присваиваете строковое значение переменной var, var становится строкой. Если затем присвоить переменной var значение целого (числа), то она станет целым.

Примером автоматического преобразования типа в PHP может служить оператор сложения '+'. Если какой-либо из оперендов является числом с дробной частью (тип double), то затем все операнды оцениваются как double и результат будет иметь тип double. Иначе, эти операнды будут интерпретированы как целые (integers) и результат будет так же иметь тип integer. Отметим, что при этом НЕ меняются типы самих операндов, меняется только оценка этих операндов.

$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)
     

Если последние два примера выше кажутся неясными, смотрите Преобразование строк.

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

Определение типов переменных

Поскольку PHP определяет типы переменных и преобразует их (в общем) по мере необходимости, не всегда очевидно какой тип данная переменная имеет в какой-то отдельный момент. Поэтому PHP включает несколько функций, которые позволяют определить текущий тип переменной. Это функции gettype(), is_long(), is_double(), is_string(), is_array(), и is_object().

Приведение типа

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

$foo = 10;   // $foo is an integer
$bar = (double) $foo;   // $bar is a double
      

Допускается следующее приведение типов:

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

$foo = (int) $bar;
$foo = ( int ) $bar;
      
Преобразование строк

Когда строковая переменная оценивается как числовая, результирующее значение и тип переменной определяются следующим образом.

Переменная string будет оценена как double, если она содержит любой из символов '.', 'e', или 'E'. Иначе она будет оценена как integer.

Данное значение задается начальной частью строковой переменной. Если строка начинается с допустимых цифровых данных, то это значение и будет использоваться. Иначе, будет значение 0 (ноль). Допустимые цифровые данные - это конструкция из факультативного символа, следующего за одной или несколькими цифрами (содержащими факультативно десятичную точку), обозначающего экспоненту. Экспонента может обозначаться символом 'e' или 'E', который может следовать за одной или несколькими цифрами.

$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'
      

Дополнительную информацию смотрите в руководстве Unix страница для strtod(3).

Манипуляции с массивом

PHP поддерживает как скалярные так и ассоциативные массивы. Фактически, между ними нет разницы. Вы можете создать массив используя функции  list() или array(), или можно явно задать значение каждого элемента массива.

 
$a[0] = "abc"; 
$a[1] = "def"; 
$b["foo"] = 13;
     

Можно также создать массив просто добавляя в него значения.

 
$a[] = "hello"; // $a[2] == "hello"
$a[] = "world"; // $a[3] == "world" 
     

Массив может сортироваться функциями asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort(), и uksort() в зависимости от типа желаемой сортировки.

Подсчет количества элементов массива осуществляется функцией count().

Перемещаться по массиву позволяют функции next() и prev(). Другим типовым способом перемещения по массиву является использование функции each().

Глава 6. Элементы языка

Любой скрипт PHP состоит из последовательности операторов. Оператор может быть присваиванием, вызовом функции, циклом, условным выражением или пустым выражением (ничего не делающим). Операторы обычно заканчиваются точкой с запятой. Также операторы могут быть объединены в группу заключением группы операторов в фигурные скобки. Группа операторов также является оператором. В этой части описаны различные типы операторов.

Константа

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

ПредопределЈнные константы - это __FILE__ and __LINE__, которые соответствуют имени файла и номеру строки, которая выполняется в настоящий момент.
Пример 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!");
?>
     

Вы можете определить дополнительные константы с помощью функций define() и undefine() .
Пример 6-2. Описание констант
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // outputs "Hello world."
undefine ("CONSTANT");
?>
     

Выражения

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

Простейший пример, приходящий на ум это константы и переменные. Когда вы печатаете "$a = 5", вы присваиваете значение '5' переменной $a. '5', очевидно, имеет значение 5, иными словами'5' это выражение со значением5 (в данном случае'5' это целочисленная константа).

После этого присваивания вы считаете значением $a 5, также, если вы напишете $b = $a, вы будете ожидать того же как, если бы вы написали $b = 5. Другими словами, $a это также выражение со значением 5. Если всЈ написано правильно, то именно так оно и случиться.

Несколько более сложные примеры выражений - это функции. К примеру, подумайте на следующей функцией :

function foo () {
    return 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'.

Другой хороший пример направления