When you need to add PostgreSQL support to an existing Homebrew PHP installation, the standard --with-pgsql
flag only works during initial installation. Here's how to solve this without disrupting your current setup:
# First check your current PHP version
php -v
# Example output: PHP 8.2.12 (cli)
1. Install PostgreSQL client libraries:
brew install postgresql libpq
2. Locate your PHP extension directory:
php -i | grep extension_dir
# Typical output: extension_dir => /usr/local/lib/php/pecl/20220829
3. Install the pgsql extension:
pecl install pgsql
# When prompted for libpq path, use:
# /usr/local/opt/libpq
Add these lines to your php.ini:
extension=pgsql.so
extension=pdo_pgsql.so
pdo_pgsql.default_driver=postgresql
Important: Verify the exact path to your php.ini:
php --ini
# Example: Loaded Configuration File: /usr/local/etc/php/8.2/php.ini
Create a test script:
<?php
phpinfo(INFO_MODULES);
?>
Look for PostgreSQL and PDO_PGSQL sections in the output. Then try a connection test:
$db = new PDO('pgsql:host=localhost;dbname=test', 'user', 'password');
$stmt = $db->query('SELECT version()');
print_r($stmt->fetchAll());
If you get "extension not found" errors:
# Find where Homebrew installed PHP extensions
brew --prefix php
# Symlink the extensions if needed
ln -s /usr/local/opt/php/lib/php/extensions/ /path/to/your/extension_dir
Troubleshooting libpq path issues:
export PATH="/usr/local/opt/libpq/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/libpq/lib"
export CPPFLAGS="-I/usr/local/opt/libpq/include"
If extension installation fails, you can reinstall PHP with PostgreSQL support while preserving configs:
brew reinstall php --with-postgresql --with-pdo-pgsql
# Your existing php.ini and XDebug settings will remain intact
When you install PHP via Homebrew with PostgreSQL support initially, you'd use:
brew install php@8.1 --with-pgsql
But what if PHP is already installed without PostgreSQL support? Reinstalling might seem like the only option, but there's a better way.
First, verify if PostgreSQL support is already available:
php -m | grep pgsql
If no output appears, you'll need to add the extension.
Homebrew makes this relatively straightforward:
brew install php@8.1-pgsql
Replace 8.1 with your PHP version. This installs the PostgreSQL extension separately.
After installation, you need to enable the extension. Locate your php.ini file:
php --ini | grep Loaded
Then add this line to your php.ini:
extension=pgsql.so
Create a simple test script:
<?php
phpinfo();
?>
Search for 'pgsql' in the output to confirm the extension is loaded.
Here's a basic connection example:
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres password=secret");
if (!$conn) {
echo "Connection failed.\n";
exit;
}
echo "Connected successfully!";
pg_close($conn);
?>
If you encounter problems:
- Verify PostgreSQL is running:
brew services list
- Check the extension path in php.ini is correct
- Ensure the PostgreSQL client libraries are installed
For more flexibility, consider using PDO:
<?php
try {
$pdo = new PDO('pgsql:host=localhost;dbname=test', 'postgres', 'secret');
foreach ($pdo->query('SELECT version()') as $row) {
print_r($row);
}
} catch (PDOException $e) {
echo "Error: " . $e->getMessage();
}
?>
Remember that when you update PHP via Homebrew, you might need to reinstall the PostgreSQL extension. Keep an eye on the output during updates for any warnings about missing extensions.