mac brew 批量安装多版本PHP+扩展

#!/bin/bash

brew tap shivammathur/php
brew tap shivammathur/extensions

PHP_VERSIONS=("7.0" "7.1" "7.2" "7.3" "7.4" "8.0" "8.1" "8.2" "8.3" "8.4" "8.5")
EXTENSIONS=("igbinary" "zstd" "redis" "swoole" "mongodb" "intl" "xlswriter" "amqp" "msgpack")

install_php_if_missing() {
    local ver="$1"
    local formula="php@$ver"

    if ! brew list --versions "$formula" >/dev/null 2>&1; then
        echo "✘ PHP $ver 未安装,开始安装..."
        brew install "$formula"
    else
        echo "✔ PHP $ver 已安装"
    fi
}

fix_fpm_listen_port() {
    local ver="$1"
    local ver_no_dot="${ver//./}"   # 删除小数点,如 8.3 → 83
    local port="90$ver_no_dot"

    local conf1="/usr/local/etc/php/$ver/php-fpm.d/www.conf"
    local conf2="/opt/homebrew/etc/php/$ver/php-fpm.d/www.conf"

    local CONF_FILE=""

    if [ -f "$conf1" ]; then
        CONF_FILE="$conf1"
    elif [ -f "$conf2" ]; then
        CONF_FILE="$conf2"
    else
        echo "❌ 未找到 PHP $ver 的 FPM 配置文件"
        return
    fi

    echo "→ 修改 FPM 监听端口: $CONF_FILE"
    echo "  listen = 0.0.0.0:$port"

    # 替换监听端口
    sed -i "" "s|listen = .*|listen = 0.0.0.0:$port|g" "$CONF_FILE"
    sed -i "" "s|memory_limit = .*|memory_limit = 2G|g" "$CONF_FILE"
    sed -i "" "s|;date.timezone = .*|date.timezone = PRC|g" "$CONF_FILE"
}


for ver in "${PHP_VERSIONS[@]}"; do
    formula="php@$ver"

    # 1) 自动安装 PHP
    install_php_if_missing "$ver"

    # 2) 检查 PHP bin 路径
    BIN="/usr/local/opt/$formula/bin/php"
    if [ ! -f "$BIN" ]; then
        BIN="/opt/homebrew/opt/$formula/bin/php"
    fi
    if [ ! -f "$BIN" ]; then
        echo "❌ 找不到 php@$ver 的 bin,跳过..."
        continue
    fi

    echo "使用 PHP 可执行文件: $BIN"

    # 3) 自动安装扩展
    for ext in "${EXTENSIONS[@]}"; do
        if [ -f "/usr/local/etc/${formula}/conf.d/ext-${ext}.ini" ]; then
            rm "/usr/local/etc/${formula}/conf.d/ext-${ext}.ini"
        fi
        echo "- 检查扩展: $ext"
        if "$BIN" -m | grep -qi "$ext"; then
            echo "  ✔ $ext 已安装"
        else
            echo "  ✘ 未安装 $ext → 尝试安装..."
            # 先检查 brew 是否已安装该扩展
            if brew list "shivammathur/extensions/$ext@$ver" >/dev/null 2>&1; then
                echo "  ❌ brew 未找到 $ext@$ver"
            else
                brew install "shivammathur/extensions/$ext@$ver"
           fi
        fi
    done

    # 4) 自动替换 php-fpm 监听端口
    fix_fpm_listen_port "$ver"

    echo "=============================="

done

echo "=============================="
echo "全部 PHP 版本检查与配置完成"
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

原来还有这个啊:brew tap shivammathur/extensions, 以前只知道这个:brew tap shivammathur/php 学到了 :+1:

2天前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!