#!/bin/bash set -e PHP_BIN_DIR="/usr/local/bin" PHP_BINARY="$PHP_BIN_DIR/php.bin" PHP_LAUNCHER="$PHP_BIN_DIR/php" PHP_INI_DIR="/usr/local/etc/php" PHP_INI_PATH="$PHP_INI_DIR/php.ini" COMPOSER_PATH="$PHP_BIN_DIR/composer" # 检查文件是否存在并提示覆盖 check_and_prompt() { local file_path=$1 local file_name=$2 if [ -e "$file_path" ] || [ -L "$file_path" ]; then read -r -p "$file_name 已存在。是否覆盖?(y/n): " choice if [ "$choice" != "y" ] && [ "$choice" != "Y" ]; then echo "跳过 $file_name 安装。" return 1 fi fi return 0 } # 检查系统架构 ARCH=$(uname -m) OS=$(uname -s) case "$ARCH" in x86_64) ARCH_SUFFIX="x86_64" ;; aarch64) ARCH_SUFFIX="aarch64" ;; arm64) ARCH_SUFFIX="aarch64" ;; *) echo "不支持的架构: $ARCH" exit 1 ;; esac case "$OS" in Linux) OS_SUFFIX="linux" ;; Darwin) OS_SUFFIX="mac" ;; *) echo "不支持的操作系统: $OS" exit 1 ;; esac # 新机可能没有 /usr/local/bin,安装前必须先创建。 # 如果该路径被其他文件占用,立即停止,避免 mv 把 PHP 误改名为 bin。 if [ -e "$PHP_BIN_DIR" ] && [ ! -d "$PHP_BIN_DIR" ]; then echo "安装失败: $PHP_BIN_DIR 已存在但不是目录。" >&2 exit 1 fi sudo mkdir -p "$PHP_BIN_DIR" "$PHP_INI_DIR" TEMP_DIR=$(mktemp -d) trap 'rm -rf "$TEMP_DIR"' EXIT # 选择PHP版本 echo "请输入要安装的PHP版本 (8.1-8.4):" read -r PHP_VERSION # 验证版本号 if [[ ! "$PHP_VERSION" =~ ^8\.[1-4]$ ]]; then echo "无效的PHP版本: $PHP_VERSION" exit 1 fi # 构造下载链接 PHP_FILENAME="php-$PHP_VERSION-$OS_SUFFIX-$ARCH_SUFFIX.tar.gz" PHP_URL="https://download.workerman.net/php/$PHP_FILENAME" PHP_ARCHIVE="$TEMP_DIR/$PHP_FILENAME" # 检查并提示覆盖PHP if check_and_prompt "$PHP_LAUNCHER" "PHP"; then # 下载并安装PHP curl -#fL "$PHP_URL" -o "$PHP_ARCHIVE" tar -xf "$PHP_ARCHIVE" -C "$TEMP_DIR" if [ ! -f "$TEMP_DIR/php" ]; then echo "安装失败: 压缩包中未找到 PHP 可执行文件。" >&2 exit 1 fi # 使用启动器显式加载 php.ini。下载的静态 PHP 默认不会读取 /usr/local/etc/php。 sudo install -m 755 "$TEMP_DIR/php" "$PHP_BINARY" cat > "$TEMP_DIR/php-launcher" < "$TEMP_DIR/php.ini" <<'EOL' openssl.cafile=/etc/ssl/certs/ca-certificates.crt opcache.enable=1 opcache.enable_cli=1 opcache.jit=tracing opcache.jit_buffer_size=32M apc.enable_cli=1 memory_limit=256M EOL sudo install -m 644 "$TEMP_DIR/php.ini" "$PHP_INI_PATH" # 检查并提示覆盖Composer if check_and_prompt "$COMPOSER_PATH" "Composer"; then # 下载并安装Composer echo "安装Composer..." curl -#fL https://download.workerman.net/php/composer.phar -o "$TEMP_DIR/composer.phar" sudo install -m 755 "$TEMP_DIR/composer.phar" "$COMPOSER_PATH" fi # 检查并下载 CA 证书 if [ ! -f "/etc/ssl/certs/ca-certificates.crt" ]; then echo "下载证书..." sudo mkdir -p /etc/ssl/certs curl -#fL https://download.workerman.net/php/ca-certificates.crt -o "$TEMP_DIR/ca-certificates.crt" sudo install -m 644 "$TEMP_DIR/ca-certificates.crt" /etc/ssl/certs/ca-certificates.crt echo "CA 证书已下载并保存到 /etc/ssl/certs/ca-certificates.crt" fi echo "安装完成。"