Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > PHP: оптимальная конфигурация


Автор: Mal Hack 13.1.2007, 22:06
Хочу предложить  вашему вниманию небольшой материал, касающийся тонкой настройки PHP. Мне давно хотелось собрать описание настроек PHP  в одном месте, с указанием что лучше, а что нет. Давая рекомендации, я придерживаюсь разделения оных на две части: первая – наиболее эффективна для отладки скриптов и тестирования на локальных машинах, вторая – для использования скриптов уже на сервере.

Итак, приступим. Я не буду останавливаться глубоко на тех директивах php.ini, которые не представляют ценности для повышения оптимальности или уровне отладки, т.к. общее описание директив всегда можно найти в официальной документации.

Основной раздел конфигурационного файла php.ini

short_open_tag– разрешает использование коротких тэгов (<? … ?>) для оформления PHP кода. Считаю это излишним, зачем давать возможность использовать что-то, если оно уже есть. 
Рекомендация: Off

asp_tags – аналогично предыдущему, но касается тэгов (<% … %>). По-хорошему, надо вообще задаться вопросом, зачем это нужно. В PHP6 эта опция и возможность, скорее всего, будет исключена вовсе.
Рекомендация: Off

y2k_compliance – решение «проблемы 2000», уже не актуально.
Рекомендация: Off

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

output_buffering – включение/выключение буферизации вывода. Буферизация сама по себе штука хорошая, но и использовать ее надо с умом, а не для тупого решения проблемы «Cannot send headers, headers already sent by…». Она хорошо может помочь при использовании сжатия, искусственного кэширования, поэтому, кому надо могут ее использовать через функции ob_*(), а включать ее изначально – лишняя нагрузка, которая ни к чему.
Ряд последующих директив (output_handler, zlib.output_compression, zlib.output_compression_level, zlib.output_handler, implicit_flush) соответственно либо отключаются, либо комментируются
Рекомендация: Off

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

disable_functions, disable_classes – директивы представляют интерес только для админов серверов. По-хорошему, они могут запретить функции и классы, чтобы лишний раз не сломали сервер, ввиду его безграмотной настройки.
Рекомендация: оставлять пустыми.

Группа настроек Safe Mode

C PHP6 «safe mode» будет убран, скорее всего, из языка. Использование safe mode, лично для меня, ничего кроме непонятного урезания возможностей языка не представляет. Ни с БД поработать, ничего…
Ряд последующих директив (safe_mode_gid, safe_mode_include_dir, safe_mode_exec_dir, safe_mode_allowed_env_vars, safe_mode_protected_env_vars) соответственно либо отключаются, либо комментируются
Рекомендация: Off

Управление ресурсами

max_execution_time = 30 – устанавливает время скрипта по стечении которого, автоматически происходит его программное снятие (прекращается выполнение). В тех задачах, где надо больше времени на обработку информации (работа с графикой, например), эта директива может быть перманентно изменена в самом скрипте через ini_set. Для обычных же скриптов время выполнения, как правило, не превышает секунды, в зависимости от «тормознутости» сервера 2-3 секунд, поэтому нечего грузить  сервер, если что-то пошло не так (зацикливание и т.п.).
Рекомендация: - 10

max_input_time = 60 – время, которое скрипт будет ждать входную информацию, к примеру с HTML формы. Если загружаете большие файлы, то делаете это значение побольше, если нет, поменьше. Т.к. эпоха dial-ip’a все-таки прошла, стандартного значения (60) вполне хватает для нормальной работы. Для очень уж больших файлов вообще лучше использовать FTP протокол.

memory_limit = 16M – ограничивает предел максимального значения памяти, которое может занимать скрипт и его дискрипторы. К примеру, fopen грузит весь файл в память, imagecreateformpng аналогично, при загрузке файла, также загружаемый файл использует этот же выделенный объем памяти. Примеров – много. Суть такая. Если вам не надо работать с большими файлами, делаете эту директиву поменьше, если надо – побольше. Само собой, чем меньше, тем лучше, но при этом не забываете о достаточности для решения стоящих перед скриптами задач.

post_max_size = 8M – ограничивает максимальный объем данных, получаемых от пользователя методом POST
Рекомендация: в любом случае он должен быть меньше memory_limit причем в два раза (условно, конечно).

upload_max_filesize = 2М – устанавливает максимальный размер файла, который может быть получен методом POST.
Рекомендация: в любом случае он должен быть меньше post_max_size.

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

error_reporting – устанавливает  уровень показа ошибок.
Рекомендация: на домашнем сервере для отладки включаем показ ВСЕХ ошибок: E_ALL & E_STRICT, на сервере, ошибки не показываем (значение - 0). Во-первых, не позоримся, ваши скрипты должны работать без ошибок, во-вторых, не даем потенциальным злоумышленникам видеть пути и файлы и какие ошибки.

display_errors, display_startup_errors – устанавливают возможность показывать и не показывать сообщения об ошибках.
Рекомендация: аналогично error_reporting

log_errors, log_errors_max_len
 – запись ошибок в файл и длина строки оных, в файл, путь к которому установлен в error_log. Если честно, не вижу смысла. На сервере вывод ошибок отключен, считаем, что ошибок в скрипте – нет, для тестирования достаточно вывода ошибок в браузер, и смысла грузить сервер лишними действиями по логированию – нет.
Рекомендация: для отладки – выключаем, на сервере, все-таки включить можно.

ignore_repeated_errors, ignore_repeated_source – игнорирование повторов.
Рекомендация: вылючать, т.к. ошибки надо видеть все.

track_errors – запись ПОСЛЕДНЕЙ ошибки в $php_errormsg. Смысла нет. При тестировании ошибки видны в браузере, на сервере уже считаем, что скрипт сам работает с ошибками.
Рекомендация: отключить

Работа скриптов

register_globals– практически «убивает» понятие области видимости. В PHP6, скорее всего будет удалена, в целях безопасности и грамотного программирования.
Рекомендация: Off

register_long_arrays – позволяет использовать массивы HTTP_GET_VARS, как суперглобальные. Смысла в этом нет, темпаче эти переменные выйдут из PHP.
Рекомендация: Off

magic_quotes_gpc, magic_quotes_runtime, magic_quotes_sybase – автоматически экранируют получаемые от пользователя данные. В PHP6 этих настроек, скорее всего, не будет.
Рекомендация: вы сами должны управлять данными, получая их в исходном виде, следовательно, настройки ставятся в значение Off.

auto_prepend_file, auto_append_file – служат для указания файлов, которые будут автоматически выполняться до выполнения запрашиваемого файла. О выполнении этих файлов пользователь не узнает, если вы не сделаете какого-либо вывода. Можно использовать для запуска после выполнения запрашиваемого файла скрипта статистики.
Рекомендация: если действительно есть такая необходимость, значит, включайте, если можно обойтись, то не надо.

default_charset – установление кодировки. Иногда бывает необходимо ее прописать.
Рекомендация: прописывайте нужную вам кодировку.

allow_url_fopen – позволяет использовать URL’ы, в качестве параметров для функций файловой системы.
Рекомендация: Off, почему: 
Цитата

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

Как мы знаем, fopen, file, file_get_contents могут принимать в качестве параметра URL удаленного файла. НО использование этих функций не правильно, и вот почему:

1. Эти функции работают с удаленными хостами только при включенной директиве allow_url_fopen в php.ini (установить эту директиву в .htaccess или скрипте нельзя). Как правило, хостеры ее отключают. По крайней мере умные.
2. fopen не имеет параметра тайм-аута, что самое важное, т.к. в случае если сайт не отвечает или тяжело отвечает, скрипт может легко "подвиснуть".
3. Если где-то используется fopen и случайно пропущена обработка возможности ошибочного входного параметра, то может быть XSS или переполнения буфера.
4. Нет возможности указать порт, по которому необходимо соединиться с сервером.
5. Лишние операции, т.к. тот же fopen вызывать будет сокеты. Зачем использовать сверх функции?


allow_url_include – аналогична предыдущей, но для include подобных функций. Смысла нет опять-таки. Введена в 5.2.0.
Рекомендация: Off

Автор: Voventus 1.2.2007, 18:00
Цитата

short_open_tag– разрешает использование коротких тэгов (<? … ?>) для оформления PHP кода. Считаю это излишним, зачем давать возможность использовать что-то, если оно уже есть. 
Рекомендация: Off


А как же конструкции вида 
Код

<?=$variable?>

Автор: BobiKK 1.2.2007, 21:08
Подобные конструкции идут лесом. Потому что не по стандартам это, плохо.

Автор: AztEK 7.2.2007, 12:25
почему плохо?

Автор: BobiKK 7.2.2007, 20:22
Цитата(AztEK @ 7.2.2007,  12:25)
почему плохо?

Always use <?php ?> to delimit PHP code, not the <? ?> shorthand. This is required for PEAR compliance and is also the most portable way to include PHP code on differing operating systems and setups. © Pear Coding Standart

Автор: Aliance 9.2.2007, 01:02
Цитата(Mal Hack @  13.1.2007,  23:06 Найти цитируемый пост)

y2k_compliance – решение «проблемы 2000», уже не актуально.
Рекомендация: Off

Подскажи, это имеется ввиду проблема в "годе"? Если на сайте есть, скажем, скрипт календаря старого - эту директиву все равно отключать?

Данные настройки allow_url_fopen, expose_php, open_basedir, ignore_repeated_errors, ignore_repeated_source, track_errors, register_long_arrays изменяются ли через .htaccess?

auto_prepend_file, auto_append_file - можно ли использовать, скажем, для подлючения конфига?

allow_url_include - если пхп 4ый - не стоит ее пытаться отключить?

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

Спасибо за ответы!

Автор: Mal Hack 9.2.2007, 01:10
Цитата(Aliance @  9.2.2007,  01:02 Найти цитируемый пост)
Подскажи, это имеется ввиду проблема в "годе"? Если на сайте есть, скажем, скрипт календаря старого - эту директиву все равно отключать?

На нее забить можно... Это все от "проблемы 2000" для совместимости с очень старыми браузерами.

Цитата(Aliance @  9.2.2007,  01:02 Найти цитируемый пост)
Данные настройки allow_url_fopen, expose_php, open_basedir, ignore_repeated_errors, ignore_repeated_source, track_errors, register_long_arrays изменяются ли через .htaccess?

http://ru.php.net/manual/ru/ini.php#ini.list

Цитата(Aliance @  9.2.2007,  01:02 Найти цитируемый пост)
auto_prepend_file, auto_append_file - можно ли использовать, скажем, для подлючения конфига?

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

Цитата(Aliance @  9.2.2007,  01:02 Найти цитируемый пост)
allow_url_include - если пхп 4ый - не стоит ее пытаться отключить?

Нет.

Цитата(Aliance @  9.2.2007,  01:02 Найти цитируемый пост)
output_buffering - кинь пожалуйста ссылочку на тему, где объясняется, как правильно обходить проблему посланных заголовков, почему нельзя использовать буферизацию.

http://vingrad.ru/PHP-ART-002859

Автор: morfus 30.6.2007, 15:20
(далее ИМХО)

Цитата

allow_url_fopen

Не согласен, наоборот в РНР-5.2.0 должна быть включена обязательно, опасность представляет удалённый include (который включать очень опасно) но на версии 5.2.0 где он отключается отдельно и в таком случае удалённый fopen может во много раз упростить (ускорить) написание скрипта а стало быть сэкономить время, деньги и нервы !!!

Цитата

short_open_tag

В корне не согласен, это мало того "по стандарту" это ещё и главная часть "native-шаблонизаторa" для РНР

Автор: Fally 11.7.2007, 17:14
Цитата(Mal Hack @  13.1.2007,  22:06 Найти цитируемый пост)
error_reporting – устанавливает  уровень показа ошибок.
Рекомендация: на домашнем сервере для отладки включаем показ ВСЕХ ошибок: E_ALL & E_STRICT, на сервере, ошибки не показываем (значение - 0). Во-первых, не позоримся, ваши скрипты должны работать без ошибок, во-вторых, не даем потенциальным злоумышленникам видеть пути и файлы и какие ошибки.

По этому пункту, позволю себе не согласиться, т.к. данная деректива _всегда_ должна быть E_ALL & E_NOTICE, почему она должна быть включена, читайте ниже. Фраза "не позоримся" убила вообще, если скрипт написан корректно и всё делается так, как должно, то даже E-NOTICE не появиться, о неопределённой переменной...
Цитата(Mal Hack @  13.1.2007,  22:06 Найти цитируемый пост)

log_errors, log_errors_max_len – запись ошибок в файл и длина строки оных, в файл, путь к которому установлен в error_log. Если честно, не вижу смысла. На сервере вывод ошибок отключен, считаем, что ошибок в скрипте – нет, для тестирования достаточно вывода ошибок в браузер, и смысла грузить сервер лишними действиями по логированию – нет.
Рекомендация: для отладки – выключаем, на сервере, все-таки включить можно

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

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

Автор: morfus 8.8.2007, 09:28
Цитата

а вот записать в лог, для дальнейшего анализа данного лога очень хорошая идея

(ИМХО) Единственно правильная идея

Автор: Mal Hack 8.8.2007, 13:00
Цитата(morfus @  30.6.2007,  15:20 Найти цитируемый пост)
Не согласен, наоборот в РНР-5.2.0 должна быть включена обязательно, опасность представляет удалённый include (который включать очень опасно) но на версии 5.2.0 где он отключается отдельно и в таком случае удалённый fopen может во много раз упростить (ускорить) написание скрипта а стало быть сэкономить время, деньги и нервы !!!

fopen(http://....) не содержи тайм аута, почему о его применении говорить даже не стоит... Плюс, я уже писал выше, что фопен все равно вызывает сокеты, так зачем, спрашивается поливать помидоры, если идет ливень?

Цитата(morfus @  30.6.2007,  15:20 Найти цитируемый пост)
В корне не согласен, это мало того "по стандарту" это ещё и главная часть "native-шаблонизаторa" для РНР 

Никакая это не часть шаблонов, ни покакому стандарту это...


Цитата(Fally @  11.7.2007,  17:14 Найти цитируемый пост)
По этому пункту, позволю себе не согласиться, т.к. данная деректива _всегда_ должна быть E_ALL & E_NOTICE

Если мне не изменяет память, STRICT выше NOTICE, при крайней мере на момент написания было именно так.

Цитата(Fally @  11.7.2007,  17:14 Найти цитируемый пост)
Фраза "не позоримся" убила вообще

Я писал с некоторой харизматической иронией, которую вы не просекли smile


Цитата(Fally @  11.7.2007,  17:14 Найти цитируемый пост)
Конечно же показывать её пользователю не имеет смысла, а вот записать в лог, для дальнейшего анализа данного лога очень хорошая идея.

В принципе согласен с вами, но, если проект крупный и идет нагрузка на сервер, при условии что проект отлажен, нужды в этом - нет. И потом, как вы сказали: "если скрипт написан корректно и всё делается так, как должно, то даже E-NOTICE не появиться, о неопределённой переменной". Я бы тут исходил из конкретной ситуации, наверное.

Автор: nerezus 30.11.2007, 10:42
Цитата

Никакая это не часть шаблонов, ни покакому стандарту это...
 А где живет стандарт PHP?

Цитата

allow_url_fopen
 Только 2 пункт логичен, остальное притянуто за... [вставить нужное слово]

С пунктами 1 и 5 вообще не согласен.
1. Это удобно. Да и умный хостер всегда послушается нормального клиента.
5. Оверхед на C предпочтительнее оверхеда на PHP.

Автор: patt 10.6.2008, 14:10
Цитата(Mal Hack @ 13.1.2007,  22:06)
short_open_tag– разрешает использование коротких тэгов (<? … ?>) для оформления PHP кода. Считаю это излишним, зачем давать возможность использовать что-то, если оно уже есть. 
Рекомендация: Off

Сколько не искал, почему не стоит  использовать short_open_tag - не нашел... В основном говорят о каких то неизвестных стандартах, о том, что эта опция может быть отключена (чего ни разу за свой 5-летний стаж не наблюдал), о несоответствии xml... при чём тут xml вообще не понятно...

вывод такой: минусы использовния short tag -  кто то может сказать, что это не круто...
плюсы: читабельный html код, экономия времени разработки...

Автор: Fortop 10.6.2008, 18:50
patt, 
<?php ?>
будет работать везде

<? ?>
нет

Одного этого минуса достаточно.

Автор: Fally 10.6.2008, 19:02
patt, PEAR Coding Standart, Zend Framework Coding Standart.. я на них всегда ориентируюсь.

Автор: patt 19.6.2008, 16:18
Fortop, если делается что то, что должно работать везде, например cms тогда неиспользование шот тэгов оправдано, сам так пишу, но в 99% крупных проектов, пишутся под зараннее известный хостинг, или под хост с доступом ко всем настройкам.

Автор: nerezus 20.10.2008, 23:29
Цитата

<?php ?>
будет работать везде

<? ?>
нет

Одного этого минуса достаточно.
 А шаблоны писать? <?= ?> гораздо удобнее, чем <?php echo ; ?>
Тем более, что как правило сервер настраивают под софт, а не наоборот ;)

Автор: nerezus 1.12.2008, 11:25
М, исправлять ошибки будем, или еще лет 5 висит пусть неисправленная?)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)