PHP Conference Nagoya 2025

Встановлення

Цей розділ містить загальні питання по встановленню PHP. PHP доступна майже для будь-яких операційних систем та для більшості вебсерверів.

Щоб встановити PHP, пройдіть кроки описані в розділі Встановлення та налаштування.

  1. Чому я не повинен використовувати Apache2 з потоковим MPM на робочих серверах?
  2. Unix/Windows: Де повинен знаходитись файл php.ini?
  3. Unix: Я встановив PHP, але кожен раз завантажуючи документ, я отримую повідомлення 'Document Contains No Data'! (Документ не містить даних) Чому так відбувається?
  4. Unix: Я встановив PHP використовуючи RPMS, але Apache не обробляє сторінки PHP! Чому так відбувається?
  5. Unix: Я залатав Apache за допомогою розширення FrontPage, але раптово PHP перестав працювати. Виходить, що PHP з розширенням FrontPage для Apache несумісні?
  6. Unix/Windows: Я встановив PHP, але коли намагаюсь викликати PHP-скрипти через браузер, то отримую пустий екран.
  7. Unix/Windows: Я встановив PHP, але коли намагаюсь викликати PHP-скрипт через браузер, то отримую помилку сервера 500.
  8. Деякі Операційні Системи: Я встановив PHP без помилок, але коли намагаюсь запустити Apache, то отримую помилки "undefined symbol" (невизначений символ): [mybox:user /src/php5] root# apachectl configtest apachectl: /usr/local/apache/bin/httpd Undefined symbols: _compress _uncompress
  9. Windows: Я встановив PHP, але коли намагаюсь доступитись до 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. Як зробити файл php.ini доступним для PHP на Windows?
  15. Windows: Як перевірити, що PHP на сервері IIS має право запису до тимчасової директорії?
  16. Чи можна використовувати Apache Content Negotiation (опцію MultiViews) разом з PHP?
  17. Чи можна зробити обмеження з боку PHP, щоб обробляти тільки запити від методів GET та POST?
Чому я не повинен використовувати Apache2 з потоковим MPM на робочих серверах?

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 спочатку шукається в директорії, де встановлено Apache, наприклад в c:\program files\apache group\apache. В такому разі, ви можете мати кілька різних файлів php.ini для різних версій Apache на одній і тій самій машині.

Прочитайте також інформацію про Файл конфігурації.

Unix: Я встановив PHP, але кожен раз завантажуючи документ, я отримую повідомлення 'Document Contains No Data'! (Документ не містить даних) Чому так відбувається?

Це ймовірно означає, що в PHP виникли деякі проблеми, та її ядро впало. Продивіться журнали помилок сервера, та спробуйте відтворити проблему створивши невеличкий тест. Якщо ви знаєте як використовувати 'gdb', це може бути дуже корисним, бо ви можете надати зворотній слід (backtrace) разом з вашим звітом про неполадку, щоб допомогти розробникам точно визначити проблему. Якщо ви використовуєте PHP як модуль Apache, спробуйте щось схоже на це:

  • Зупиніть процес httpd, та виконайте наступну команду:

  • gdb httpd

  • Зупиніть процес httpd, та виконайте наступну команду:

  • > run -X -f /шлях/до/httpd.conf

  • Потім через браузер викличте URL, що викликає вашу проблему, та виконайте наступну команду:

  • > run -X -f /шлях/до/httpd.conf

  • Якщо ядро впаде, gdb повинен проінформувати вас про це

  • виконайте команду: bt

  • Вам потрібно включити отриманий зворотній слід (backtrace) у звіт про неполадку на сайті » https://github.com/php/php-src/issues

Якщо ваш скрипт використовує функцію регулярного виразу (preg_match() та подібні), потрібно переконатись, що ви зібрали PHP та Apache з одним і тим же пакетом регулярних виразів. Це повинно відбуватись автоматично з PHP та Apache 1.3.x

Unix: Я встановив PHP використовуючи RPMS, але Apache не обробляє сторінки PHP! Чому так відбувається?

Якщо припустити, що ви встановили Apache та PHP з пакетів RPM, то в такому разі, вам потрібно розкоментувати або додати кілька або всі рядки у ваш файл httpd.conf:

# Додаткові модулі
AddModule mod_php.c
AddModule mod_perl.c

# Додаткові модулі
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 з розширенням FrontPage для Apache несумісні?

Ні, PHP добре працює з розширенням FrontPage. Проблема в тому, що латка FrontPage змінює деякі структури Apache, на які PHP покладається. Перекомпіляція PHP (використовуючи 'make clean ; make') після встановлення латки FrontPage, повинна вирішити цю проблему.

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

Прогляньте код (view source) у браузері, і ви мабуть побачите початковий код PHP-скрипта. Це означає, що вебсервер не відправляє скрипт до PHP-інтерпретатора. Тобто є якісь помилки в конфігурації вебсервера, то ж двічі перевірте цю конфігурацію, дотримуючись інструкцій встановлення PHP.

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

Щось помилкове стається, коли вебсервер намагається запустити PHP. Щоб побачити зрозумілі повідомлення помилок, з командного рядка, змініть поточну директорію на ту, де знаходиться виконавчий файл PHP (у Windows це php.exe) та запустіть php -i. Якщо PHP матиме будь-яку проблему, то вона покаже відповідне повідомлення помилки, яке дасть вам уявлення "що робити далі". Якщо ж вам видається повен екран HTML-коду (що є виводом функції phpinfo()), то PHP працює справно, і проблема можливо стосується конфігурації вебсервера, яку вам потрібно двічі перевірити.

Деякі Операційні Системи: Я встановив PHP без помилок, але коли намагаюсь запустити Apache, то отримую помилки "undefined symbol" (невизначений символ):
[mybox:user /src/php5] root# apachectl configtest
 apachectl: /usr/local/apache/bin/httpd Undefined symbols:
  _compress
  _uncompress

Це повідомлення насправді стосується не PHP, а клієнтської бібліотеки MySQL. В деяких випадках потрібно --with-zlib, а в деяких - ні. Дана проблема згадана в ЧаПі MySQL.

Windows: Я встановив PHP, але коли намагаюсь доступитись до 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 (у Windows це php.exe) та запустіть команду php -i. Якщо PHP матиме будь-яку проблему, то вона покаже відповідне повідомлення помилки, яке дасть вам уявлення "що робити далі". Якщо ж вам видається повен екран HTML-коду (що є виводом функції phpinfo()), то PHP працює справно.

Як тільки PHP справно запрацює, з командного рядка, спробуйте знову доступитись до скрипта через браузер. Якщо проблема ще залишається, то причина може бути однією з наступних:

  • Анонімний інтернет-користувач ISUR_<тут-ім'я-машини>, через відсутність прав, не може отримати доступ до PHP-скриптів, php.exe, php5ts.dll, php.ini або до будь-якого PHP-розширення, яке ви намагаєтесь завантажити.
  • Файла зі скриптом не існує (або, можливо, він не там, де ви його уявляєте, по відношенню до кореневої директорії вашого вебсервера). Зауважте, що в IIS ви можете попастись на це повідомлення, якщо поставите галочку 'check file exists' (перевіряти наявність файла) під час налаштування співставлення скриптів (їх мапінгу) в Менеджері Internet Services. Насправді, якщо файлу зі скриптом не існує, то вебсервер повертатиме 404 помилку. Також існує додаткова перевага в тому, що IIS буде виконувати будь-яку автентифікацію, яка базується на NTLanMan-дозволах для файлів зі скриптами.
Windows: Я дотримувався всіх інструкцій, але все ще не можу запустити PHP та IIS, для їх сумісної роботи!

Переконайтесь, що всі користувачі, кому потрібно запускати PHP-скрипти, мають права на запуск php.exe! IIS використовує анонімного користувача, який додається під час встановлення IIS. Цьому користувачу потрібні права на запуск php.exe. Права на запуск php.exe також потрібні для будь-якого авторизованого користувача. А IIS4, потрібно повідомити, що PHP є скриптовою системою. Також, вам буде цікаво прочитати цей пункт ЧАПу.

При запуску PHP як CGI на IIS, PWS, OmniHTTPD або Xitami, я отримую наступну помилку: Security Alert! PHP CGI cannot be accessed directly.

Вам потрібно встановити для директиви cgi.force_redirect значення 0 (початково встановлено 1), а також переконайтесь, цю що директиву не закоментовано (через символ крапки-з-комою ;). Як і всі директиви, вона також знаходиться у файлі php.ini

Оскільки початково встановлено 1, то дуже важливо, щоб ви переконались на 100%, що буде читатись коректний файл php.ini. Читайте докладніше в цьому пункті ЧаПів.

Як я можу переконатись, що мій файл php.ini знаходиться та читається? Схоже, що коли я його змінюю, мої зміни не впроваджуються.

Щоб переконатись, що файл php.ini читається через PHP, викличте функцію phpinfo(). Вгорі виведеної таблиці, знайдіть пункт Configuration File (php.ini), де буде перелік, де саме PHP шукає файл php.ini та чи було його прочитано. Якщо вказати тільки директорію PATH, то файл не буде прочитано; вам слід покласти php.ini в цю директорію. Якщо php.ini знаходиться в PATH, його буде прочитано.

Якщо php.ini знаходиться в місці, де він читається, та PHP запущено як модуль, то переконайтесь, що ви перезапустили вебсервер після внесення змін до php.ini

Також прогляньте php_ini_loaded_file().

Як я можу додати директорію PHP до PATH на Windows?

На Windows:

  • Перейдіть в Панель керування та кляцніть по ярлику Система (Старт → Панель керування)

  • Перейдіть на закладку Додатково

  • Клікніть кнопку 'Змінні оточення'

  • Огляньте блок 'Системні Змінні'

  • Знайдіть запис Path (можливо потрібно прокрутити список, щоб знайти цю змінну)

  • Подвійним кліком відкрийте знайдений запис Path

  • Допишіть до існуючого запису символ ';' (якщо його немає в кінці) і далі впишіть шлях до вашої директорії PHP (напр. ;C:\php)

  • Натискайте OK

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

Як зробити файл php.ini доступним для PHP на Windows?

Є кілька варіантів це зробити. Якщо ви використовуєте Apache, зверніться до документації Apache, в іншому випадку — ви повинні встановити змінну оточення PHPRC:

Windows: Як перевірити, що PHP на сервері IIS має право запису до тимчасової директорії?

  1. Це можна зробити в Провідникові, перейшовши у "Властивості" тимчасової директорії (%TEMP%). Шлях до тимчасової директорії можна дізнатися під час налаштування або через функцію phpinfo().

  2. Для IIS, перевірити, чи користувач IIS_User має дозвіл MODIFY.

Чи можна використовувати Apache Content Negotiation (опцію MultiViews) разом з PHP?

Якщо посилатись на файли PHP разом з розширенням, то все працює справно. Цей пункт ЧАПу призначений тільки для випадку, коли посилання на файли PHP не містять розширення, та ви хочете використовувати Content Negotiation для вибору файлів PHP з URL без розширень. В цьому випадку, замініть рядок AddType application/x-httpd-php .php на такий:

AddHandler php5-script php
AddType text/html php
Це рішення не працює для Apache 1, оскільки модуль PHP не ловить php-script.

Чи можна зробити обмеження з боку PHP, щоб обробляти тільки запити від методів GET та POST?

Ні, навпаки - можна обробляти запити, що відправляються будь-яким методом, наприклад, CONNECT. Правильну відповідь статуса можна відправляти через функцію header(). Якщо ж вам потрібно, щоб оброблялись тільки методи GET та POST, цього можна добитись завдяки наступній конфігурації Apache:

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

add a note

User Contributed Notes 5 notes

up
19
per dot fikse at ipj dot no
19 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
8
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
9
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
5
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
4
joerg at fenin dot de
17 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