How To Set Environment Variables For PHP In Apache?

Published September 16, 2024

Problem: Setting PHP Environment Variables in Apache

Setting environment variables for PHP in Apache can be difficult. These variables help configure PHP applications and control how they work, but setting them correctly in Apache is not always easy.

Solution: Using SetEnv Directive in Apache Virtual Host Configuration

Configuring Environment Variables in Apache

Apache offers the SetEnv directive to set environment variables for PHP applications. This directive lets you define custom variables in your Apache configuration files. The basic syntax is: SetEnv VARIABLE_NAME value. You can use this directive to set environment variables needed by your PHP application.

Tip: Securing Sensitive Data

Always use environment variables for sensitive information like database credentials or API keys. This practice keeps your sensitive data out of your source code, improving security.

Setting Up Domain-Specific Environment Variables

Apache uses VirtualHost blocks to manage configurations for different domains. These blocks let you set up specific settings for each website on your server. To configure different environment variables for each domain, add the SetEnv directives within the appropriate VirtualHost block.

Here's an example of setting up environment variables for two domains in your Apache configuration:

<VirtualHost *:80>
    ServerName example1.com
    DocumentRoot /var/www/example1
    SetEnv DB_HOST localhost
    SetEnv DB_NAME example1_db
</VirtualHost>

<VirtualHost *:80>
    ServerName example2.com
    DocumentRoot /var/www/example2
    SetEnv DB_HOST 192.168.1.100
    SetEnv DB_NAME example2_db
</VirtualHost>

This configuration sets different DB_HOST and DB_NAME variables for example1.com and example2.com. Your PHP application can access these variables using the getenv() function.

Example: Accessing Environment Variables in PHP

<?php
$dbHost = getenv('DB_HOST');
$dbName = getenv('DB_NAME');

$db = new PDO("mysql:host=$dbHost;dbname=$dbName", $username, $password);
?>

Step-by-Step Guide to Implementing Environment Variables

Locating and Editing Apache Configuration Files

To set up environment variables in Apache, you need to find and edit the configuration file. On most Linux systems, Apache's main configuration file is at /etc/apache2/apache2.conf or /etc/httpd/httpd.conf. It's often better to use separate configuration files for each virtual host.

These files are usually in /etc/apache2/sites-available/ or /etc/httpd/conf.d/. Look for files named after your domain or with a .conf extension.

To edit these files safely:

  1. Make a backup of the original file:

    sudo cp /etc/apache2/sites-available/your-site.conf /etc/apache2/sites-available/your-site.conf.bak
  2. Open the file with a text editor using sudo:

    sudo nano /etc/apache2/sites-available/your-site.conf

Tip: Check File Permissions

Before editing Apache configuration files, check their permissions to make sure you have the necessary access rights. Use the following command:

ls -l /etc/apache2/sites-available/your-site.conf

If you don't have the required permissions, you may need to change them using the chmod command.

Adding Environment Variables to VirtualHost Blocks

To add environment variables, use the SetEnv directive within the VirtualHost block for your domain. Here's the basic syntax:

<VirtualHost *:80>
    ServerName yourdomain.com
    DocumentRoot /var/www/yourdomain
    SetEnv VARIABLE_NAME value
</VirtualHost>

Here are some examples of common environment variable setups:

  1. Database connection details:

    SetEnv DB_HOST localhost
    SetEnv DB_NAME myapp_database
    SetEnv DB_USER myapp_user
    SetEnv DB_PASS myapp_password
  2. Application mode:

    SetEnv APP_ENV production
  3. API keys:

    SetEnv API_KEY your_api_key_here
  4. Custom application settings:

    SetEnv CACHE_TIMEOUT 3600
    SetEnv DEBUG_MODE false

Add these SetEnv directives within the right VirtualHost block for each domain. This way, you can have different environment variables for different domains on the same server.

Verifying and Testing the Environment Variable Configuration

Restarting Apache to Apply Changes

After setting up environment variables in your Apache configuration, restart the Apache service for the changes to take effect. Use these commands to restart Apache:

For Ubuntu/Debian systems:

sudo systemctl restart apache2

For CentOS/RHEL systems:

sudo systemctl restart httpd

Before restarting, check for configuration errors:

sudo apache2ctl configtest

If this command returns "Syntax OK", your configuration is correct and you can restart.

Tip: Graceful Restart

To minimize downtime during the restart process, you can use a graceful restart command:

For Ubuntu/Debian:

sudo systemctl reload apache2

For CentOS/RHEL:

sudo systemctl reload httpd

This allows Apache to finish processing current requests before restarting, reducing the impact on active users.

Confirming Environment Variables in PHP

To verify that your environment variables are set correctly, use PHP functions to check their values:

  1. Create a PHP file (e.g., env_test.php) in your web root directory with this content:
<?php
phpinfo();
?>
  1. Access this file through your web browser. Look for the "Environment" section in the output. Your custom variables should be listed there.

  2. For a specific check, use the getenv() function in a PHP script:

<?php
echo "DB_HOST: " . getenv('DB_HOST') . "
"; echo "DB_NAME: " . getenv('DB_NAME') . "
"; ?>

If you have issues:

  1. Check Apache error logs (/var/log/apache2/error.log or /var/log/httpd/error_log) for any errors.

  2. Make sure the SetEnv directives are in the correct VirtualHost block.

  3. Verify that mod_env is enabled in Apache:

    apache2ctl -M | grep env

    If it's not listed, enable it with:

    sudo a2enmod env
  4. If using PHP-FPM, you might need to pass environment variables differently. Consider using SetEnvIf instead of SetEnv.

By following these steps, you can set up, verify, and troubleshoot environment variables for your PHP applications in Apache.