Как использовать getenv () в php и SetEnv в .htaccess с скомпилированным php-cgi на общем хосте - PullRequest
15 голосов
/ 05 января 2010

Просто в контексте, чтобы уточнить основной вопрос:

На моей машине разработки PHP5.3.1 установлен на Apache как модуль, я использую SetEnv APPLICATION_ENVIRONMENT в своем корневом файле .htaccess моего приложения. Затем его легко получить из любого php-скрипта с помощью getenv ('APPLICATION_ENVIRONMENT').

На производственном сервере, на sharedhost (dreamhost), я скомпилировал себя php5.3.1, так как он не был напрямую поддержан. Все работает нормально, за исключением того, что getenv ('APPLICATION_ENVIRONMENT') возвращает false.

В корне общего хоста .htaccess для моего домена я использую этот файл .htaccess

Options +ExecCGI
AddHandler php-cgi .php
Action php-cgi /cgi-bin/php.cgi

<FilesMatch "^php5?\.(ini|cgi)$">
    Order Deny,Allow
    Deny from All
    Allow from env=REDIRECT_STATUS
</FilesMatch>

Options -indexes

php5.cgi находится в / cgi-bin и работает очень хорошо. Конечно, в корневой папке моего приложения у меня есть другой .htaccess, определяющий:

SetEnv APPLICATION_ENVIRONMENT production

Но при использовании getenv ('APPLICATION_ENVIRONMENT') он возвращает false, есть идеи, как это решить?

Ответы [ 3 ]

14 голосов
/ 06 января 2010

Хорошо, я наконец понял. На dreamhost можно использовать fastcgi и поэтому объявлять переменные окружения вместе с ним. Он состоит из простого добавления этого простого скрипта

#!/bin/sh
export PHP_FCGI_CHILDREN=2
exec /home/USERNAME/YOURDOMAIN/cgi-bin/php.cgi

Именно там был мой скомпилированный PHP5.3.1. chmod 744 в этом файле с именем dispatch.fcgi, которому сторожевой пёс сновидения предоставит больше памяти.

После этого я добавил в свой домен .htaccess следующее:

Options +ExecCGI
AddHandler fastcgi-script fcg fcgi fpl
AddHandler php5-fastcgi .php
Action php5-fastcgi /dispatch.fcgi

теперь в корне приложения у меня есть другой .htaccess с:

SetEnv APPLICATION_ENVIRONMENT staging

В php-скрипте его можно получить через getenv ('REDIRECT_APPLICATION_ENVIRONMENT');

10 голосов
/ 05 января 2010

Для работы директивы SetEnv ваша служба хостинга должна иметь активированный модуль mod_env ...

Но, даже если он активирован, возможно, вам не нужно разрешение на использование SetEnv.

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

0 голосов
/ 30 мая 2019

Чтобы $ _ENV работал, мне пришлось перенастроить variables_order = "GPCSE" в php.ini. По умолчанию он не включает E для $ _ENV, изначально он был variables_order = "GPCS"

Эта директива определяет, какие суперглобальные массивы регистрируются при запуске PHP. G, P, C, E & S являются сокращениями для следующих соответствующих супер глобальные: GET, POST, COOKIE, ENV и SERVER. Есть штраф за производительность заплатил за регистрацию этих массивов и потому что ENV не так часто ENV не рекомендуется использовать на производственных серверах. Вы вы можете получить доступ к переменным окружения через getenv (), если вы надо.

Значение по умолчанию: "EGPCS"

Стоимость разработки: "GPCS"

Производственная стоимость: «GPCS»;

http://php.net/variables-order

...