PHPCon Poland 2024

Установка

Этот раздел содержит общие вопросы о способах установки PHP. Дистрибутивы PHP совместимы с большей частью операционных систем и веб-серверов.

Инструкции раздела «Установка и настройка» рассказывают, как установить PHP.

  1. Почему лучше не пользоваться веб-сервером Apache2 с многопоточным модулем MPM (event, worker) в производственной среде?
  2. ОС Unix и Windows: Где искать файл php.ini?
  3. Unix: Я установил PHP, но при каждом открытии какого-либо документа вижу «Document Contains No Data», что это значит?
  4. Unix: Я установил PHP через менеджер пакетов RPMS, но Apache не обрабатывает PHP-страницы, в чём дело?
  5. Unix: Я исправил Apache модулем FrontPage и теперь PHP не работает. Получается, PHP несовместим с модулями Apache FrontPage?
  6. Unix и Windows: Я установил PHP, но при попытке открыть PHP-файл в браузере вижу пустой экран.
  7. Unix и Windows: Я установил PHP, но когда пытаюсь посмотреть созданную PHP-страницу в браузере, получаю ошибку 500.
  8. Некоторые операционные системы: Я установил PHP без ошибок, но когда пытаюсь запустить Apache, выводится ошибка: [mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows: Я установил PHP, но когда пытаюсь открыть страницу скрипта в браузере, получаю ошибку: cgi error: The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
  10. Windows: Я всё сделал по инструкции, но PHP и сервер IIS не хотят работать вместе!
  11. Когда я запускаю PHP как интерфейс CGI к веб-серверам IIS, PWS, OmniHTTPD или Xitami, получаю ошибку: Security Alert! PHP CGI cannot be accessed directly..
  12. Как я могу понять, что файл php.ini найден и используется? Складывается впечатление, что вносимые изменения игнорируются.
  13. Как добавить директорию PHP в переменную PATH в Windows?
  14. Как в Windows я могу сделать файл php.ini доступным для PHP?
  15. Можно ли использовать согласование контента Apache (опция MultiViews) с PHP?
  16. Ограничен ли PHP только обработкой HTTP-методов GET и POST?
Почему лучше не пользоваться веб-сервером Apache2 с многопоточным модулем MPM (event, worker) в производственной среде?

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

Если нужно подключить многопоточный модуль MPM, посмотрите на конфигурацию протокола FastCGI, в которой PHP выполняется в своём пространстве памяти.

ОС Unix и Windows: Где искать файл php.ini?

По умолчанию в Unix файл лежит в каталоге /usr/local/lib, который соответствует <установочный-путь>/lib. Этот путь можно изменить в момент компиляции через флаг --with-config-file-path Например, так:

--with-config-file-path=/etc
И затем скопировать файл php.ini-development из дистрибутива по пути /etc/php.ini, а затем внести в него необходимые изменения.

--with-config-file-scan-dir=PATH

В ОС Windows путь к файлу php.ini по умолчанию — это путь к директории Windows. Если разработчик пользуется веб-сервером Apache, файл php.ini лежит по пути: ?\program files\apache group\apache\. Поэтому можно иметь разные файлы php.ini для разных версий Apache на одном компьютере.

Смотрите также: файл настроек.

Unix: Я установил PHP, но при каждом открытии какого-либо документа вижу «Document Contains No Data», что это значит?

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

  • Остановите httpd-процессы

  • gdb httpd

  • Вновь остановите httpd-процессы

  • > run -X -f путь_к_httpd.conf

  • Затем скопируйте URL, который вызвал проблему в браузере

  • > run -X -f путь_к_httpd.conf

  • Если будет происходить core dump, отладчик gdb сообщит об этом

  • Введите bt

  • Включите backtrace в отчёт об ошибке. И отправьте по адресу: » https://github.com/php/php-src/issues

Если скрипт использует регулярные выражения (preg_match() и подобные), проверьте, с одинаковыми ли пакетами обработки RegEx скомпилированы PHP и Apache? В случае PHP и Apache 1.3.x это происходит автоматически.

Unix: Я установил PHP через менеджер пакетов RPMS, но Apache не обрабатывает PHP-страницы, в чём дело?

Если вы установили и Apache, и PHP из RPM-пакетов, раскомментируйте или добавьте все или часть следующих строк в файл httpd.conf:

# Extra Modules
AddModule mod_php.c
AddModule mod_perl.c

# Extra Modules
LoadModule php_module         modules/mod_php.so
LoadModule php5_module        modules/libphp5.so
LoadModule perl_module        modules/libperl.so
И добавьте:
AddType application/x-httpd-php .php
…в глобальные свойства или в свойства того виртуального домена VirtualDomain, для которого нужно включить поддержку PHP.

Unix: Я исправил Apache модулем FrontPage и теперь PHP не работает. Получается, PHP несовместим с модулями Apache FrontPage?

Нет, PHP отлично работает с модулями FrontPage. Проблема в том, что патч FrontPage изменяет ряд структур Apache, на которые полагается PHP. Перекомпиляция PHP командой «make clean ; make» после установки патча FP решит проблему.

Unix и Windows: Я установил PHP, но при попытке открыть PHP-файл в браузере вижу пустой экран.

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

Unix и Windows: Я установил PHP, но когда пытаюсь посмотреть созданную PHP-страницу в браузере, получаю ошибку 500.

Что-то пошло не так, когда сервер попытался запустить PHP. Чтобы увидеть возникающую исходную ошибку, в командной строке перейдите в директорию, в которой лежит исполняемый файл PHP (php.exe в Windows), и запустите команду php -i. Если есть какие-либо проблемы с запуском PHP, будет выведена соответствующая ошибка, которая подскажет, что надо исправить. Если вы увидите экран с HTML-кодом (вывод функции phpinfo()), значит, PHP работает нормально, и проблема связана с настройками веб-сервера.

Некоторые операционные системы: Я установил PHP без ошибок, но когда пытаюсь запустить Apache, выводится ошибка:
[mybox:user /src/php5] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

Это означает, что проблема не в PHP, а в клиентских библиотеках MySQL. Часть библиотек требуют сборки PHP с опцией --with-zlib. Этот нюанс описан в FAQ по MySQL.

Windows: Я установил PHP, но когда пытаюсь открыть страницу скрипта в браузере, получаю ошибку:
cgi error:
 The specified CGI application misbehaved by not
 returning a complete set of HTTP headers.
 The headers it did return are:

Это сообщение говорит о том, что PHP не смог вывести данные в стандартный поток ввода-вывода. Чтобы увидеть понятное сообщение об ошибке, в командной строке перейдите в директорию, в которой лежит исполняемый файл PHP (php.exe в Windows), и запустите команду php -i. Если есть проблемы с запуском PHP, будет выведена соответствующая ошибка, которая подскажет, что надо исправить. Если вы увидите экран с HTML-кодом (вывод функции phpinfo()), значит, PHP работает нормально.

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

  • Права на PHP-скрипт, файлы php.exe, php5ts.dll, php.ini или модули PHP, которые вы пытаетесь загрузить, не дают анонимному интернет-пользователю ISUR_<machinename> получить к ним доступ.
  • Файл скрипта отсутствует (или, возможно, лежит не там, где вы предполагали, относительно корневого каталога веб-сервера). Обратите внимание, что на веб-сервере IIS можно отловить ошибку, отметив опцию «check file exists» в настройках «script mappings» в Internet Services Manager. Если файл отсутствует, сервер вместо этого вернёт ошибку 404. Дополнительное преимущество состоит в том, что IIS будет выполнять необходимую аутентификацию на основе разрешений NTlanMan в файле сценария.
Windows: Я всё сделал по инструкции, но PHP и сервер IIS не хотят работать вместе!

Убедитесь, что пользователи, которым может потребоваться запуск PHP-скрипта, имеют права на запуск php.exe! Веб-сервер IIS использует анонимного пользователя, который был создан при инсталляции. Этот пользователь должен иметь права на запуск файла php.exe. Так же, каждый авторизованный пользователь должен иметь права на запуск php.exe. А для IIS4 нужно сказать, что PHP — это скриптовый движок. Также прочтите этот FAQ.

Когда я запускаю PHP как интерфейс CGI к веб-серверам IIS, PWS, OmniHTTPD или Xitami, получаю ошибку: Security Alert! PHP CGI cannot be accessed directly..

Вы должны установить опцию cgi.force_redirect со значением 0. По умолчанию она равна 1. Убедитесь, что она не закомментирована символом ;. Как и остальные опции PHP, её настраивают в файле php.ini

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

Как я могу понять, что файл php.ini найден и используется? Складывается впечатление, что вносимые изменения игнорируются.

Для проверки, какой именно файл php.ini подключается, запустите функцию phpinfo(). В верхней части вывода будет список с названием Configuration File (php.ini). Из него можно понять, какой именно файл php.ini подключён. Если указана только директория в PATH, а файл конфигурации не прочитан, то просто скопируйте его в эту директорию. Если php.ini включён в переменную окружения PATH — это значит, что он прочитан.

Если файл php.ini читается и PHP запускается как модуль, то после внесения изменений в php.ini необходимо перезагрузить веб-сервер.

Также смотрите описание php_ini_loaded_file().

Как добавить директорию PHP в переменную PATH в Windows?

В Windows:

  • Старт → Панель Управления → Система

  • Перейдите на вкладку «Дополнительно»

  • Нажмите кнопку «Переменные Окружения»

  • Посмотрите раздел «Системные Переменные»

  • Найдите строку, которая содержит переменную PATH

  • Дважды щёлкните по ней мышью

  • Допишите в конец строки путь к исполняемому файлу PHP, не забыв добавить перед ним символ ';' (например ;C:\php)

  • Нажмите OK

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

Как в Windows я могу сделать файл php.ini доступным для PHP?

Есть несколько способов сделать это. Если вы установили Apache, обратитесь к документации Apache, иначе вы должны установить переменную среды PHPRC.

Можно ли использовать согласование контента Apache (опция MultiViews) с PHP?

Если ссылки на файлы PHP содержат расширения, то всё будет работать отлично. Этот FAQ применим тогда, когда ссылки не содержат расширения и нужно использовать согласование контента для файлов PHP из URL-адреса. Если так, замените строку AddType application/x-httpd-php .php на:

AddHandler php5-script php
AddType text/html php
Это решение не сработает с Apache 1, поскольку модуль PHP не отлавливает php-script.

Ограничен ли PHP только обработкой HTTP-методов GET и POST?

Нет, можно обработать и другие методы запроса, например CONNECT. Правильный статус ответа нужно посылать через функцию header(). Если нужно, чтобы PHP работал только с методами GET и POST, необходимо сконфигурировать Apache так:

<LimitExcept GET POST>
Deny from all
</LimitExcept>

add a note

User Contributed Notes 5 notes

up
16
per dot fikse at ipj dot no
18 years ago
Installing PHP 4 or 5 on Windows Server 2003 x64 results in http error 505. This is not a PHP bug. It is due to running a 32-bit ISAPI DLL under the 64-bit version of IIS 6, as documented here: http://support.microsoft.com/?id=895976

Solution: Flip the Metabase flag for Enable32bitAppOnWin64 as described in http://support.microsoft.com/?id=894435 ,
like this: CSCRIPT ADSUTIL.VBS SET W3SVC/AppPools/Enable32bitAppOnWin64 1

(Alternatively with full path: cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1)
up
5
charleslynch at xybersoftware dot com
16 years ago
One final note to the message below if you are getting the message about not having rights to execute...You need to use IIS right click on the website and choose 'Properties/Home Directory' then on the 'Execute Permissions' combo box you need to choose 'Scripts only'...Click ok...another dialog may appear asking which directories to apply the action too...choose any directories that you intend on using php in and click ok...It should work now...
up
6
emzeperx at emzeper dot hu
18 years ago
You do not have to restart the whole system make effect of changing the PATH env var. For me (sbs2003) worked automatically.
on older systems you can use

set $Path=%path%;c:\php

command to extend immediately the path var.
up
2
Curtis
17 years ago
I have some additional troubleshooting tips for 53.7, which deals with getting a blank screen on your browser when running a PHP script.

In addition to server misconfiguration, it may also be that PHP isn't configured to output errors to the browser, which is the case if you or your host uses a more secure php.ini. If this is the case, you need to find out where errors are being logged to find out if any errors are preventing normal output from being delivered to the client.

If you have access to php.ini, check the 'display_errors' directive, which is, by default, located under the 'error_reporting' directive. It's helpful to have 'display_errors' on during debugging phases, but best to have it off in production environments.

Related functions: http://php.net/ini_set | http://php.net/error_reporting | http://php.net/error_log
up
1
joerg at fenin dot de
16 years ago
To limit HTTP Request Methods on the Apache server running PHP you should use mod_rewrite or mod_security instead of LimitExcept, to give you more control over the handling of such http errors. Can go in .htaccess file or httpd.conf

# mod_rewrite
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST)$
RewriteRule .* - [F,L]
</IfModule>

# mod_security
<IfModule mod_security.c>
SecFilterSelective REQUEST_METHOD "!^(GET|HEAD|POST)$" "deny,log,status:403"
</IfModule>

You can use the php request method scanner at askapache to see exactly how your server deals with various request methods, and check that your server is configured properly..

http://www.askapache.com/online-tools/request-method-scanner/
To Top