Php руководство по рнр 3 0 функции динамической загрузки

Содержание

Php руководство по рнр 3 0 функции динамической загрузки

Этот список включает встроенные директивы php.ini которые вы можете использовать для настроки PHP. Директивы, которые обрабатываются модулями, перечислены и подробно описаны на страницах документаций соответствующих модулей; К примеру, информация о директивах сессий может быть найдена на странице сессий .

Таблица G-3. Опции Httpd

Имя По умолчанию Изменяемый Список изменений
async_send «0» PHP_INI_ALL

Таблица G-4. Опции языка и прочих настроек

Имя По умолчанию Изменяемый Список изменений
short_open_tag «1» PHP_INI_PERDIR PHP_INI_ALL в PHP php.ini
zend.ze1_compatibility_mode «0» PHP_INI_ALL Доступна с версии PHP 5.0.0.

Краткое разъяснение конфигурационных директив.

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

Замечание: Эта директива также влияет на сокращение , которое идентично записи . Для использования этого сокращения, директива short_open_tag должна быть включена.

Включает использование тегов в стиле ASP в дополнение к обычным тегам . Это касается и сокращения для отображения значения переменных . Для получения дополнительной информации, обратитесь к разделу Вставка в HTML .

Замечание: Поддержка тегов в стиле ASP выла добавлена в версии PHP 3.0.4.

Количество значащих цифр, отображаемых для десятичных дробей.

Включение совместимости с 2000 годом (создаст проблемы с несовместимыми браузерами).

Включена ли возможность жёсткой передачи аргументов по ссылке во время вызова функции. Этот метод является устаревшим и скорее всего не будет поддерживаться будущими версиями PHP/Zend. Рекомендуемым методом указания, какие аргументы должны быть переданы по ссылке, является указание этого при объявлении функции. Вам рекомендуется попытаться отключить эту опцию, чтобы убедиться, что ваши скрипты будут правильно работают без неё и что они будут работать с будущими версиями языка (вы будете получать предупреждение каждый раз, когда вы будете пользоваться этим методом, и аргументы будут передаваться по значению, а не по ссылке).

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

Определяет, разрешено ли PHP выдавать факт своего присутствия на сервере (например, добавляя свою подпись в заголовок веб-сервера). Ни в коей мере это не является угрозой безопасности, но это даёт возможность определить, используете ли вы PHP на своём сервере.

Включает режим совместимости с Zend Engine 1 (PHP 4). Это влияет на клонирование, приведение типов и сравнение объектов.

Таблица G-5. Ограничения ресурсов

Имя По умолчанию Изменяемый Список изменений
memory_limit «8M» PHP_INI_ALL

Краткое разъяснение конфигурационных директив.

Эта директива задаёт максимальный объём памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы использовать эту директиву, вы должны указать её на этапе компиляции. Так, ваша строка конфигурации должна включать: —enable-memory-limit . Обратите внимание, что вы должны установить эту директиву в -1, если не хотите ограничивать объём памяти.

Начиная с версии PHP 4.3.2, если memory_limit включён, стала доступна функция PHP memory_get_usage() .

Таблица G-6. Конфигурационные опции обработки данных

Имя По умолчанию Изменяемый Список изменений
track_vars «On» PHP_INI_??
arg_separator.output «&» PHP_INI_ALL Доступна с версии PHP 4.0.5.
arg_separator.input «&» PHP_INI_PERDIR Доступна с версии PHP 4.0.5.
variables_order «EGPCS» PHP_INI_ALL
register_globals «0» PHP_INI_PERDIR PHP_INI_ALL в PHP track_vars boolean

Если включено, переменные окружения, GET, POST, Cookie и серверные переменные могут быть получены через глобальные ассоциативные массивы $_ENV , $_GET , $_POST , $_COOKIE и $_SERVER .

Обратите внимание, что начиная с версии PHP 4.0.3, track_vars всегда включена.

Этот разделитель используется в генерируемых PHP URL’ах в качестве разделителя аргументов.

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

Замечание: Каждый символ в этой директиве считается разделителем!

Устанавливает порядок обработки переменных EGPCS (Environment, GET, POST, Cookie, Server). Значением по умолчанию для этой директивы является «EGPCS». Установка её в «GP», к примеру, заставит PHP полностью игнорировать переменные окружения, cookie и сервера, а так же перезаписать любую GET-переменную POST-переменной с таким же именем.

Когда включено, переменные SERVER и ENV создаются в тот момент, когда они впервые используются (Just In Time), а не в начале выполнения скрипта. Если эти переменные в скрипте не используются, включение этой директивы приведёт к росту производительности.

Регистрировать или нет переменные EGPCS (Environment, GET, POST, Cookie, Server) в качестве глобальных переменных.

Замечание: На поведение register_globals влияет директива variables_order .

Сообщает PHP, следует ли объявляеть переменные argv и argc (которые будут содержать GET-информацию).

Эта директива стала доступна начиная с версии PHP 5.0.0.

Устанавливает максимальный допустимый размер POST-данных. Это свойство также влияет на закачиваемые файлы. Чтобы закачивать большие файлы, это значение должно быть выше upload_max_filesize .

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

Замечание: Эта опция не доступна в PHP 4. Вместо неё используйте variables_order .

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

Специальное значение none отключает эту директиву.

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

Специальное значение none отключает эту директиву.

Начиная с версии 4.0b4, PHP всегда отправляет кодировку по умолчанию в заголовке Content-Type. Чтобы отключить отправку кодировки, просто установите её пустой строкой.

Всегда объявлять переменную $HTTP_RAW_POST_DATA.

Разрешает обработку HTTP-запросов WebDAV при помощи PHP-скриптов (например PROPFIND, PROPPATCH, MOVE, COPY и т.д.). Эта директива не существует начиная с версии PHP 4.3.2. Если вы хотите получить POST-данные этих запросов, вы должны также включить always_populate_raw_post_data .

Таблица G-7. Конфигурационные Опции Путей и Директорий

Имя По умолчанию Изменяемый Список изменений
include_path «.;/path/to/php/pear» PHP_INI_ALL
doc_root NULL PHP_INI_SYSTEM
user_dir NULL PHP_INI_SYSTEM
extension_dir «/path/to/php» PHP_INI_SYSTEM
cgi.fix_pathinfo «0» PHP_INI_SYSTEM
cgi.force_redirect «1» PHP_INI_SYSTEM
cgi.redirect_status_env «» PHP_INI_SYSTEM
fastcgi.impersonate «0» PHP_INI_SYSTEM
cgi.rfc2616_headers «0» PHP_INI_SYSTEM

Краткое разъяснение конфигурационных директив.

Пример G-1. include_path в Unix

Пример G-2. include_path в Windows

Использование . в include_path позволяет задавать относительные пути для подключения файлов, так как точка означает текущую директорию.

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

В какой директории PHP должен искать динамически загружаемые расширения. См. также: enable_dl и dl() .

Which dynamically loadable extensions to load when PHP starts up.

Обеспечивает поддержку правильных PATH_INFO/PATH_TRANSLATED в CGI. Раньше PHP просто устанавливал PATH_TRANSLATED в SCRIPT_FILENAME и не обращал внимания на PATH_INFO. Для получения дополнительной информации о PATH_INFO, обратитесь к спецификации CGI. Установка этого значения в 1 заставит PHP CGI исправлять свой путь в соответствии со спецификацией. Значение 0 соответствует предыдущему поведению. По умолчанию установлен 0. Вы должны исправить свои скрипты так, чтобы они использовали SCRIPT_FILENAME вместо PATH_TRANSLATED.

Директива cgi.force_redirect необходима для обеспечения безопасности во время работы PHP в качестве CGI под большинством веб-серверов. Если оставить неопределённым, по умолчанию PHP включает эту директиву. Вы можете выключить её на свой страх и риск .

Замечание: Пользователям Windows: Вы можете безопасно выключить её под IIS. Более того, вы должны это сделать. Чтобы заставить OmniHTTPD или Xitami работать, вы должны отключить эту директиву.

Если cgi.force_redirect включена и вы работаете не под веб-сервером Apache или Netscape (iPlanet), вам может понадобится установить переменную окружения, которую будет искать PHP чтобы убедится, что он может продолжать выполнение.

Замечание: Установка этой переменной может повлечь за собой проблемы с безопасностью, так что вы должны знать, что вы делаете .

FastCGI под IIS (в ОС на базе WINNT) поддерживает возможность имперсонации прав безопасности вызывающего клиента. Это позволяет IIS определить контекст безопасности, в котором выполняется запрос. mod_fastcgi под Apache на текущий момент не поддерживает эту возможность (03/17/2002). Установите в 1 при работе под IIS. Значение по умолчанию — ноль.

Сообщает PHP, какой тип заголовков использовать при отправке кода ответа HTTP. Если установлено в 0, PHP отправляет заголовок «Status:», который поддерживается Apache и другими веб-серверами. Если установлено в 1, PHP отправляет заголовок, соответствующий RFC 2616 . Оставьте в значении 0, если вы не уверены в том, что это значит.

Таблица G-8. Конфигурационные Опции Закачивания Файлов

Имя По умолчанию Изменяемый Список изменений
file_uploads «1» PHP_INI_SYSTEM PHP_INI_ALL в PHP file_uploads boolean

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

Максимальный размер закачиваемого файла.

Таблица G-9. Конфигурационные Опции Общего SQL

Имя По умолчанию Изменяемый Список изменений
sql.safe_mode «0» PHP_INI_SYSTEM

Краткое разъяснение конфигурационных директив.

Отладчик по умолчанию реализован только в PHP 3. Для получения дополнительной информации обратитесь к разделу Прил. E .

Имя DNS или IP адрес хоста, используемый отладчиком.

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

Определяет, включён ли отладчик.

Предостережение
List of Supported Timezones
Пред. Начало След.
Директивы php.ini

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

Создание динамической функции на PHP

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

Занимается этим функция create_function(), которая принимает параметры функции и её тело.

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

Применяется функция create_function() редко, единственное разумное применение, которое приходит на ум — это использование её при пользовательской сортировке:

Такая запись значительно короче, чем если бы мы отдельно создавали функцию сортировки. Однако, функция create_function() работает очень медленно. Если бы мы при сортировке создали отдельную функцию заранее, то данный скрипт работал бы в 2.5 раза быстрее. Поэтому если нет необходимости создавать динамические функции в PHP, то не делайте этого.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

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

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 5 ):

    В случае сортировки сработает и безымянная функция: usort($array, function($x, $y) )

    Не лучше ли сделать так usort($array,function($x,$y ));

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

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

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Php руководство по рнр 3 0 функции динамической загрузки

    Поведение этих функций зависит от установок в php.ini .

    Настройки PHP/Inf-настройки конфигурации

    Имя По умолчанию Место изменения Список изменений
    assert.active «1» PHP_INI_ALL
    assert.bail «0» PHP_INI_ALL
    assert.warning «1» PHP_INI_ALL
    assert.callback NULL PHP_INI_ALL
    assert.quiet_eval «0» PHP_INI_ALL
    assert.exception «0» PHP_INI_ALL Доступна с версии PHP 7.0.0.
    enable_dl «1» PHP_INI_SYSTEM Эта возможность устарела и будет обязательно удалена в будущем.
    max_execution_time «30» PHP_INI_ALL
    max_input_time «-1» PHP_INI_PERDIR
    max_input_nesting_level «64» PHP_INI_PERDIR Доступна с PHP 5.2.3.
    max_input_vars 1000 PHP_INI_PERDIR Доступна с PHP 5.3.9.
    magic_quotes_gpc «1» PHP_INI_PERDIR Удалена в PHP 5.4.0.
    magic_quotes_runtime «0» PHP_INI_ALL Удалена в PHP 5.4.0.
    zend.enable_gc «1» PHP_INI_ALL Доступна с PHP 5.3.0.

    Для подробного описания констант PHP_INI_*, обратитесь к разделу Где могут быть установлены параметры конфигурации.

    Краткое разъяснение конфигурационных директив.

    Завершение работы скрипта при провале проверки утверждений.

    Вызов предупреждений PHP для каждой проваленной проверки утверждения.

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

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

    Генерирует исключение AssertionError для неудачной проверки утверждения.

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

    Главной причиной, по которой требуется выключение динамической загрузки, является безопасность. С помощью динамической загрузки можно обойти все open_basedir ограничения. По умолчанию динамическая загрузка разрешена, за исключением работы в безопасный режим. В безопасный режим невозможен вызов dl() .

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

    На максимальное время выполнения не влияют системные вызовы, потоковые операции и т.п. За дополнительной информацией обращайтесь к документации к функции set_time_limit() .

    При работе в безопасный режим эту настройку нельзя изменить функцией ini_set() . Если значение все же нужно изменить, надо либо выключить безопасный режим, либо изменить значение прямо в php.ini .

    Веб-серверы обычно имеют свои настройки тайм-аута, по истечении которого сами завершают выполнение скрипта PHP. В Apache есть директива Timeout, в IIS есть функция CGI timeout. В обоих случаях по умолчанию установлено 300 секунд. Точные значения можно узнать из документации к веб-серверу.

    Эта директива задает максимальное время в секундах, в течение которого скрипт должен разобрать все входные данные, переданные запросами вроде POST или GET. Это время измеряется от момента, когда PHP вызван на сервере до момента, когда скрипт начинает выполняться. Значение по умолчанию -1, что означает, что будет использоваться max_execution_time. Если установить равным , то ограничений по времени не будет.

    Задает максимальную глубину вложенности входных переменных (то есть $_GET , $_POST .)

    Сколько входных переменных может быть принято в одном запросе (ограничение накладывается на каждую из глобальных переменных $_GET, $_POST и $_COOKIE отдельно). Использование этой директивы снижает вероятность сбоев в случае атак с использованием хеш-коллизий. Если входных переменных больше, чем задано директивой, выбрасывается предупреждение E_WARNING , а все последующие переменные в запросе игнорируются.

    Данная возможность была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.3.0 и была УДАЛЕНА в PHP 5.4.0.

    Задает режим magic_quotes для GPC (Get/Post/Cookie) операций. Если magic_quotes включен, все ‘ (одинарные кавычки), » (двойные кавычки), \ (обратный слеш) и NUL автоматически экранируются обратным слешем.

    Если включена директива magic_quotes_sybase, она замещает magic_quotes_gpc. Если включены обе директивы, то экранироваться будут только одинарные кавычки, причем экранированы они будут теми же кавычками: ». Двойные кавычки, обратные слеши и NUL при этом останутся нетронутыми и неэкранированными.

    Данная возможность была объявлена УСТАРЕВШЕЙ, начиная с PHP 5.3.0 и была УДАЛЕНА в PHP 5.4.0.

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

    Включает или отключает сборщик циклических ссылок.

    Блог Александра Денисюка

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

    §1. Общие принципы

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

    Для валидации картинки по URL мы будем использовать функцию getimagesizefromstring(), т. к. cURL скачает её в переменную для дальнейших манипуляций.

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

    §2. Правила безопасности

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

    Если есть чем дополнить «Правила безопасности», тогда оставляйте свои замечания или ссылки на статьи по безопасности в комментариях к этому руководству, а я опубликую их в этом параграфе.

    §3. Конфигурация php.ini

    PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits», «Data Handling» и «File Uploads», а затем отредактировать, по необходимости, следующие значения:

    Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits» больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

    50 Мбайт памяти. Кроме того, нам нужно знать максимальное время загрузки одного файла с локальной машины и по ссылке, дабы установить достаточное время выполнения скрипта в max_execution_time и не пугать пользователей ошибками.

    §4. Загрузка картинок из формы

    Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype=»multipart/form-data» (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

    Для поля выбора файла мы используем имя name=»upload» в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES[‘upload’] с таким же именем, которая в массиве содержит информацию о файле:

    Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘upload’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file(). Если что-то идёт не по плану, значит выводим ошибку на экран.

    Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize(), которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo. Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

    На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize(), которой скормим сам бинарный файл $_FILES[‘upload’][‘tmp_name’]. В результате мы получим массив максимум из 7 элементов:

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

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

    На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation, который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file().

    §5. Загрузка изображения по ссылке

    Для загрузки изображения по ссылке нам понадобиться библиотека cURL, которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents(), но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям, включить проверку сертификата, указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами:

    Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw. Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

    Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

    Для сохранения изображения на диск можно воспользоваться file_put_contents(), которая запишет контент в файл. Новое имя файла мы создадим через функцию md5(), а расширение сделаем из image_type_to_extension(). Теперь мы можем загружать любые картинки по ссылке.

    §6. Настройка выбора нескольких файлов

    В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea. Для загрузки файлов из формы мы продолжим дальше работать с $_FILES. Наша новая HTML-форма будет немного отличаться от старой.

    В конец имени поля выбора файла name=»upload[]» добавились фигурные скобки и аттрибут multiple, который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES, но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

    Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name=»upload», где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST[‘upload’] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

    Вы можете улучшить форму для загрузки изображений, например, воспользоваться библиотекой FineUploader или jQuery FileUpload, чтобы настроить выбор картинок с определённым расширением.

    Php руководство по рнр 3 0 функции динамической загрузки

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

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

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

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

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

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

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

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

    Debugger Configuration Directives

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

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

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

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

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

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

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

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

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

    Добро пожаловать

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

    Переводы

    Руководство PHP: Правильный путь уже (или вскоре будет) переведено на множество различных языков:

    Дисклеймер

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

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

    Как внести вклад

    Помогите сделать этот сайт лучшим ресурсом для начинающих PHP программистов! Помочь используя GitHub

    Расскажите о нас

    Руководство PHP: Правильный путь содержит веб-баннеры, которые вы можете использовать на своём сайте. Окажите поддержку, показав начинающим PHP-разработчикам где они могут найти полезную информацию!

    Начало

    Использование стабильной версии (7.2)

    Если вы только начинаете работу с PHP, убедитесь в том, что вы используете текущую стабильную версию PHP 7.2. За последние несколько лет PHP добился больших успехов, добавив новые возможности.

    Наиболее часто в ближайшем будущем вы будете видеть, что используются версии PHP 5.x, с последней 5.6. Но вы должны попробовать использовать последнюю стабильную версию, если это возможно. Не дайте скромной разнице между числами 5.2 и 5.6 ввести вас в заблуждение, эта разница представляет важные изменения. Если вам нужна функция или пример её использования, вы всегда можете найти документацию на php.net.

    Встроенный веб-сервер

    Вы можете начать изучение PHP без необходимости в установке и конфигурировании полноценного веб-сервера (необходим PHP 5.4 или новее). Для запуска сервера вам необходимо выполнить следующую команду из терминала в корневой папке веб-проекта:

    Установка на Mac

    OSX поставляется с предзапакованным PHP, но, в лучшем случае, он немного отстает от стабильной версии. Lion поставляется с PHP 5.3.6 и Mountain Lion имеет 5.3.10.

    Для обновления PHP в OSX вы можете установить его с помощью нескольких пакетных менеджеров, наиболее рекомендуемый из которых php-osx by Liip.

    Другой вариант, скомпилировать самостоятельно, в этом случае убедитесь, что у вас установлен либо Xcode, либо его аналог от Apple “CLI для Xcode”, который можно загрузить с Apple Mac Developer Center.

    В качестве полного набора «всё-в-одном», который включает PHP, веб-сервер Apache и СУБД MySQL, и всё это с хорошим управлением через GUI, попробуйте MAMP.

    Установка в Windows

    PHP для Windows можно получить несколькими путями. Вы можете загрузить установочные файлы и, до недавнего времени, вы могли использовать ‘.msi’ установщик. Начиная с PHP версии 5.3.0 установщик не поддерживается.

    Для изучения и локальной разработки вы можете использовать встроенный в PHP 5.4+ веб-сервер, о конфигурации которого можно не беспокоиться. Если вы предпочитаете сервера «всё-в-одном», которые включают в себя полноценный веб-сервер и MySQL, тогда можете воспользоваться такими инструментами, как Web Platform Installer, Zend Server CE, XAMPP или WAMP, которые помогут быстро развернуть окружение для разработки в Windows. Но, стоит сказать, что эти инструменты будут отличаться от продакшна, так что будьте осторожны и учитывайте эти различия, если вы работаете на Windows и деплоите на Linux.

    Если вам нужно запустить конечную систему на Windows, то IIS7 даст вам лучшую стабильность и производительность. Вы можете использовать phpmanager (плагин для IIS7) для легкого конфигурирования и управления PHP. IIS7 поставляется с встроенным FastCGI, вам нужно просто настроить PHP в качестве обработчика. Для получения помощи и дополнительной информации посетите iis.net.

    Vagrant

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

    Если вы разрабатываете на Windows и деплоите на Linux (или что-либо отличающееся от Windows) или разрабатываете в команде, вы должны рассмотреть возможность использования виртуальной машины. Это звучит сложно, но, используя Vagrant, вы можете установить простую виртуальную машину всего лишь в несколько шагов. Они могут быть как выполнены вручную, так и с помощью специализированного софта, например, Puppet или Chef, который автоматизирует эту задачу. Использование этого софта гарантирует использование одинаковой конфигурации для нескольких машин, что избавляет вас от необходимости поддержки сложных списков установки. Вы также можете удалить вашу машину, и пересоздать её без большого количества ручных шагов, что делает создание «свежей» виртуалки очень простым.

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

    Стандарты написания кода

    Сообщество PHP является очень большим и разнообразным, сочетая в себе бесчисленное количество библиотек, фреймворков, и различных компонентов. Для PHP разработчика это обычная практика — выбрать несколько из них и соединить в одном проекте. Очень важно придерживаться общих стандартов написания кода (так точно, насколько это возможно) в своём PHP коде, чтобы позволить разработчикам сочетать и использовать различные библиотеки для своих проектов.

    Группа Совместимости Фреймворков предложила и одобрила ряд стилевых рекомендаций, известных как PSR-0, PSR-1 и PSR-2. Не дайте веселым именам смутить вас, эти рекомендации представляют собой набор правил, которых начинают придерживаться такие проекты, как Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium и другие. Вы можете использовать их при работе над собственным проектом, или в дальнейшем использовать ваш собственный стиль.

    В идеале, вы должны писать PHP код, придерживаясь известных стандартов. Это может быть любая комбинация PSR-ов, или один из стандартов кода, сделанных PEAR или Zend. Это позволит другим разработчикам легко читать и работать с вашим кодом, и приложения, которые используют компоненты, смогут сохранить структуру приложения, даже работая с огромным количеством стороннего кода.

    Вы можете использовать PHP_CodeSniffer чтобы проверить код на соответствие одной из этих рекомендаций, а также плагин для текстовых редакторов, таких как, к примеру, Sublime Text 2 чтобы получить отчёт в реальном времени.

    Используйте PHP Coding Standards Fixer, созданный Фабиеном Потенсьером, для автоматического исправления синтаксиса вашего кода так, чтобы он соответствовал этим стандартам, что спасет вас от исправления каждой проблемы вручную.

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

    Основные моменты языка

    Парадигмы программирования

    PHP представляет собой гибкий, динамичный язык, который поддерживает несколько техник программирования. Он значительно развился в течение последних нескольких лет: добавлена мощная объектно-ориентированная модель в PHP 5.0 (2004), анонимные функции (замыкания) и пространства имен в PHP 5.3 (2009), а также трейты в PHP 5.4 (2012).

    Объектно-ориентированное программирование

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

    Функциональное программирование

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

    Рекурсия — это особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но бо́льшая часть кода PHP фокусируется на итерации.

    Анонимные функции (замыкания) поддерживаются PHP начиная с версии 5.3 (2009).

    В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а также улучшена поддержка callables (всё, что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.

    Meta Programming

    PHP поддерживает несколько форм метапрограммирования, что реализуется с помощью таких механизмов, как Reflection API и Магические Методы. Доступно много Магических Методов, например: __get() , __set() , __clone() , __toString() , __invoke() , и т.д., которые позволяют отслеживать поведение внутри класса. Разработчики Ruby часто говорят, что PHP не хватает method_missing , но он доступен, как __call() и __callStatic() .

    Пространства имен

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

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

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

    Один из рекомендуемых способов использования пространств имен описан в PSR-4, который призван обеспечить стандарты для описания файлов, классов и пространств имен, что позволяет создавать подключаемый (plug-and-play) код.

    Стандартная Библиотека PHP (SPL)

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

    Интерфейс командной строки

    Главная цель, с которой был создан PHP — это разработка веб-приложений, но он также полезен при написания кода для интерфейса командной строки (CLI). PHP программы командной строки могут помочь вам автоматизировать такие общие задачи, как тестирование, развертывание и администрирование приложения.

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

    Попробуйте запустить PHP из консоли:

    Опция -i выдаст вам конфигурацию вашего PHP, подобно функции phpinfo .

    Опция -a предоставляет доступ к интерактивной оболочке, подобно ruby IRB или интерактивной оболочки python. Также существует целый ряд других полезных опций командной строки.

    Давайте напишем простую «Привет, $name» программу CLI. Чтобы это сделать, создайте файл с именем hello.php , как показано ниже.

    PHP устанавливает две специальные переменные, основанных на аргументах, с которыми запущен ваш скрипт. $argc — это переменная с числовым значением, которая содержит количество переданных аргументов, $argv — это массив, содержащий значение каждого аргумента. Первый аргумент — всегда название вашего PHP скрипта, в этом случае hello.php .

    Выражение exit() используется с ненулевым числом, чтобы дать оболочке понять, что команда не удалась. Часто используемые коды завершения можно найти здесь

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

    XDebug

    Один из самых полезных инструментов в разработке программного обеспечения — хороший отладчик. Он позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека. XDebug — это PHP отладчик, который может использоваться различными IDE, чтобы дать вам возможность устанавливать Брейкпоинты (точки отладки кода) и контролировать стек. Он также позволяет использовать такие инструменты, как PHPUnit и KCacheGrind, для покрытия кода тестами и его профилирования.

    Если вы оказываетесь в безвыходном положении при использовании var_dump/print_r, и у вас не получается найти решение, то возможно вам поможет использование отладчика.

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

    Стандартно, вы отредактируете ваш Apache VHost или .htaccess файл со следующими значениями:

    “remote_host” и “remote_port” будут указывать на ваш локальный компьютер и порт, который вы указали в вашей IDE для прослушивания. Дальше достаточно включить режим «ожидания соединений» в вашей IDE, и загрузить URL:

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

    Менеджер зависимостей

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

    В настоящее время существует две основные системы управления пакетами для PHP — Composer и PEAR. Какая из них подходит именно вам? Ответ — обе.

    • Используйте Composer для управления зависимостями одного проекта.
    • Используйте PEAR для управления зависимостями всех проектов во всей вашей системе.

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

    Composer и Packagist

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

    На данный момент существует много PHP библиотек, которые совместимы с Composer, готовых для использования в вашем проекте. Список этих «пакетов» есть на Packagist, официальном репозитории для Composer-совместимых PHP библиотек.

    Как установить Composer

    Вы можете установить Composer локально (в вашей текущей рабочей директории; хотя это не рекомендуется) или глобально (например /usr/local/bin). Предположим, вы хотите установить Composer локально. Из корневой директории вашего проекта выполните:

    Это позволит загрузить файл composer.phar (бинарный PHP-архив). Вы можете запустить его, используя php для управления зависимостями вашего проекта. Обратите внимание: Если вы скачаете код напрямую в ваш интерпретатор, пожалуйста, сперва прочитайте код онлайн, для подтверждения его безопасности.

    Как установить Composer (вручную)

    Ручная установка Composer — это продвинутая техника; однако, существуют причины, по которым разработчик может предпочесть именно этот метод использованию интерактивной установки. Интерактивная установка проверяет настройки PHP, чтобы подтвердить, что:

    • Используется необходимая версия PHP
    • Файлы .phar могут быть верно выполнены
    • Определенные права на каталог достаточны
    • Не установлены конфликтные расширения
    • Установлены необходимые настройки php.ini

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

    Путь $HOME/local/bin (или другой каталог, выбранный вами) должен находиться в вашей переменной окружения $PATH . Это позволит быть доступной команде composer .

    Если вы прочтете документацию Composer, которая гласит, что нужно запускать Composer с помощью команды php composer.phar install , вы можете заменить эту команду на:

    Как объявить и установить зависимости

    Composer продолжает следить за зависимостями вашего проекта в файле composer.json . Вы можете управлять им вручную, если вам нравится, или же использовать сам Composer. Команда php composer.phar require добавляет зависимость в проект и, если в каталоге нет файла composer.json , он будет создан. Далее мы рассмотрим пример, который добавляет Twig, как зависимость вашего проекта. Запустите это в корневой директории вашего проекта, куда вы загружали composer.phar :

    Аналогично команда php composer.phar init проведет вас через создание полного файла composer.json для вашего проекта. Есть и другой путь, когда вы создадите файл composer.json вы можете сказать Composer, чтобы он скачал все ваши зависимости в папку vendors/ . Это также применимо для проектов, которые вы загрузили и которые предоставляют файл composer.json :

    Затем добавьте этот код в основной PHP-файл вашего приложения; это укажет PHP использовать автозагрузчик Composer для зависимостей вашего проекта.

    Теперь вы можете использовать зависимости вашего проекта и они будут автоматически загружаться (по требованию).

    Обновление зависимостей

    Composer создает файл composer.lock который хранит точную версию каждого пакета, который он загрузил во время первого запуска php composer.phar install . Если вы поделились проектом с другими разработчиками и файл composer.lock является частью него, то при запуске php composer.phar install они получат ту же версию, что и вы. Чтобы обновить ваши зависимости запустите php composer.phar update .

    Очень удобно гибко указывать требуемые версии. Если вы нуждаетесь в версии

    1.8, что значит “всё что новее 1.8.0, но меньше 2.0.x-dev”. Вы также можете использовать шаблон * , например 1.8.* . Теперь команда Composer php composer.phar update обновит все ваши зависимости до новейших версий, которые соответствуют указанным ограничениям.

    Проверка ваших зависимостей на безопасность

    Security Advisories Checker является веб-сервисом и инструментом командной строки, оба из которых изучают ваш файл composer.lock и сообщают, если есть необходимость в обновлении какой-либо из ваших зависимостей.

    Другим ветераном среди пакетных менеджеров, которым наслаждаются многие PHP-разработчики, является PEAR. Он работает практически так же, как и Composer, но имеет несколько важных отличий.

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

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

    Как установить PEAR

    Вы можете установить PEAR, загрузив установщик phar и выполнив его. Документация PEAR содержит подробную инструкцию по установке для каждой операционной системы.

    Если вы используете Linux, вы также можете посмотреть наличие PEAR в пакетном менеджере вашего дистрибутива. Debian и Ubuntu, к примеру, содержат информацию о пакете php-pear в пакетном менеджере apt.

    Как установить пакет

    Если пакет существует в списке пакетов PEAR, вы можете установить его, указав официальное название:

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

    Обработка зависимостей PEAR с Composer

    Если вы уже используете Composer и желаете установить какой-то код из PEAR, вы можете использовать Composer для обработки зависимостей PEAR. Этот пример установит код из pear2.php.net :

    Первый раздел «repositories» даст понять Composer, что он должен сделать “initialise” (или “discover” в терминологии PEAR) репозиторий pear. Затем секция require укажет именам пакетов префикс, как ниже:

    Префикс “pear” жестко ограничен, чтобы избежать любых конфликтов, так как каналы Pear могут быть схожи с другими поставщиками пакетов например, вместо короткого имени (или полного URL) может быть использовано для объявления в каком канале находится пакет.

    Когда код будет установлен он будет доступен в вашей папке vendor и автоматически доступен через автозагрузчик (файл Autoload) Composer.

    Чтобы использовать этот пакет PEAR просто объявите как ниже:

    Практики написания кода

    Основы

    PHP — это обширный язык, который позволяет разработчикам всех уровней писать код не только быстро, но и эффективно. В любом случае, изучая язык, мы нередко забываем основы, которые мы изучали изначально (или бегло просмотрели), в пользу коротких путей и/или вредных привычек. Чтобы помочь в борьбе с этой общей проблемой, эта секция предназначена для напоминания разработчикам основ практик написания кода PHP.

    Дата и время

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

    Для начала работы с DateTime, сконвертируйте «сырую» строку даты и времени в объект с помощью фабричного метода createFromFormat() или выполните new \DateTime , чтобы получить текущую дату и время. Используйте метод format() для конвертирования DateTime обратно в строку для вывода.

    Вычисления с DateTime возможны с использованием класса DateInterval. У класса DateTime есть методы add() и sub() , которые принимают DateInterval, как аргумент. Не пишите код, который ожидает одинаковое число секунд каждый день, перевод часов и смена часовых поясов разрушат это предположение. Вместо этого используйте интервалы дат. Для расчета разницы между датами используйте метод diff() . Он вернет новый объект DateInterval, который очень легко отобразить.

    С объектами DateTime, вы можете использовать стандартные методы сравнения:

    И последний пример для демонстрации класса DatePeriod. Он используется для перебора повторяющихся событий. Класс может принимать два объекта DateTime, начало и конец, и интервал, для которого он вернет все события между ними.

    Design Patterns

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

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

    Исключения

    Исключения — это неотъемлемая часть большинства популярных языков программирования, но зачастую PHP разработчики не уделяют им должного внимания. Языки, подобные Ruby, очень подробно обрабатывают исключения, поэтому, если что-то идёт не верно, например: не удался HTTP запрос, запрос к базе данных происходит неправильно или если запрошенное изображение не было найдено, Ruby (или используемые гемы) выбросит исключение на экран, помогающее понять где вы допустили ошибку.

    PHP сам по себе довольно слаб в плане этого и вызов file_get_contents() , как правило, даст вам только FALSE и предупреждение. Многие устаревшие PHP-фреймворки, как CodeIgniter, просто вернут false, добавят сообщение в свой собственный журнал и, может быть, дадут вам использовать метод, как $this->upload->get_error() , чтобы посмотреть, что пошло не так. Проблема в том, что вы должны искать ошибку и проверять документацию, чтобы понять, какой ошибочный метод существует в этом классе, вместо того, чтобы сделать это всё более очевидным.

    Еще одна проблема в том, что классы автоматически выдают ошибку на экран и закрывают процесс. Когда вы делаете это, вы не даете другому разработчику динамически обработать эту ошибку. Исключения должны быть выброшены, чтобы дать разработчику знать об ошибке и выбрать, как её обработать. Например:

    Исключения SPL

    Универсальный класс Exception предоставляет очень мало отладочного контекста для разработчика; как бы то ни было, для того чтобы исправить это, можно создать специализированный класс, который будет расширять возможности универсального класса Exception :

    Это означает, что вы можете добавить несколько блоков отлова и обрабатывать разные исключения по-разному. Это может привести к созданию множества изменённых Исключений, некоторые из которых можно было бы избежать, используя Исключения SPL, предоставляемые расширением SPL.

    Например, если вы используете магический метод __call() и вами был вызван неизвестный метод, то вместо выбрасывания стандартного исключения, которое очень расплывчато, или вместо создания своего исключения, вы можете просто использовать throw new BadFunctionCallException; .

    Базы данных

    Скорее всего, ваш PHP код будет использовать базу данных для сохранения информации. Существует несколько вариантов для подключения и взаимодействия с базой данных. Рекомендуемым вариантом до PHP 5.1.0 было использование нативных (родных) драйверов, таких как mysql, mysqli, pgsql, etc.

    Встроенные драйвера замечательны, если вы используете ОДНУ базу данных в ваших приложениях, но если, например, вы используете MySQL и немного MSSQL, или вам нужно подключиться в базе данных Oracle, тогда вы не сможете использовать те же драйвера. Вам нужно будет изучить новый API для каждой базы данных — и это может оказаться нерациональным.

    Обратите внимание, что расширение mysql для PHP больше не поддерживается, и его официальным статусом, начиная с PHP версии 5.4.0, является «Устарело в связи с длительным сроком использования». Это значит, что оно будет удалено в течение нескольких следующих релизов, так что в PHP 5.6 (или в версиях, следующих за 5.5) оно вполне может пропасть. Если вы используете mysql_connect() и mysql_query() в своих приложениях, тогда вам придется столкнуться с переписыванием кода, поэтому лучшим вариантом сейчас является использование в приложениях mysqli или PDO вместо mysql, прежде чем вы в дальнейшем столкнётесь с нерабочими приложениями. Если вы начинаете изучение баз данных с нуля, тогда полностью откажитесь от использования расширения mysql — используйте Расширение MySQLi или PDO.

    PDO — это абстрактная библиотека для подключения к базе данных, встроенная в PHP с версии 5.1.0, которая обеспечивает единый интерфейс для взаимодействия с большим количеством различных баз данных. PDO не будет переводить ваши SQL запросы или эмулировать отсутствующие возможности; он чист для подключения к нескольким типам баз данных с тем же API.

    Более важно, что PDO позволяет вам безопасно вводить пользовательские данные (например идентификатор) в ваши SQL запросы, без беспокойства о SQL-инъекциях. Это возможно благодаря использованию PDO выражений и связывания (bound) параметров.

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

    Это ужасный код. Вы вставляете необработанные параметры в SQL запрос. Это приведёт к взлому. Просто представьте, что взломщик сделает запрос http://domain.com/? >, который присвоит переменной $_GET[‘id’] значение 1;DELETE FROM users и приведёт к удалению всех ваших пользователей! Вместо этого, вы должны очистить ввод идентификатора с помощью связывания параметров PDO.

    Это правильный код. Он использует связанный параметр в выражении PDO. Это позволяет избежать ввода некоректного ID перед тем, как передать запрос в базу данных, тем самым предотвращая потенциальные SQL-инъекции.

    Вы также должны понимать, если подключение не закрыто должным образом, то оно использует много ресурсов, которые тратятся впустую, впрочем это больше относится к другим языкам. Используя PDO, вы можете неявно закрывать подключение уничтожив объект — все ссылки на него будут удалены, т.е. установлены в NULL. Если не сделать этого явно, PHP закроет подключение за вас, когда выполнение скрипта завершится, если только вы не используете постоянные подключения.

    Уровни абстракции

    Многие фреймворки предоставляют собственный уровень абстракции, который может строиться на основе PDO. Такая фактическая абстракция баз данных позволяет оборачивать запросы на PHP в методы, которые отсутствуют в одной системе баз данных, но работают в другой. Это, конечно, добавит небольшие накладные расходы, но если вы строите портативные приложения, которым необходима работа с MySQL, PostgreSQL и SQLite, тогда, для чистоты кода, минимальными накладными расходами можно пренебречь.

    Некоторые уровни абстракции построены с использованием PSR-0 стандарта, поэтому могут быть установлены в любое приложение:

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

    Безопасность веб-приложений

    Есть плохие люди, которые могут и хотят взломать ваши веб-приложения. Важно принять необходимые меры предосторожности, чтобы укрепить безопасность вашего приложения. К счастью, прекрасные люди в The Open Web Application Security Project (OWASP) составили полный список известных проблем безопасности и методов защиты от них. Это должно быть прочитано любым разработчиком, заботящимся о безопасности.

    Хэширование паролей

    Наверное, каждый PHP-разработчик занимается разработкой приложений, которые нуждаются в пользовательской авторизации. Имя пользователя и пароль хранятся в базе данных и позже используются для авторизации пользователя.

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

    Хэширование паролей с функцией password_hash

    В PHP 5.5 была представлена функция password_hash . Сейчас она использует BCrypt, сильнейший алгоритм, поддерживаемый PHP. Она будет обновлена в будущем, для поддержки бОльшего числа алгоритмов, по мере необходимости. Библиотека password_compat была создана для обратной совместимости с PHP >= 5.3.7.

    Ниже мы хэшируем строку и далее сверяем её с новой строкой. Поскольку наши две исходные строки отличаются (‘secret-password’ и ‘bad-password’) эта авторизация будет неудачной.

    Фильтрация данных

    Никогда не доверяйте пользовательскому вводу, который передаётся вашему PHP коду. Всегда проверяйте и очищайте пользовательский ввод перед его использованием в коде. Функции filter_var и filter_input помогут очистить переменные, а также проверить соответствие введённых данных некоторому формату (например, адрес электронной почты).

    Пользовательский ввод может быть различным: $_GET и $_POST , данные введённые в форму, некоторые значения в суперглобальной переменной $_SERVER и тело HTTP запроса, открытое с помощью fopen(‘php://input’, ‘r’) . Запомните, что пользовательский ввод не ограничивается данными формы, отправленной пользователем. Отправляемые и загружаемые файлы, значения сессий, данные cookie и данные сторонних веб-сервисов также приравниваются к пользовательскому вводу.

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

    Данные могут быть отфильтрованы по-разному, в зависимости от их назначения. Например, когда нефильтрованные данные, введённые пользоватем, передаются в HTML код страницы, он может выполнить HTML и JavaScript на вашем сайте! Этот тип атаки известен, как Cross-Site-Scripting (XSS) и может иметь очень серьёзные последствия. Один из способов избежать XSS заключается в очистке ввода от всех HTML тэгов (их удалением, или заменой на HTML символы) с помощью функции strip_tags или экранирование символов в равносильные им HTML сущности с функцией htmlentities или htmlspecialchars .

    Другой пример, передача данных для выполнения командной строкой. Это может быть крайне опасно (и, как правило — это плохая идея), но вы можете использовать встроенную функцию escapeshellarg для очистки аргументов командной строки.

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

    Санитизация

    Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода.

    Например, вам необходимо нормализовать пользовательский ввод перед подключением ввода в HTML или его вставкой в сырой SQL запрос. Когда вы используете связанные параметры с PDO, они будут очищать ввод за вас.

    Иногда требуется разрешить некоторые безопасные HTML тэги в вводе, когда он подключается в HTML страницу. Это очень трудно сделать и многие избегают этого, используя ограниченное форматирование, как например Markdown или BBCode, либо библиотеки с белым списком, как HTML Purifier, существующие по этой причине.

    Валидация

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

    Конфигурационные файлы

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

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

    Использование глобальных переменных

    Примечание: С появлением PHP 5.4 директива register_globals была удалена и больше не может быть использована. Это касается тех, кому нужно обновить старое приложение.

    Включенный параметр конфигурации register_globals делает несколько типов переменных (в том числе из $_POST , $_GET и $_REQUEST ) глобальными, доступными в глобальной области видимости вашего приложение. Это может легко привести к проблемам с безопасностью, поскольку ваше приложение не сможет эффективно определить откуда пришли данные.

    Например : $_GET[‘foo’] будет доступна через $foo , которая может заместить переменную, которая не была объявлена. Если вы используете PHP register_globals off (выключена).

    Сообщения об ошибках

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

    Разработка

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

    Установка значения в -1 покажет каждую возможную ошибку, даже если новые уровни и константы будут добавлены в новых версиях PHP. Константа E_ALL ведёт себя так-же в PHP 5.4. — php.net

    Константа уровня ошибок E_STRICT была введена в 5.3.0 и не является частью E_ALL , как бы то ни было, она стала частью E_ALL в 5.4.0 Что это значит? Для вывода всех возможных ошибок в версии 5.3 вам нужно использовать либо -1 либо E_ALL | E_STRICT .

    Вывод всех ошибок разными версиями PHP

    • -1 or E_ALL
    • 5.3 -1 or E_ALL | E_STRICT
    • > 5.3 -1 or E_ALL

    Продакшн

    Чтобы спрятать все ошибки вашей среды во время продакшна, настройте ваш php.ini следующим образом:

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

    Тестирование

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

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

    Тесто-ориентированная разработка

    Разработка через тестирование (TDD) представляет собой процесс разработки программного обеспечения, который опирается на повторении очень короткого цикла разработки: сперва, разработчик пишет автоматизированные тесты, которые определяют желаемое улучшение или новую функцию, далее производит код, который успешно пройдет этот тест и наконец производит рефактор кода для соответствия стандартам. Kent Beck, человек которому приписывают статус разработчика или “переоткрывателя” техники, TDD предлагает простую конструкцию, а также вселяет уверенность.

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

    Модульное тестирование (Unit Testing)

    Модульное тестирование — это подход к программированию, который позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки. Проверяя значения, которые приходят и выходят из различных функций и методов, вы можете быть уверены, что внутренняя логика работает правильно. Используя Внедрение Зависимостей и внедрение классов «макетов» и заглушек, вы можете убедиться, что зависимости используются правильно для большего покрытия тестами.

    При создании класса или функции, вы должны создать модульный тест для каждого возможного поведения. На базовом уровне, вы должны убедиться, что ваш код выдаёт ошибку, если вы отсылаете неправильные аргументы и работает, если вы отсылаете правильные аргументы, соответственно. Это поможет убедиться в том, что изменения, которые вы сделаете относительно этого класса или функции позднее не помешают старым работать как ожидалось. Единственная альтернатива этому var_dump() в test.php, который не является способом создания приложений — больших или маленьких.

    Ещё одно использование модульных тестов — вклад в open source. Если вы можете писать тесты, которые показывают сломанную функциональность, тогда почините её, и покажите, что тест пройден, патчи имеют больше шансов быть принятыми. Если вы запускаете проект, который допускает Pull Request, тогда вы должны указать это в качестве требования.

    PHPUnit является фреймворком тестирования стандарта де-факто для написания модульных тестов в PHP приложениях, но также существует несколько альтернатив.

    Интеграционное тестирование

    Интеграционное тестирование (иногда называется Интеграция и Тестирование, с аббревиатурой “I&T”) это фаза в тестирование програмнного обеспечения, в котором отдельные модули, комбинируются и тестируются, как группа. Это происходит после модульного тестирования и перед валидационным тестированием. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.

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

    Функциональное тестирование

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

    Инструменты функционального тестирование

    • Selenium
    • Mink
    • Codeception это фреймворк для тестирования (всё-в-одном), включающий инструменты подтверждающего тестирования

    Поведенческо-ориентированная разработка

    Существует две разновидности Поведенческо-ориентированной разработки (BDD): SpecBDD и StoryBDD. SpecBDD концентрируется на техническом поведении или коде, в то время как StoryBDD концентрируется на деле, будущем поведении или взаимодействии. PHP имеет фреймворки для обоих типов BDD.

    Используя StoryBDD, вы пишите читаемые людьми истории, которые объясняют поведение вашего приложения. Эти истории могут быть запущены, как актуальные тесты для вашего приложения. Фреймворк, используемый в PHP приложениях для StoryBDD — Behat, который вдохновлён проектом для Ruby Cucumber и реализует Gherkin DSL для объяснения особенностей поведения.

    Вместе со SpecBDD, вы пишите спецификацию, которая объясняет, как ваш код должен себя вести. Вместо тестирования функции или метода, вы объясняете, как эта функция или метод должен себя вести. PHP предлагает фреймворк PHPSpec для данных целей. Этот фреймворк вдохновлён проектом RSpec для Ruby.

    Инструменты

    • Behat, StoryBDD фреймворк для PHP, вдохновлённый проектом для Ruby Cucumber;
    • PHPSpec, SpecBDD фреймворк для PHP, вдохновлённый проектом для Ruby RSpec;
    • Codeception это фреймворк для тестирования (всё-в-одном), использующий принципы BDD;

    Дополнительные инструменты тестирования

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

    Инструменты

    • Selenium автоматизационный инструмент для браузера интегрируемый с PHPUnit
    • Mockery Mock Object Framework интегрируемый с PHPUnit или PHPSpec

    Сервера и развертывание

    PHP приложения могут быть развернуты и запущены на продакшн веб-сервере рядом способов.

    Платформа, как сервис (PaaS)

    PaaS предоставляет системную и сетевую архитектуры, необходимые для запуска PHP приложений в веб. Это означает, как минимум, отсутствие настройки для запуска PHP приложений или PHP фреймворков.

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

    Виртуальный или выделенный сервер

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

    nginx и PHP-FPM

    PHP, через встроенный в него менеджер процессов FastCGI (FPM), очень хорошо сочетается с nginx, который является легковесным и высокопроизводительным веб-сервером. Он использует меньше памяти, чем Apache и может лучше обрабатывать конкурентные запросы. Это особенно важно на виртуальном сервере, для которого может быть критичен объем используемой памяти.

    Apache и PHP

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

    Apache имеет несколько возможных конфигураций для запуска PHP. Самая популярная и лёгкая для установки prefork MPM вместе с mod_php5. Хотя это не самое эффективное в отношении памяти решение, оно очень просто для установки и использования. Наверное, это лучшее решение, если вы не хотите углубляться в серверное администратирование. Если вы хотите использовать mod_php5, вы обязаны использовать prefork MPM.

    Если вы хотите получить больше производительности и стабильности с Apache, тогда вы можете взглянуть на ту же FPM систему, как в nginx и запустить worker MPM или event MPM, используя mod_fastcgi или mod_fcgid. Эта конфигурация позволит получить существенную экономию в памяти и будет намного быстрее, но потребует больше работы для установки.

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

    PHP, благодаря своей популярности, установлен на большом количестве виртуальных хостингов. Очень трудно найти хостинг без установленного PHP, но очень важно убедиться в том, что установлена последняя версия. Виртуальные хостинги позволяют вам и другим разработчикам развертывать веб-сайты на одной машине. Достоинством виртуального хостинга является его низкая цена. Недостатком — то, что вы не знаете, чем будут заниматься ваши соседи; сильно загружая сервер или открывая бреши в безопасности. Если бюджет вашего проекта позволяет избежать использования Виртуальных хостингов, то рассмотрите другие варианты.

    Построение и развёртывание вашего приложения

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

    Среди задач, которые вы, возможно, захотите автоматизировать:

    • Управление зависимостями
    • Компиляция, минификация файлов (assets)
    • Запуск тестов
    • Создание документации
    • Запаковка
    • Развёртывание

    Создание инструментов автоматизации

    Инструменты построения — коллекция скриптов, которые обрабатывают общие задачи развёртки приложений. Инструменты постройки не являются частью вашего приложения, они взаимодействуют с вашим приложением «извне».

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

    Phing самый простой путь, чтобы начать автоматическую развёртку в мире PHP. С Phing вы можете контролировать ваш процесс запаковки, развёртки или тестирования с помощью простого построечного XML файла. Phing (который базируется на Apache Ant) предоставляет богатый набор задач, часто необходимых для установки или обновления веб приложения, и может быть расширен дополнительными нестандартными задачами, написанными на PHP.

    Capistrano — система для начинающих-профессиональных разработчиков для исполнения команд в структуризованном, воспроизводимом пути на одной или многих удалённых машинах. Предварительно он настроен для развёртки приложений Ruby on Rails. Как бы то ни было люди успешно развёртывают и PHP приложения с ним. Успех использования Capistrano зависит на умении работы с Ruby и Rake.

    Сообщение в блоге Dave Gardner PHP Deployment with Capistrano является хорошей отправной точкой для PHP разработчиков, заинтересованных в Capistrano.

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

    Ресурсы о Chef для PHP разработчиков:

    Для дальнейшего изучения:

    Непрерывная интеграция

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

    Существуют разные пути, для осуществления непрерывной интеграции для PHP. Недавно Travis CI закончил великолепную работу по созданию непрерывной интеграции, реально даже для маленьких проектов. Travis CI — сервис непрерывной интеграции для сообщества с открытым исходным кодом. Оно интегрируется с GitHub и предлагает первоклассную поддержку для многих языков, включая PHP.

    Для дальнейшего изучения:

    Кэширование

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

    Кэширование байткода

    Во время исполнения PHP файла, на низком уровне он сперва компилируется в байткод (или опкод) и только потом исполняется байткод. Если PHP файл не изменён, то байткод будет всегда одинаков. Это значит, что шаг компиляции — пустая трата процессорных ресурсов.

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

    Начиная с PHP 5.5 появилось встроенное расширение для кэширования байткод — OPcache. Оно также доступно в виде отдельного расширения для ранних версий.

    Популярные системы подобного кэширования:

    • APC (PHP 5.4 и более ранние)
    • XCache
    • Zend Optimizer+ (часть Zend Server)
    • WinCache (расширение для MS Windows Server)

    Кэширование объектов

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

    Множество популярных решений для кэширования байткода также дают вам кэшировать данные, поэтому нет причин, чтобы не воспользоваться ими. APC, XCache и WinCache предоставляют API для сохранения данных из вашего PHP кода в свой кэш в памяти.

    Самыми популярными системами кэширования объектов являются APC и memcached. APC — идеальный выбор для кэширования объектов, он включает простой API для добавления данных в кэш память и при этом очень просто устанавливается и используется. Единственное существующее ограничение APC состоит в том, что он привязан к серверу на котором установлен. Memcached, напротив, устанавливается как отдельный сервис, и к нему можно получить доступ по сети, что позволяет хранить объекты в очень быстром централизованном хранилище данных и множество других систем могут получать эти данные из него.

    Учтите, если PHP запущен как (Fast-)CGI приложение внутри вашего веб-сервера, то каждый PHP процесс будет иметь собственный кэш, например, APC данные не будут расшарены между вашими процессами. В этом случае имеет смысл подумать об использовании вместо него memcached, так как он не ограничен процессом PHP.

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

    Пример использования APC:

    Подробнее о популярных системах кэширования объектов:

    Создание расширений PHP: Введение в PHP и Zend

    Введение

    Если вы читаете данную статью, скорее всего у вас есть некоторый интерес к созданию расширений для языка PHP. Если же нет… возможно, когда вы прочтёте эту статью, то обнаружите в себе этот интерес, не смотря на то, что вы о нём даже не подозревали!

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

    Начнём с того, что определим причины, по которым вы хотите написать расширение для PHP:

    1. Существование какой-нибудь библиотеки или специфичного вызова ОС, который не может быть сделан из PHP напрямую из-за уровня абстракции принятого в языке;
    2. Вы хотите заставить PHP работать нестандартным способом;
    3. У вас уже есть решение, написанное на PHP, но вы знаете, что оно может быть быстрее, компактней и потреблять меньше памяти в процессе работы;
    4. У вас есть особенный код, который вы хотели бы продать. Однако, важно, что бы покупатель мог запускать Ваш код, но не смотреть исходники.

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

    Что такое Расширение?

    Если вам приходилось использовать PHP, то вы использовали и расширения. За небольшим исключением каждая доступная для использования функция в языке PHP сгруппирована в то или иное расширение. Основная часть функций (более 400) входит в состав стандартного расширения. Исходные коды PHP распространяются с порядка 86 расширениями, имеющими примерно по 30 функций в каждом. Посчитав, получим где-то 2500 функций в сумме. Если этого не достаточно, репозитарий PECL предлагает свыше 100 дополнительных расширений, ещё больше можно найти на бескрайних просторах интернета.

    «Что же, с учётом всего этого множества функций, живущих в расширениях, тогда остаётся вне расширений?» — спросите вы. «Что расширения расширяют? Что такое ядро PHP

    Ядро PHP реализовано в виде 2-х отдельных частей. Техническая часть языка представлена в виде Zend Engine (ZE). ZE отвечает за преобразование понятного для человека скрипта в понятные для компьютера токены (tokens), после чего выполняет их. Кроме того, ZE отвечает за управление памятью, область видимости переменных, обработку вызова функций.
    Второй частью ядра является то, что непосредственно называется «ядром» (the PHP core). Оно отвечает за взаимодействие со слоем SAPI (Server Application Programming Interface, интерфейс взаимодействия PHP с другим серверным ПО — CLI, CGI, Apache и так далее). Кроме того, ядро реализует обобщённый слой контроля для проверок safe_mode и open_basedir (данные фичи объявлены depricated с версии 5.3), так же, как и слой потоков, который ассоциирует файловые и сетевые I/O операции с функциями fopen, fread и fwrite.

    Жизненный цикл

    Когда происходит запуск заданного SAPI (например, при запуске сервера Apache по команде /usr/local/apache/bin/apachectl start), PHP начинает свою работу с запуска подсистемы ядра. К концу процедуры запуска он загружает код каждого расширения и вызывает его функцию Module Initialization (MINIT). Это даёт каждому расширению возможность инициализировать внутренние переменные, выделить память под ресурсы, зарегистрировать обработчики ресурсов и свои функции в ZE, что бы при вызове каким-нибудь скриптом функции этого расширения ZE знал, какой код ему выполнять.

    Далее PHP ждёт от слоя SAPI запроса на обработку страницы. В случае CGI или CLI SAPI это происходит незамедлительно и только один раз. В случае SAPI Apache, IIS или другого полноценного web-сервера запрос на обработку страницы происходит каждый раз при запросе (возможно конкурентном) страницы удалённым пользователем. Однако, вне зависимости от того, каким образом пришёл запрос, его обработка начинается с того, что ядро PHP просит ZE настроить окружающую среду для запуска скрипта, после чего вызывает функцию Request Initialization (RINIT) для каждого расширения. RINIT даёт расширениям возможность настроить специфичные переменные окружения, выделить память для специфичных ресурсов запроса и выполнить другие задания. Наглядным примером функции RINIT в действии может служить расширение session, в котором при включенной настройке session.auto_start функция RINIT автоматически вызывает исполнение функции session_start и инициализирует переменную $_SESSION.

    После того, как запрос инициализирован, ZE транслирует PHP скрипт в токены, а затем в опкоды (opcodes), которые он может выполнить. Если какой-нибудь из этих опкодов запрашивает вызов функции из расширения, ZE формирует аргументы для вызова этой функции и временно передаёт ей управление до её завершения.

    После того как скрипт завершил своё выполнение, PHP вызывает функцию Request Shutdown (RSHUTDOWN) для каждого расширения, что выполнить все необходимые для завершения чистки (например, сохранение сессионных переменных на диск). Следующим шагом ZE выполняет процесс чистки (также известный как сборка мусора), который фактически выполняет метод unset для каждой переменной, использованной в выполненном скрипте (начиная с PHP 5.3 механизм сборки мусора значительно улучшен).

    Завершив обработку запроса, PHP ждёт от SAPI либо запроса на обработку другого скрипта, либо сигнала на завершение. В случае CGI или CLI SAPI «следующий запрос» невозможен, поэтому SAPI инициализирует завершение работы PHP незамедлительно. В процессе завершения PHP перебирает все расширения и для каждого вызывает функцию Module Shutdown (MSHUTDOWN), после чего завершает свою собственную подсистему ядра.

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

    Выделение памяти

    Для того, что бы избежать утечек памяти в плохо написанных расширениях, ZE использует свой собственный внутренний механизм управления памятью, основанный на дополнительном флаге для определения времени жизни данных. Постоянное (persistent) выделение памяти означает, что память будет выделена более, чем на время обработки запроса одной страницы. Непостоянное (non-persistent) выделение памяти означает освобождение памяти после обработки запроса вне зависимости от того, была ли вызвана функция освобождения памяти. К примеру, выделение памяти под пользовательские переменные носит непостоянный характер, так как по завершению обработки запроса они становятся бесполезными.

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

    Давайте кратко сравним традиционные функции выделения памяти (которые стоит использовать только при работе с внешними библиотеками) с функциями постоянного и непостоянного выделения памяти в PHP/ZE.

    Традиционные Непостоянные Постоянные
    malloc(count) emalloc(count) pemalloc(count, 1) *
    calloc(count, num) ecalloc(count, 1) pecalloc(count, num, 1)
    strdup(str) estrdup(str) pestrdup(str, 1)
    strndup(str, len) estrndup(str, len) pemalloc() & memcpy()
    free(ptr) efree(ptr) pefree(ptr, 1)
    realloc(ptr, newsize) erealloc(ptr, newsize) perealloc(ptr, newsize, 1)
    malloc(count * num + extr) ** safe_emalloc(count, num, extr) safe_pemalloc(count, num, extr)

    * Семейство функций pemalloc принимает в качестве параметра флаг «постоянности», который позволяет им вести себя как их непостоянные аналоги.
    К примеру: emalloc(1234) тоже самое, что и pemalloc(1234, 0)
    ** safe_emalloc() и (в PHP 5) safe_pemalloc реализуют дополнительную проверку целочисленных переполнений.

    Настройка и сборка окружения

    Теперь, когда вы ознакомились с теорией работы PHP и Zend Engine, могу поспорить, вам не терпится погрузиться в работу и начать что-нибудь делать. Однако, перед этим вам нужно обзавестись кое-какими утилитами для сборки и настроить окружение для ваших целей.

    Прежде всего, вам необходим сам PHP и набор средств сборки, необходимых для PHP. Если вам не приходилось собирать PHP из исходников, предлагаю взглянуть на эту статью. Несмотря на то, что использование бинарного пакета с исходниками PHP может показаться заманчивым, такие сборки зачастую лишены двух важных параметров программы ./configure, которые очень полезны во время процесса разработки. Первый из них это —enable-debug. Эта опция компилирует PHP с дополнительной отладочной информацией в исполняемых файлах, так что при возникновении ошибки сегментации (segfault) вы сможете получить дамп ядра и воспользоваться отладчиком gdb, что бы выяснить, где и почему произошла ошибка.
    Название второй опции зависит от того, с какой версией PHP вы собираетесь работать. В PHP 4.3 она называется —enable-experimental-zts, начиная с PHP 5, она переименована в —enable-maintainer-zts. Эта опция заставит PHP думать, что он работает в многопотоковой (multithread) среде, и позволит вам отловить общие ошибки, которые незаметны в среде без потоков, но повлекут нестабильную работу вашего расширения в многопотоковой среде.
    Скомпилировав PHP с дополнительными опциями и установив его на сервер разработки (или рабочую станцию), вы можете преступать к созданию своего первого расширения.

    Hello World

    PHP_ARG_ENABLE(hello, whether to enable Hello World support,
    [ —enable-hello Enable Hello World support])

    if test «$PHP_HELLO» = «yes»; then
    AC_DEFINE(HAVE_HELLO, 1, [Whether you have Hello World])
    PHP_NEW_EXTENSION(hello, hello.c, $ext_shared)
    fi

    #ifndef PHP_HELLO_H
    #define PHP_HELLO_H 1

    #define PHP_HELLO_WORLD_VERSION «1.0»
    #define PHP_HELLO_WORLD_EXTNAME «hello»

    extern zend_module_entry hello_module_entry;
    #define phpext_hello_ptr &hello_module_entry

    #include «php.h»
    #include «php_hello.h»

    static function_entry hello_functions[] = <
    PHP_FE(hello_world, NULL)

    >;

    zend_module_entry hello_module_entry = <
    #if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
    #endif
    PHP_HELLO_WORLD_EXTNAME,
    hello_functions,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    #if ZEND_MODULE_API_NO >= 20010901
    PHP_HELLO_WORLD_VERSION,
    #endif
    STANDARD_MODULE_PROPERTIES
    >;

    #ifdef COMPILE_DL_HELLO
    ZEND_GET_MODULE(hello)
    #endif

    PHP_FUNCTION(hello_world)
    <
    RETURN_STRING( «Hello World» , 1);
    >

    str = estrdup( «Hello World» );
    RETURN_STRING(str, 0);
    >

    В этом примере вы вручную выделили непостоянную память для строки «Hello World», которую передали обратно в вызывающий скрипт с помощьюфункции RETURN_STRING, указав ей 0 в качестве второго параметра, что заставляет функцию не делать копию строки, так как она может воспользоваться нашей.

    Сборка расширения

    Если всё пойдёт так, как должно, вы увидите строку Hello World в качестве результата работы скрипта, так как функция hello_world из загруженного расширения возвращает строку, а команда echo отображает то, что ей было передано на вход (в данном случае – результат работы функции hello_world).

    В данном примере мы возвращали строку, другие скалярные типы данных могут быть возвращены по схожему принципу: RETURN_LONG для целочисленных значений, RETURN_DOUBLE для чисел с плавающей точкой, RETURN_BOOL для TRUE/FALSE и RETURN_NULL для, как вы догадались, NULL-значений. Давайте посмотрим на каждую из них в действии, добавив строки с макросом PHP_FE в структуру function_entity и соответствующие им макросы PHP_FUNCTION в файле hello.c:

    static function_entry hello_functions[] = <
    PHP_FE(hello_world, NULL)
    PHP_FE(hello_long, NULL)
    PHP_FE(hello_double, NULL)
    PHP_FE(hello_bool, NULL)
    PHP_FE(hello_null, NULL)

    >;

    PHP_FUNCTION(hello_world);
    PHP_FUNCTION(hello_long);
    PHP_FUNCTION(hello_double);
    PHP_FUNCTION(hello_bool);
    PHP_FUNCTION(hello_null);

    Так как вы не вносили изменений в файл config.m4, технически нет необходимости повторять шаги phpize и ./configure, а можно сразу перейти к выполнению команды make. Тем не менее, на этот раз я попрошу вас пройти через все три шага сборки заново с целью убедиться, что никаких проблем не возникло. Кроме того, в качестве последнего шага вы можете использовать команду make clean all вместо make, что бы быть уверенным, что все файлы с исходниками будут пересобраны. Повторюсь, что это не необходимо ввиду типа изменений, которые вы сделали, но лучше перестраховаться, чем наткнуться на ошибку. После того, как модуль собран, вам остаётся скопировать его в каталог расширений, заменив им старую версию.

    Сейчас вы можете снова вызвать интерпретатор PHP, передав ему нехитрые скрипты для того, что бы протестировать только что добавленные функции. На самом деле – почему бы ни сделать это сейчас? Я подожду вас здесь…

    Готово? Хорошо. Если для просмотра результата работы каждой функции вы использовали var_dump, а не echo, то, возможно, обратили внимание, что hello_bool возвращает TRUE. Это результат равенства 1-це аргумента функции. Также как и в PHP-скриптах, целочисленное значение 0 эквивалентно FALSE, в то время как любое другое число эквивалентно TRUE. Авторы расширений зачастую используют соглашение, согласно которому этим числом является 1. Желательно, но не обязательно, что бы и вы придерживались этого соглашения. Кроме того, для большего удобства доступны макросы RETURN_TRUE и RETURN_FALSE. Ниже приведён пример функции hello_bool с использованием макроса RETURN_TRUE.

    Обратите внимание, что никаких круглых скобок при вызове макроса не использовалось. В этом плане макросы RETURN_TRUE и RETURN_FALSE отличаются от остальных макросов семейства RETURN_*, так что будьте внимательны и не попадитесь на этом!

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

    Существуют ещё 3 дополнительных возвращаемых типа: RESOURCE (возвращаемый, к примеру, функциями mysql_connect, fsockopen или ftp_connect), ARRAY (также известный как HASH) и OBJECT (возвращаемый по ключевому слову new). Речь о них пойдёт позже.

    INI-настройки

    Zend Engine предоставляет два подхода для работы с INI-данными. Сейчас мы рассмотрим наиболее простой из них, а к более общему вернёмся после ознакомления с глобальными переменными.

    Предположим, вы хотите объявить в файле php.ini настройку hello.greeting для вашего расширения, которая будет содержать значение для вывода функцией hello_world. Для этого нам придётся добавить несколько изменений в файлы hello.c и php_hello.h в рамках изменения структуры hello_module_entry. Начнём с добавления следующих прототипов перед списком прототипов пользовательских функций в файле php_hello.h:

    PHP_FUNCTION(hello_world);
    PHP_FUNCTION(hello_long);
    PHP_FUNCTION(hello_double);
    PHP_FUNCTION(hello_bool);
    PHP_FUNCTION(hello_null);

    zend_module_entry hello_module_entry = <
    #if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
    #endif
    PHP_HELLO_WORLD_EXTNAME,
    hello_functions,
    PHP_MINIT(hello),
    PHP_MSHUTDOWN(hello),
    NULL,
    NULL,
    NULL,
    #if ZEND_MODULE_API_NO >= 20010901
    PHP_HELLO_WORLD_VERSION,
    #endif
    STANDARD_MODULE_PROPERTIES
    >;

    PHP_INI_BEGIN()
    PHP_INI_ENTRY( «hello.greeting» , «Hello World» , PHP_INI_ALL, NULL)
    PHP_INI_END()

    #include «php.h»
    #include «php_ini.h»
    #include «php_hello.h»

    PHP_FUNCTION(hello_world)
    <
    RETURN_STRING(INI_STR( «hello.greeting» ), 1);
    >

    Обратите внимание, что вы создаёте копию значения, полученного от INI_STR. Причина в том, что строка, возвращаемая INI_STR является статической. Другими словами, если вы попытаетесь её изменить рабочее окружение PHP может стать нестабильным или даже аварийно завершиться.

    Первый набор внесённых в этой главе изменений добавляет два новых метода, с которыми вы должны быть уже знакомы: MINIT и MSHUTDOWN. Как упоминалось ранее, эти методы вызываются при первом запуске SAPI-слоя и в процессе завершения его работы соответственно. Они не вызываются в течение или между запросами. В этом примере они используются для регистрации записей из файла php.ini, объявленных в вашем расширении. Также в этих функциях могут быть зарегистрированы ресурсы, объекты и обработчики потоков.

    В вашей функции hello_world вы используете макрос INI_STR для получения текущего значения записи hello.greating в качестве строки. Существует совокупность других функций для получения целочисленных значений, значений с плавающей точкой, булевых значений перечисленных ниже. В дополнение эти функции имеют дубликаты с суффиксом ORIG, позволяющие получить значение записи в том виде, в котором оно записано в файле php.ini (до того, как могло быть изменено посредствам файла .htaccess или функции ini_set).

    Текущее значение Оригинальное значение Тип
    INI_STR(name) INI_ORIG_STR(name) Char * (NULL terminated)
    INI_INT(name) INI_ORIG_INT(name) signed long
    INI_FLT(name) INI_ORIG_FLT(name) signed double
    INI_BOOL(name) INI_ORIG_BOOL(name) Zend_bool

    Перейдём к функции PHP_INI_ENTRY. Первым параметром ей передаётся строка, содержащая имя интересующей вас записи в файле php.ini. Для того, что бы избежать коллизий между именами записей в php.ini, вам следует использовать те же соглашения, что при наименовании функций: имя должно начинаться с префикса, совпадающего с именем расширения. Так же соглашение предусматривает, что разделителем имени расширения от оригинального имени настройки в INI-файлах должна служить точка. В данном случае имя настройки будет выглядеть как hello.greeting.
    Вторым параметром является начальное значение настройки, которое всегда задаётся как char* вне зависимости от того, является ли значение числом или нет. Это является следствием того факта, что все настройки в INI-файлах по своей сути текстовые, так как сам файл текстовый. Только последующее использование в скрипте макросов INI_INT, INI_FLT или INI_BOOL вызывает преобразование их типов.
    Третьим параметром является модификатор уровня доступа. Это битовая маска, которая определяет когда и как данная INI-настройка может быть модифицирована. Для некоторых настроек, таких как register_globals, просто-напросто не имеет смысла позволять изменение значения внутри скрипта с помощью функции ini_set, так как данная настройка имеет смысл только во время подготовки обработки запроса – до того как скрипту дана возможность отработать. Другие, такие как allow_url_fopen, являются административными настройками, которые пользователи не должны иметь права изменять ни через ini_set, ни через директивы .htaccess. По-умолчанию значением для этого параметра является значение PHP_INI_ALL, указывающее, что значение настройки может меняться где угодно. Также возможны значения PHP_INI_SYSTEM|PHP_INI_PERDIR, указывающие, что значение настройки может быть изменено через php.ini или директиву в файле .htaccess, но через функцию ini_set(). Или же возможно значение PHP_INI_SYSTEM, означающее, что настройку можно изменить только через файл php.ini и нигде больше.

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

    Глобальные переменные

    Довольно часто расширению требуется обработать переменную в отдельном запросе, сохраняя её значение независимым от других запросов, которые могут обрабатываться в тоже самое время. В немногопоточном SAPI это можно сделать очень просто: всего лишь объявите глобальную переменную в файле с исходным кодом и обращайтесь к ней, когда вам нужно. Проблема в том, что, так как PHP спроектирован для работы с многопоточными web-серверами (такими как Apache 2 и ISS), ему необходимо хранить глобальные переменные, используемые одним потоком, отдельно от глобальных переменных другого. PHP значительно упрощает эту задачу благодаря использованию слоя абстракции TSRM (Thread Safe Resource Manager) иногда называемого ZTS (Zend Thread Safety). Фактически в данной статье уже использовались части TSRM, чего вы даже не заметили. (Не пытайтесь найти их, так как пока для вас это слишком сложно).

    Первая часть создания потокобезопасной глобальной переменной, как и любой другой глобальной переменной, заключается в её объявлении. В качестве примера мы объявим одну глобальную переменную типа long, начальным значением которой будет 0. Каждый раз, когда функция hello_long будет вызываться, мы будем увеличивать значение глобальной переменной и возвращать её значение.
    Добавьте следующий фрагмент кода в файл php_hello.h сразу после строки #define PHP_HELLO_H:

    ZEND_BEGIN_MODULE_GLOBALS(hello)
    long counter;
    ZEND_END_MODULE_GLOBALS(hello)

    #ifdef ZTS
    #define HELLO_G(v) TSRMG(hello_globals_id, zend_hello_globals *, v)
    #else
    #define HELLO_G(v) (hello_globals.v)
    #endif

    PHP_MINIT_FUNCTION(hello);
    PHP_MSHUTDOWN_FUNCTION(hello);
    PHP_RINIT_FUNCTION(hello);

    #include «php.h»
    #include «php_ini.h»
    #include «php_hello.h»

    zend_module_entry hello_module_entry = <
    #if ZEND_MODULE_API_NO >= 20010901
    STANDARD_MODULE_HEADER,
    #endif
    PHP_HELLO_WORLD_EXTNAME,
    hello_functions,
    PHP_MINIT(hello),
    PHP_MSHUTDOWN(hello),
    PHP_RINIT(hello),
    NULL,
    NULL,
    #if ZEND_MODULE_API_NO >= 20010901
    PHP_HELLO_WORLD_VERSION,
    #endif
    STANDARD_MODULE_PROPERTIES
    >;

    И измените вашу функцию MINIT вместе с добавлением ещё нескольких функций для обработки инициализации при старте запроса:

    static void php_hello_init_globals(zend_hello_globals *hello_globals)
    <
    >

    PHP_RINIT_FUNCTION(hello)
    <
    HELLO_G(counter) = 0;

    PHP_MINIT_FUNCTION(hello)
    <
    ZEND_INIT_MODULE_GLOBALS(hello, php_hello_init_globals, NULL);

    В изменениях, которые вы внесли в файл php_hello.h, вы использовали пару макросов – ZEND_BEGIN_MODULE_GLOBALS и ZEND_END_MODULE_GLOBALS. С их помощью была определена структура zend_hello_globals, содержащая одну переменную типа long. После этого был определён макрос HELLO_G, позволяющий в зависимости от режима компиляции (с учётом или без многопоточности) получать значение из пула потоков или просто взять его из глобальной области видимости.
    В файле hello.c с помощью макроса ZEND_DECLARE_MODULE_GLBALS вы объявили структуру zend_hello_globals либо как глобальную (при непотокобезопасной сборке), либо как член пула ресурсов потока. Нам как авторам расширения не нужно задумываться об этом механизме, так как всю работу берёт на себя ZE. И, наконец, вы используете функцию ZEND_INIT_MODULE_GLOBALS для выделения идентификатора потокобезопасного ресурса.
    Возможно, вы заметили, что функция php_hello_init_globals на самом деле ничего не делает. Кроме того, инициализация счётчика значением 0 оказалась в функции RINIT. Почему?
    Ключ к ответу на этот вопрос кроется в моменте, когда эти функции вызываются. Функция php_hello_init_globals вызывается только при запуске нового процесса или потока. Однако, каждый процесс может обслуживать более одного запроса, так что использование этой функции для инициализации нашего счётчика значением 0 будет верно только для первого запроса. Последующий запрос к этому же процессу по прежнему будет работать со старым значением счётчика и, следовательно, не будет начинать отчёт с нуля. Для инициализации счётчика значением 0 для каждого запроса мы использовали функция RINIT, которая, как вы уже читали, вызывается перед каждым запросом обработки скрипта. Мы включили функцию php_hello_init_globals в наш код как минимум из-за того, что передача NULL в качестве соответствующего параметра ZEND_INIT_MODULE_GLOBALS функции init приведёт к ошибке сегментации для платформ без поддержки потоков.

    INI-настройки и глобальные переменные

    ZEND_BEGIN_MODULE_GLOBALS(hello)
    long counter;
    zend_bool direction;
    ZEND_END_MODULE_GLOBALS(hello)

    PHP_INI_BEGIN()
    PHP_INI_ENTRY( «hello.greeting» , «Hello World» , PHP_INI_ALL, NULL)
    STD_PHP_INI_ENTRY( «hello.direction» , «1» , PHP_INI_ALL, OnUpdateBool, direction, zend_hello_globals, hello_globals)
    PHP_INI_END()

    static void php_hello_init_globals(zend_hello_globals *hello_globals)
    <
    hello_globals->direction = 1;
    >

    PHP_FUNCTION(hello_long)
    <
    if (HELLO_G(direction)) <
    HELLO_G(counter)++;
    > else <
    HELLO_G(counter)—;
    >

    Вот и всё! С помощью метода OnUpdateBool (метод является часть ZE), переданного в качестве третьего параметра макроса STD_PHP_INI_ENTRY, будет производиться автоматическое приведение типа значения настройки, полученного из файла php.ini, .htaccess, или с помощью функции ini_set, к соответствующему значению TRUE/FALSE, которое вы можете получить прямо внутри скрипта. Последние три параметра функции STD_PHP_INI_ENTRY указывают PHP, какую глобальную переменную изменить, как выглядит структура глобальных переменных нашего расширения, и имя контейнера глобальных переменных, в котором они содержаться.

    Что дальше?

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

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

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

    У автора есть несколько статей по данной тематике: 1, 2.1, 2.2, 3. Четвёртая статья видимо так и не увидит свет ввиду публикации автором книги «Extending and Embedding PHP», посвящённой данной тематике.

    Руководство по PHP русский перевод

    25.02.2008 (последний раз редактировалось 01.02.2012)
    сайт: http://ru2.php.net/download-docs.php
    условия использования: бесплатно

    скачать руководство PHP, русский (html) В формате html. Дата редакции 26-01-2012 (много html файлов)
    скачать руководство PHP, русский (html) В формате html. Дата редакции 26-01-2012 (Одним большим файлом)
    скачать руководство PHP, русский (chm) В формате chm. Дата редакции 26-01-2012 (с комментариями пользователей на английском)

    Официальный мануал по php.
    Освещает 4 и 5 версии php.
    Это руководство состоит, главным образом, из справочника функций, а также содержит справочник языка, комментарии к наиболее важным из отличительных особенностей PHP, и другие дополнительные сведения.
    онлайн версия справочника по функциям php

    Содержание руководства:

    Авторские права
    Руководство по PHP
    Предисловие
    Приступая к работе
    Введение
    Простой учебник
    Установка и настройка
    Общие инструкции по установке
    Установка на Unix системы
    Installation on Mac OS X
    Installation on Windows systems
    FastCGI Process Manager (FPM)
    Установка расширений PECL
    Проблемы?
    Runtime Configuration
    Справочник языка
    Основы синтаксиса
    Типы
    Переменные
    Константы
    Выражения
    Операторы
    Управляющие конструкции
    Функции
    Классы и объекты
    Namespaces
    Исключения
    Ссылки. Разъяснения
    Предопределённые переменные
    Предопределённые исключения
    Predefined Interfaces
    Context options and parameters
    Supported Protocols and Wrappers
    Безопасность
    Вступление
    Общие рассуждения
    Если PHP установлен как CGI
    Если PHP установлен как модуль Apache
    Безопасность файловой системы
    Безопасность баз данных
    Сообщения об ошибках
    Использование глобальных переменных (Register_Globals)
    Данные, введенные пользователем
    Волшебные кавычки
    Сокрытие PHP
    Необходимость обновлений
    Отличительные особенности
    HTTP-аутентификация в PHP
    Cookies
    Sessions
    Работа с XForms
    Загрузка файлов на сервер
    Работа с удаленными файлами
    Работа с соединениями
    Постоянные соединения с базами данных
    Безопасный режим
    Использование PHP в командной строке
    Garbage Collection
    Справочник функций
    Изменение поведения PHP
    Обработка аудио форматов
    Службы аутентификации
    Расширения по работе с датой и временем
    Расширения для работы с командной строкой
    Расширения сжатия и архивации
    Обработка кредитных карт
    Криптографические расширения
    Расширения для работы с базами данных
    Расширения для работы с файловой системой
    Поддержка человеческих языков и кодировок
    Обработка и генерация изображений
    Расширения по работе с почтой
    Математические расширенияMathematical
    Генерация нетекстовых MIME форматов
    Расширения для управления процессами программ
    Другие базовые расширения
    Другие службы
    Расширения для работы с поисковыми системами
    Расширения для работы с серверами
    Расширения для работы с сессиями
    Обработка текста
    Расширения, относящиеся к переменным и типам
    Веб-сервисы
    Расширения только для Windows
    Обработка XML
    Ядро PHP: Руководство хакера по Zend Engine
    Preface
    The «counter» Extension — A Continuing Example
    The PHP 5 build system
    Extension structure
    Memory management
    Working with variables
    Writing functions
    Working with classes and objects
    Working with resources
    Working with INI settings
    Working with streams
    PDO Driver How-To
    Extension FAQs
    Zend Engine 2 API reference
    Zend Engine 2 opcode list
    Zend Engine 1
    ЧАВО — ЧАВО: ЧАсто задаваемые Вопросы и Ответы на них
    Общая информация
    Списки рассылки
    Получение PHP
    Вопросы по Базам данных
    Установка
    Проблемы Сборки
    Использование PHP
    PHP и HTML
    PHP и COM
    PHP и другие языки
    Переход из PHP 4 в PHP 5
    Разные вопросы
    Appendices
    История PHP и смежных проектов
    Migrating from PHP 5.2.x to PHP 5.3.x
    Migrating from PHP 5.1.x to PHP 5.2.x
    Migrating from PHP 5.0.x to PHP 5.1.x
    Миграция с PHP 4 на PHP 5
    Classes and Objects (PHP 4)
    Отладка в PHP
    Configure options
    Директивы php.ini
    Список/классификация расширений
    Список псевдонимов функций
    List of Reserved Words
    List of Resource Types
    Список доступных фильтров
    Список поддерживаемых транспортных протоколов
    Таблица сравнения типов в PHP
    List of Parser Tokens
    Userland Naming Guide
    Об этом руководстве
    Creative Commons Attribution 3.0
    Список функций

    Комментарии

    05.09.2009 ljubchyk
    Документация по РНР, а називается html)

    26.01.2010 zohen
    Посмотрим что ето замануал)))

    31.03.2010 Dikan
    Качаю вот, говорят хорошая книга, по изучаю.

    01.04.2010 Mistic
    вобщем то очень доступно описано.
    сам не зная не одного языка программирования в течении двух недель освоил php именно по этой книге(это было пару лет назад).
    это классический мануал по php

    13.07.2010 LuMeN
    Надеюсь поможет поверю на слова

    24.12.2010 Nosirjon
    Скачаю начал изучачть html а потом php

    21.04.2011 babay
    Если это «PHP русский», то я — Папа Римский.

    25.04.2011 виктор
    Для Папы Римского, ты прочитал два слова из всего, что тут написано?
    Это руководство по PHP на русском языке.
    Никто тут даже не пытался сказать, что PHP русский.

    Админ, поставь в названии запятую «Руководство по PHP, русский» или «Руководство по PHP на русском».

    18.05.2011 KaReN
    Ну попробую, до этого ,было object pascal в среде дельфи, щсейчас решил в инете прробовал html, хочу попробовать нечто большее

    01.06.2011 Денис
    Да не слушайте вы ни кого, нормальный такое руководство, конечно не, то что нужно было мне, но тем кто хочет его освоить самое оно!
    P.S. мне нужно было описание функций и волей судьбы выплыл сюда.

    02.06.2011 виктор
    Денис, вот как раз в этом мануале и есть описание функций.
    Вобщем то самое основное в этом справочнике описание функций

    03.12.2011 Александр
    Парни, если кто не понимает, что перевод с английского на русский то ему запятая не поможет :-)

    08.12.2011 я php
    Да да, даже можно точку с запятой поставить, все равно не поможет. ))))

    24.01.2012 lili
    этому человеку и php не поможет..

    30.01.2012 ed-210
    Кто-нибудь может сказать, почему переведенный вариант руководства за 18-02-2011 всё-равно содержит английские статьи? Есть где-то полностью русский мануал?
    P.S. Ибо так лень напрягать мозг, для того чтобы вникнуть во вражескую терминологию.

    01.02.2012 админ
    справочники обновлены

    11.04.2012 Олег
    Спасибо за мануал!

    23.04.2012 Станислав
    Достаточный материал для полного изучения языка PHP. Ну и конечно же этот язык хоть и интерпретируемый, но все же его семантика как и его конструкции, основана на фундаменте стандарта Cи, что облегчает изучение последнего. Спасибо администратору за компиляцию документа в CHM, очень удобно пользоваться.

    16.10.2015 Боря
    Прочитал множество книг и документаций по PHP. Ни одна не удобна так как этот справочник от разработчиков и не объясняет этот языка лучше этого справочника, так точно и последовательно. Рекомендую всем! Можно сказать что это полный справочник по языку PHP. Удачи всем !

    ГЛАВА 1 Знакомство с PHP

    Последние пять лет ознаменовались фантастическим развитием Интернета и новых способов общения между людьми. На переднем крае этого явления находится World Wide Web (WWW). Ежедневно в этой новой коммуникационной среде открываются тысячи новых сайтов, а потребителям предлагаются новые виды услуг. Вместе с бурным развитием рынка появился огромный спрос на новые технологии и разработчиков, владеющих ими. Если вы читаете этот абзац, вероятно, вы уже являетесь или скоро станете web-разработчиком. Впрочем, какой бы ни была ваша профессия, вы выбрали эту книгу потому, что слышали о замечательной новой технологии — PHP.

    В этой главе вы познакомитесь с языком PHP, получите представление о его истории и возможностях, а также основную информацию, необходимую для разработки сайтов с поддержкой PHP. Надеюсь, приведенные примеры пробудят ваш энтузиазм и наглядно покажут, какие перспективы PHP открывает перед вами и вашей организацией. Вы узнаете, как установить и настроить программное обеспечение PHP на компьютерах с Linux/UNIX или Windows и как внедрить PHP в HTML. К концу главы вы будете готовы к тому, чтобы углубленно заняться изучением других важных аспектов языка PHP. Итак, зажигайте свет, включайте свою любимую музыку и устраивайтесь поудобнее. Пришла пора познакомиться с тем, что станет одним из важнейших пунктов в вашем резюме, — с программированием на PHP.

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

    История PHP начинается с 1995 года, когда независимый программист-контрактник по имени Расмус Лердорф (Rasmus Lerdorf) написал сценарий Perl/CGI для подсчета количества посетителей сайта, прочитавших его онлайновое резюме. Его сценарий решал две задачи: регистрацию данных посетителя и вывод количества посетителей на web-странице. Развитие WWW еще только начиналось, никаких специальных средств для решения этих задач не было, и к автору хлынул поток сообщений с вопросами. Лердорф начал бесплатно раздавать свой инструментарий, названный Personal Home Page (PHP) или Hypertext Processor (гипертекстовый процессор).

    Шумный успех инструментария PHP заставил Лердорфа приступить к разработке расширений PHP. Одно из расширений преобразовывало данные, введенные на форме HTML, в символические переменные, что позволяло экспортировать их в другие системы. Чтобы добиться поставленной цели, Лердорф решил в дальнейших разработках перейти с Perl на С. Расширение существующего инструментария PHP привело к появлению PHP 2.0, или PHP-FI (Personal Home Page — Form Interpretator). В усовершенствовании версии 2.0 принимали участие программисты со всего мира.

    Новая версия PHP пользовалась исключительной популярностью, и вскоре образовалась основная команда разработчиков. Они сохранили исходную концепцию внедрения программного кода прямо в HTML и переписали заново механизм лексического анализа, что привело к появлению PHP 3.0. К моменту выхода версии 3.0 в 1997 году свыше 50 000 пользователей применяли PHP для улучшения своих web-страниц.

    В 1997 году было решено, что сокращение PHP должно означать не «Personal Home page», а «PHP Hypertext Processor»

    В течение следующих двух лет стремительное развитие PHP продолжалось. В язык добавлялись сотни новых функций, а количество пользователей стремительно росло. В начале 1999 года служба Netcraft (http://www.netcraft.com) сообщила о том, что, по минимальным оценкам, число пользователей PHP превысило 1 000 000, в результате чего PHP стал одним из самых популярных сценарных языков в мире.

    В начале 1999 года было объявлено о предстоящем выходе PHP 4.0. Хотя одной из сильнейших сторон PHP была эффективность выполнения сценариев, при первоначальных разработках не предполагалось, что на базе PHP будут строиться крупномасштабные приложения. По этой причине была начата работа над более устойчивым механизмом лексического анализа, больше известным под названием Zend (http://www.zend.com). Работа шла быстро и завершилась 22 мая 2000 года выпуском PHP версии 4.0.

    Кроме лексического анализатора Zend, компания Zend Technologies (Израиль) распространяет оптимизатор Zend, который повышает выигрыш в быстродействии от применения лексического анализатора Zend. Тесты показывают, что ускорение работы программы в результате использования оптимизатора составляет от 40 до 100 %. За дополнительной информацией обращайтесь на сайт Zend.

    На момент написания этой книги, по данным Netcraft (http://www.netcraft.com), программное обеспечение PHP было установлено более чем в 3,6 миллиона доменов. Будущее PHP выглядит светлым, поскольку продукт продолжает активно использоваться как на крупных web-сайтах, так и на компьютерах отдельных пользователей.

    PHP лучше всего охарактеризовать как работающий на стороне сервера встроенный язык сценариев Web, позволяющий разработчикам быстро и эффективно строить динамические web-приложения. С позиций грамматики и синтаксиса PHP напоминает язык программирования С, хотя разработчики не постеснялись включить в него средства из других языков, в том числе из Perl, Java и C++. Среди ценных заимствованных возможностей — поддержка регулярных выражений, мощные средства работы с массивами, объектно-ориентированная методология и обширная поддержка работы с базами данных.

    При написании приложений, выходящих за рамки традиционной, статической методологии разработки web-страниц (то есть HTML), PHP также может послужить ценным инструментом для создания и управления динамическим содержанием, который используется наряду с JavaScript, стилями, WML (Wireless Markup Language) и другими полезными языками. Благодаря наличию сотен стандартных функций PHP в состоянии решить практически любую задачу, которая может придти в голову разработчику. В нем имеется обширная поддержка создания графики и операций с ней, математических вычислений, средств электронной коммерции и таких популярных технологий, как XML (Extensible Markup Language), ODBC (Open Database Connectivity) и Macromedia Shockwave. Широкий выбор возможностей избавляет от необходимости рутинной и непростой работы по подключению сторонних модулей, поэтому многие разработчики со всего мира останавливают свой выбор на PHP.

    Одним из главных достоинств PHP является тот факт, что он внедряется прямо в HTML-код, поэтому программисту не приходится писать программу с множеством команд для простого вывода HTML. Код HTML и PHP можно чередовать по мере необходимости. PHP позволяет написать фрагмент следующего вида:

    Сообщение «Hello world!» выводится в заголовке web-страницы. Интересно то, что команда print внутри конструкции, которая обычно называется экранирующими последовательностями PHP ( ), представляет собой законченную программу. Ни длинного кода инициализации, ни включения библиотек — программа состоит лишь из того кода, который непосредственно решает поставленную задачу!

    Конечно, для выполнения сценариев PHP необходимо предварительно установить и настроить программное обеспечение PHP на сервере. Этот процесс описан в разделе «Загрузка и установка PHP/Apache» настоящей главы. Разделу предшествуют фрагменты из отзывов нескольких пользователей, выступающих в пользу PHP, с кратким обзором языка и его истории. Но прежде чем браться за процесс установки, мы познакомимся с некоторыми характеристиками PHP. Этой теме посвящен следующий раздел.

    Характеристики PHP

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

    • традиционностью;
    • простотой;
    • эффективностью;
    • безопасностью;
    • гибкостью.

    Существует еще одна «характеристика», которая делает PHP особенно привлекательным: он распространяется бесплатно!

    Традиционность

    Язык PHP кажется знакомым программистам, работающим в разных областях. Многие конструкции языка позаимствованы из Си Perl, а нередко код PHP практически неотличим от того, что встречается в типичных программах С или Pascal. Это заметно снижает начальные усилия при изучении PHP.

    Простота

    Сценарий PHP может состоять из 10 000 строк или из одной строки — все зависит от специфики вашей задачи. Вам не придется подгружать библиотеки, указывать специальные параметры компиляции или что-нибудь в этом роде. Механизм PHP просто начинает выполнять код после первой экранирующей последовательности ( ). Если код имеет правильный синтаксис, он исполняется в точности так, как указал программист.

    Эффективность

    Эффективность является исключительно важным фактором при программировании для многопользовательских сред, к числу которых относится и WWW. В PHP 4.0 был реализован механизм выделения ресурсов и обеспечена улучшенная поддержка объектно-ориентированного программирования, а также средства управления сеансом. В последней версии появился и механизм подсчета ссылок (reference counting), предотвращающий выделение лишней памяти.

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

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

    Средства безопасности системного уровня

    В PHP реализованы механизмы безопасности, находящиеся под управлением администраторов; при правильной настройке PHP это обеспечивает максимальную свободу действий и безопасность. PHP может работать в так называемом безопасном режиме (safe mode), который ограничивает возможности применения PHP пользователями по ряду важных показателей. Например, можно ограничить максимальное время выполнения и использование памяти (неконтролируемый расход памяти отрицательно влияет на быстродействие сервера). По аналогии с cgi-bin администратор также может устанавливать ограничения на каталоги, в которых пользователь может просматривать и исполнять сценарии PHP, а также использовать сценарии PHP для просмотра конфиденциальной информации на сервере (например, файла passwd).

    Средства безопасности уровня приложения

    В стандартный набор функций PHP входит ряд надежных механизмов шифрования. PHP также совместим с многими приложениями независимых фирм, что позволяет легко интегрировать его с защищенными технологиями электронной коммерции (e-commerce). Другое преимущество заключается в том, что исходный текст сценариев PHP нельзя просмотреть в браузере, поскольку сценарий компилируется до его отправки по запросу пользователя. Реализация PHP на стороне сервера предотвращает похищение нетривиальных сценариев пользователями, знаний которых хватает хотя бы для выполнения команды View Source.

    Тема безопасности настолько важна, что ей посвящена целая глава. За подробной информацией о средствах безопасности PHP обращайтесь к главе 16.

    Гибкость

    Поскольку PHP является встраиваемым (embedded) языком, он отличается исключительной гибкостью по отношению к потребностям разработчика. Хотя PHP обычно рекомендуется использовать в сочетании с HTML, он с таким же успехом интегрируется и в JavaScript, WML, XML и другие языки. Кроме того, хорошо структурированные приложения PHP легко расширяются по мере необходимости (впрочем, это относится ко всем основным языкам программирования).

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

    Поскольку PHP не содержит кода, ориентированного на конкретный web-сервер, пользователи не ограничиваются определенными серверами (возможно, незнакомыми для них). Apache, Microsoft IIS, Netscape Enterprise Server, Stronghold и Zeus — PHP работает на всех перечисленных серверах. Поскольку эти серверы работают на разных платформах, PHP в целом является платформенно-незави-симым языком и существует на таких платформах, как UNIX, Solaris, FreeBSD и Windows 95/98/NT.

    Наконец, средства PHP позволяют программисту работать с внешними компонентами, такими как Enterprise Java Beans или СОМ-объекты Win32. Благодаря

    этим новым возможностям PHP занимает достойное место среди современных технологий и обеспечивает масштабирование проектов до необходимых пределов.

    Бесплатное распространение

    Стратегия Open Source наделала немало шуму в программной отрасли. Распространение исходных текстов программ в массах оказало несомненно благотворное влияние на многие проекты, в первую очередь — Linux, хотя и успех проекта Apache сильно подкрепил позиции сторонников Open Source. Сказанное относится и к истории создания PHP, поскольку поддержка пользователей со всего мира оказалась очень важным фактором в развитии проекта PHP.

    Принятие стратегии Open Source и бесплатное распространение исходных текстов PHP оказало неоценимую услугу пользователям. Вдобавок, отзывчивое сообщество пользователей PHP является своего рода «коллективной службой поддержки», и в популярных электронных конференциях можно найти ответы даже на самые сложные вопросы.

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

    Рекомендации пользователей

    «Мы в течение долгого времени поддерживали личные контакты с некоторыми разработчиками PHP и вели с ними обширную переписку. Когда у разработчиков PHP возникали какие-то проблемы, относящиеся к MySQL, мы всегда были готовы помочь им в поиске решения. Кроме того, мы включили в MySQL несколько новых возможностей лишь для того, чтобы улучшить его интеграцию с PHP. Результатом наших усилий стало то, что MySQL превосходно работает с PHP, — и мы позаботимся о том, чтобы это положение сохранилось и в будущем!»

    Майкл «Монти» Видениус (Michael «Monty» Widenius),

    «Выбор PHP для реализации mp3.lycos.com был обусловлен несколькими причинами. Главной причиной стали сжатые сроки работы над проектом — ведь PHP ускоряет процесс разработки. Другой причиной была высокая эффективность — мы перешли от 0 к 1,4 миллиона посещений в сутки, и PHP с этим прекрасно справился. Третья причина заключалась в том, что я твердо знал: если на стадии тестирования с повышенной нагрузкой в PHP обнаружатся какие-либо ошибки, я смогу их самостоятельно исправить, поскольку PHP распространяется вместе с исходными текстами».

    Стиг Баккен (Stig Bakken),

    FAST Search & Transfer ASA

    «Я использовал PHP с первых дней, еще с версии PHP/FI 1.x. Мне понравилось, что я могу обрабатывать формы и настраивать страницы «на ходу» при помощи такого простого языка. Вместе с потребностями моей компании развивался и PHP.

    В наши дни PHP обладает исключительно богатыми возможностями. Мы используем его практически во всех создаваемых web-сайтах, включая 32bit.com и DevShed.com. Мы даже воспользовались им в Info West для реализации службы поддержки, управления учетными записями и отслеживания портов.

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

    Рэнди Косби (Randy Cosby),

    президент nGenuity, Inc. DevShed

    Вводный пример

    Пример, приведенный в листинге 1.1, наглядно показывает, как легко PHP интегрируется с HTML-кодом.

    Листинг 1.1. Создание динамической страницы PHP

    Php руководство по рнр 3 0 функции динамической загрузки

    Форум Приднестровской поддержки CMS XOOPS.

    По ссылке вы можете скачать последнюю версию CMS XOOPS. А так же прочитать инструкции по установке XOOPS и модулей

    По данным ссылкам можно скачать модули нашей разработки.

    Модуль инструкций. Ознакомьтесь с установкой XOOPS. C начальными познаниями по HTML,CSS, JS, PHP и др.

    Добро пожаловать на сайт поддержки XOOPS.

    Приднестровская поддержка XOOPS

    PHP-код встраивается в документ с помощью дескрипторов, иногда называемых также тегами:
    :

    echo «Hello, world\n» ; ?>
    Отключить поддержку этих дескрипторов нельзя. Настоятельно рекомендую использовать именно их;

    echo «Hello, world\n» ; ?>

    Доступны, только если директива short_open_tag имеет значение On . При использовании этих дескрипторов следует помнить, что могут возникнуть проблемы при выводе XML-документов, так как последовательность будет воспринята как выделение РНР-кода.
    Выражение
    echo «Hello, world\n» ; ?>
    можно записать в более компактном виде:
    «Hello, world\n» ?>

    Однако следует помнить, что этот вариант возможен, только если директива short_open_tag в файле конфигурации php.ini имеет значение On ;
    □ % и % >:
    % echo «Hello, world\n» ; % >
    Для использования этого дескриптора необходимо включить поддержку в файле php.ini . Для этого строку
    asp_tags = Off
    нужно заменить на
    asp_tags = On

    а затем перезапустить сервер Apache. В РНР 6 поддержка этих дескрипторов полностью удалена;

    . Удивлены? Внедрить РНР-код можно точно так же, как и JavaScript -код. Нужно только указать в параметре language значение РНР:

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

    Илон Маск рекомендует:  Что такое код swfdisplayitem &#62;moveto
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL