php

Maxim Dounin mdounin на mdounin.ru
Сб Ноя 12 03:20:30 UTC 2011


Hello!

On Fri, Nov 11, 2011 at 04:48:36PM -0500, locojohn wrote:

> Уважаемый Игорь,
> 
> Я устанавливаю переменную FastCGI
> окружения PHP_VALUE в значение
> "include_path=$document_root" в server {} блоке, чтобы
> PHP-FPM backend находил нужные файлы в include_path
> равном $document_root:
> 
>        server {
>                 listen 80;
>                 server_name test.com;
> 
>                 root /opt/www/test.com;
> 
>                 fastcgi_read_timeout 1800;
>                 fastcgi_send_timeout 1800;
>                 fastcgi_param PHP_VALUE "include_path=$document_root";
> 
> 
>                 ...
> 
> 
>                 location ~ ^(?<SCRIPT_FILENAME>.+\.php)$ {
>                   include fastcgi_php.conf;
>                   fastcgi_param SCRIPT_URL $SCRIPT_FILENAME;
>                   fastcgi_param SCRIPT_URI
> $scheme://$http_host$SCRIPT_FILENAME;
>                   fastcgi_pass phpfarm;

http://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html#fastcgi_param

Директивы наследуются с предыдущего уровня при условии, что на 
данном уровне не описаны свои директивы fastcgi_param.

[...]

> Однако, наблюдается очень странная
> ситуация.  При refreshe страницы с php
> скриптом, я распечатываю значение
> "include_path", и на каждый третий раз он
> выдаёт системное значение eg: ".:/usr/share/php",
> как будто PHP_VALUE "include_path=$document_root" не
> передаётся в php-fpm окружение.  В
> остальные же разы печатается
> правильное значение, т.е.: "/opt/www/test.com".  
> 
> Чтобы это могло значить?  Если же я
> ставлю fastcgi_param PHP_VALUE в вышеуказанные
> location {} блоки, то значение include_path всегда
> правильное, то есть равное $document_root, что
> я передаю через fastcgi_param.  Я пробовал
> указывать вместо $document_root путь
> "/opt/www/test.com" напрямую без переменной, но
> это не изменило ситуации.  Каждый
> третий раз при рефреше одной и той же
> страницы печатается неправильное
> значение include_path.
> 
> Получается, что ваше решение не
> работает полностью.
> 
> Есть ли у вас какие-нибудь догадки по
> поводу решения данной проблемы?

Все fastcgi_param нужно определять полностью на одном уровне.  
Если годятся "стандартные" - их можно определить хоть на уровне 
http, а дальше наследовать (как было в примере конфигурации, 
приведённым Игорем).

Если под данный location нужны свои специальные fastcgi_param - 
нужно их все определить в данном location'е.  Или переосмыслить 
конфигурацию и сделать так, чтобы годились стандартные, в 
большинстве случаев это делается легко и непринуждённо.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru