2011-12-18 21 views
8

Tương đương với setenv trong môi trường apache là gì? Với apache tôi có thể ví dụ thiết lập env "SOMEENV" và truy cập nó trong php thông qua $ _ENV ['SOMEENV'] - nhưng tôi không có ý tưởng làm thế nào để làm điều đó với nginx + php-fpm. Ban đầu tôi nghĩ rằng tôi chỉ cần đặt ENV [SOMENEV] = thử nghiệm trong cấu hình của nhóm php-fpm của tôi, nhưng var_dump ($ _ ENV) vẫn không trả về gì cả.

Bất kỳ gợi ý nào?

Trả lời

17

nginx không có cách nào ảnh hưởng đến môi trường của php, vì nó không nhúng trình thông dịch php vào quá trình của nó. Nó chuyển các tham số tới php thông qua các chỉ thị fastcgi_param. Bạn chỉ có thể thêm một trong những nơi bạn thiết lập các phần còn lại của params của bạn và truy cập nó qua $ _SERVER:

location ~ \.php$ { 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $request_filename; 
    fastcgi_param SOMEENV test; 
    fastcgi_pass php; 
} 
+1

Xin chào, cảm ơn bạn đã trả lời. Được rồi, cho phép tôi tiêm vào $ _SERVER ['SOMEENV'], nhưng làm cách nào tôi có thể cung cấp thứ gì đó cho $ _ENV ['SOMEENV']? – Josh

+1

$ _SERVER mảng mục được tạo ra bởi các máy chủ web nhưng $ _ENV biến được nhập khẩu từ môi trường theo đó PHP thông dịch viên đang chạy và nhiều được cung cấp bởi vỏ theo đó PHP đang chạy. Trong trường hợp của Apache, trình thông dịch php được nhúng vào tiến trình Apache nhưng đây không phải là trường hợp với Nginx. IOW, Có thể đặt các biến $ _ENV với Nginx và $ _SERVER là tốt như nó được. – Dayo

+0

Không có chỉ thị 'env' trong NGINX? – CMCDragonkai

6

Hãy nhận biết rằng sự sẵn có của $_ENV biến phụ thuộc vào các thiết lập của variables_order trong php.ini được sử dụng bởi PHP- fpm. Mặc định là EGPCS, trong đó E là môi trường, tuy nhiên trên Ubuntu 12.04 tôi thấy nó là GPCS. Các php.ini riêng của mình mang một cảnh báo về $_ENV:

; This directive determines which super global arrays are registered when PHP 
; starts up. G,P,C,E & S are abbreviations for the following respective super 
; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty 
; paid for the registration of these arrays and because ENV is not as commonly 
; used as the others, ENV is not recommended on productions servers. 

Nó khuyến cáo sử dụng getenv() mà phải lúc nào cũng có sẵn. Tôi thấy rằng các biến tôi đặt trong nhóm FPM có thể được truy xuất theo cách này.

+1

Bạn có thể truy cập các biến được khai báo thành tệp php-fpm conf vì getenv() tìm kiếm cả $ _ENV và $ _SERVER như đã nói ở đây: http://stackoverflow.com/questions/3780866/why-is-my-env-empty – LeandroCR

+0

getenv() không hoạt động theo cùng một cách – deFreitas

0

Tôi đặt tất cả env [...] = biến trong php-fpm.d/www.conf Sau khi thử một ngày cuối tuần, tôi thấy cách duy nhất truy cập các biến này là sử dụng $ _SERVER và $ _ENV không thể truy cập các biến này. Có ai có thể đưa ra ý tưởng không?

Các vấn đề liên quan