That’s a good question. You might ask this when you are implementing a new project and trying to figure out where to store your secret configuration values.
Before getting into the difference, let’s state the similarities:
- Both allow storage of environment specific configuration values and secrets from outside of your codebase.
- Both allow retrieval of environment specific configuration values and secrets from outside your codebase.
- Both files use a key value pair type format.
- Both allow comments within the files.
So what about the differences?
- The names are different .ini vs .env
- The method of storing the data is different.
- The method of retrieving the data is different.
- The syntax is different.
That probably doesn’t answer your question though. You likely aren’t interested as much in what the differences are as you are in why you would use one over the other.
Why use .env instead of .ini or .ini instead of .env?
This is likely what you are wanting to know, why would you use one over the other. So let’s list some pro’s and cons of each format to help make the decision.
.env Pros
- language-agnostic
- allows referencing other .env values as variables
- libraries like
phpdotenv
provide robust functionality
Let’s expand a little on the language-agnostic pro above.
First Scenario. You are coming to PHP from another environment, like Ruby, you are probably wondering where to put your secrets and configuration values for your code. A .env
file just makes sense, these are supported in Ruby so there must be a way to add them in PHP. Voila! There is a package that supports .env
files that you can easily include in your PHP code and you don’t have to think anymore about it. It probably doesn’t even occur to you to use the build in .ini
support.
Second Scenario. You are using both server side JS, like Node, and PHP. You want to share configuration values between the two systems. Both support .env
files allowing you to easily share your secrets between both languages.
.ini Pros
- built-in PHP Support
- allows grouping of values via sections
- supports typed values via
INI_SCANNER_TYPED
- allows interpolating other config values and environment variables
.env Cons
- requires third party library and composer to work
- features provided change based on library used for loading
- *some libraries load configuration secrets into globally accessible variables like
$_SERVER
or$_ENV
which will could expose your secrets to code you don’t intend to
.ini Cons
- requires familiarity with PHP
Which one should I use?
I’m going to give you the answer you don’t want to hear. That’s up to you. It really depends on the needs of your environment and your program.
As far as my personal preferences go. I don’t like including unnecessary dependencies in my codebase. Therefore, if I’m using PHP to develop my app, and I have no need to share my config secrets with other languages, then I would use an .ini
file and the built in support for those that PHP provides.