Chỉnh sửa: theo như tôi có thể nói, câu hỏi của tôi là do lỗi trong PHP. Tôi đã sao chép câu hỏi này vào trình theo dõi lỗi PHP tại đây: https://bugs.php.net/bug.php?id=74143 và có kế hoạch thử và triển khai bản sửa lỗi.Làm cách nào để sử dụng putenv() để cập nhật biến môi trường hiện tại?
Hàm putenv đặt giá trị của biến môi trường. Theo hướng dẫn, putenv trả về sự thật về thành công, sai về thất bại.
Tuy nhiên, tôi thấy rằng hàm putenv đôi khi trả về true mà không cập nhật biến môi trường cho phiên hiện tại.
Để tạo lại vấn đề này, hãy đặt biến môi trường trong máy chủ web bằng cách sử dụng PHP FPM, bằng cách sử dụng chỉ thị fastcgi_param. Điều này cực kỳ hữu ích, vì nó cho phép thiết lập các biến môi trường trong sự cô lập với các máy chủ khác trên cùng một máy chủ.
Ví dụ nginx.conf:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_param TESTVAR_ENV old-value;
include fastcgi_params;
}
Ví dụ test.php:
var_dump(getenv("TESTVAR_ENV"));
var_dump(putenv("TESTVAR_ENV=new-value"));
var_dump(getenv("TESTVAR_ENV"));
Sản lượng test.php:
string(12) "old-value"
bool(true)
string(12) "old-value"
Như bạn có thể thấy:
- giá trị hiện tại được đọc bởi getenv thành công,
- hàm putenv trả về true, cho biết thành công,
- giá trị mới không thực sự được đặt, điều này vô cùng khó hiểu.
Tôi có hiểu lầm về mục đích của hàm putenv không? Có một số tài liệu bị thiếu trên trang hướng dẫn cài đặt không? Làm thế nào để sử dụng putenv() để cập nhật biến môi trường hiện tại?
Tôi đã không nhìn thấy hành vi này bản thân mình. Trước tiên bạn đã thử xóa giá trị cũ chưa? 'putenv (" TESTVAR_ENV ")' nên xóa giá trị, hoặc có thể thử sử dụng '$ _SERVER' thay thế? – miken32
Trên thực tế, chỉ cần thử nghiệm này với Nginx và PHP-FPM, thay vì CLI và tôi nhìn thấy điều tương tự. – miken32
Bạn có nghĩ đây là lỗi với PHP hay PHP-FPM không? – Greg