2010-01-05 28 views
12

Chỉ cần đặt trong bối cảnh để làm rõ câu hỏi chính:Làm thế nào để sử dụng getenv() trong php và setenv trong một .htaccess với một biên soạn php-cgi trên một máy chủ chia sẻ

Trên máy tính phát triển của tôi, PHP5.3.1 là được cài đặt trên Apache như một mô-đun, tôi sử dụng phát triển SetEnv APPLICATION_ENVIRONMENT trong tệp .htaccess gốc của ứng dụng của tôi. Sau đó, bạn có thể dễ dàng truy xuất từ ​​bất kỳ tập lệnh php nào bằng getenv ('APPLICATION_ENVIRONMENT').

Trên máy chủ sản xuất, trên máy chủ chia sẻ (dreamhost), tôi đã tự biên dịch php5.3.1 vì nó không được hỗ trợ trực tiếp. Mọi thứ hoạt động tốt ngoại trừ getenv ('APPLICATION_ENVIRONMENT') trả về false.

Trong .htaccess gốc sharedhost cho tên miền của tôi, tôi sử dụng tập tin .htaccess này

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 nằm trong/cgi-bin và hoạt động rất tốt. Tất nhiên trong thư mục gốc ứng dụng của tôi của tôi có khác Xác định .htaccess:

SetEnv APPLICATION_ENVIRONMENT production 

Nhưng khi sử dụng getenv ('APPLICATION_ENVIRONMENT') nó trả về false, bất kỳ ý tưởng làm thế nào để giải quyết này?

+0

Chỉ cần đoán: Có thể máy chủ của bạn không cho phép chỉ thị này bị ghi đè trong tệp .htaccess? –

Trả lời

11

Ok cuối cùng tôi đã nhận được nó. Trên dreamhost, có thể sử dụng fastcgi và do đó khai báo các biến môi trường với nó. Nó chỉ bao gồm thêm tập lệnh đơn giản này

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

Đó là nơi PHP5.3.1 đã biên dịch của tôi được đặt. chmod 744 trên tập tin đó được gọi là dispatch.fcgi mà sẽ được cho phép nhiều bộ nhớ hơn bởi cơ quan giám sát của dreamhost.

Sau đó tôi thêm vào tên miền của tôi của .htaccess như sau:

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

bây giờ trong thư mục gốc của ứng dụng Tôi có một .htaccess với:

SetEnv APPLICATION_ENVIRONMENT staging 

Trong một kịch bản php là là retrievable qua getenv ('REDIRECT_APPLICATION_ENVIRONMENT');

+0

oh cảm ơn bạn !!! Tôi đã mất tóc cố gắng thiết lập một biến môi trường trong .htaccess. Cuối cùng tôi đã có thể làm điều đó bằng cách thay đổi PHP từ việc chạy như một ứng dụng CGI sang FastCGI. –

+5

Tại sao bạn sử dụng getenv ('REDIRECT_APPLICATION_ENVIRONMENT') thay vì getenv ('APPLICATION_ENVIRONMENT')? –

+0

Đối với điều này để làm việc cho tôi, tôi đã phải rời khỏi phần "REDIRECT_" được thêm vào trước của biến môi trường. –

9

Đối với các chỉ thị SetEnv để làm việc, dịch vụ lưu trữ của bạn phải có module mod_env kích hoạt ...

Nhưng, ngay cả khi nó được kích hoạt, có thể bạn không cần phải xin phép sử dụng SetEnv.

Chỉ cần chắc chắn vấn đề không nằm trong mã của bạn, bạn có thể muốn kiểm tra kết quả của phpinfo(): ở cuối trang, sẽ có phần chứa các biến môi trường như được thấy từ PHP - nếu bạn là không có trong đó, nó không phải là một dấu hiệu tốt cho bạn ...

+0

Bạn đúng, tôi không tìm thấy bất kỳ điều gì dưới biến PHP dưới máy chủ sản xuất và tôi làm trên máy phát triển của mình. Tôi đang liên hệ với bộ phận hỗ trợ của họ cho việc này và sẽ cố gắng cung cấp câu trả lời giải pháp. –

+0

@Steven: Chúc may mắn ^^ –

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