Tôi đang sử dụng dotenv cho PHP để quản lý các thiết lập môi trường (không lavarel nhưng tôi gắn thẻ nó vì lavarel cũng sử dụng dotenv)dotenv đòi hỏi tập tin .env về sản xuất
tôi đã loại trừ các .env từ cơ sở mã và tôi đã thêm .env.example cho tất cả các cộng tác viên khác
trên trang github của dotenv:
phpdotenv được thực hiện cho môi trường phát triển, và nói chung không nên được sử dụng trong sản xuất. Trong quá trình sản xuất, các biến môi trường thực tế nên được đặt để không có phí tải tệp .env trên mỗi yêu cầu. Điều này có thể đạt được thông qua một quá trình triển khai tự động với các công cụ như Vagrant, chef, hoặc Puppet, hoặc có thể được thiết lập thủ công với các máy chủ đám mây như Pagodabox và Heroku.
Điều mà tôi không hiểu là tôi có được ngoại lệ sau đây:
PHP Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Dotenv: Environment file .env not found or not readable.
Điều này mâu thuẫn với những gì tài liệu nói "các biến môi trường thực tế nên được thiết lập để không có trên không tải tệp .env trên mỗi yêu cầu. "
Vì vậy, câu hỏi đặt ra là nếu có lý do nào khiến dotenv ném ngoại lệ đó và/hoặc tôi có thiếu gì đó không? Trước hết hành vi này là khác nhau so với các thư viện dotenv khác (ruby)
tôi có thể dễ dàng làm việc xung quanh này, giải pháp không tốt bụng:
if(getenv('APPLICATION_ENV') !== 'production') { /* or staging */
$dotenv = new Dotenv\Dotenv(__DIR__);
$dotenv->load();
}
giải pháp Nicest theo ý kiến của tôi, nhưng tôi nghĩ dotenv nên xử lý này.
$dotenv = new Dotenv\Dotenv(__DIR__);
//Check if file exists the same way as dotenv does it
//See classes DotEnv\DotEnv and DotEnv\Loader
//$filePath = $dotenv->getFilePath(__DIR__);
//This method is protected so extract code from method (see below)
$filePath = rtrim(__DIR__, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR . '.env';
//both calls are cached so (almost) no performance loss
if(is_file($filePath) && is_readable($filePath)) {
$dotenv->load();
}
Aaah Tôi có thể sử dụng '$ dotenv-> required()' nó hoạt động theo bất kỳ cách nào tốt đẹp. 'Getenv ('APP_ENV'); 'tôi đoán là an toàn hơn? Tôi nghĩ rằng tôi đi cho các filecheck đó sẽ là tốt cho dự án hiện tại. Cảm ơn! –
@SanderVisser ý của bạn là gì khi nói rằng 'getenv ('APP_ENV')' an toàn hơn? – Alik
Nó ngăn tải tệp .env trên môi trường sản xuất ngay cả khi nó ở đó. –