如何从PHP配置子脚本返回start.sh主菜单且不重启主脚本?
解决方案
我会分两部分解决你的问题:让子菜单执行完自动返回主菜单,以及将配置参数持久化到全局可读取的文件中。
1. 让主菜单循环显示,无需重启脚本
原来的start.sh执行完菜单选项后就直接退出了,我们可以把菜单逻辑放到一个while true循环里,这样每次执行完子菜单操作后,会回到循环开头重新显示主菜单。
修改后的start.sh代码:
#!/bin/bash # 加载全局配置文件(如果存在) CONFIG_FILE="/etc/php_custom_config.conf" [ -f "$CONFIG_FILE" ] && source "$CONFIG_FILE" # 确保dialog已安装 apt-get -qq install dialog >/dev/null 2>&1 # 主菜单循环 while true; do HEIGHT=30 WIDTH=60 CHOICE_HEIGHT=14 BACKTITLE="Server Management Menu" TITLE="Main Menu" MENU="Choose one of the following options:" OPTIONS=(1 "Make 1" 2 "PHP 7.x Configuration" 3 "Make 3" 4 "Exit") # 新增退出选项 CHOICE=$(dialog --clear \ --nocancel \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --menu "$MENU" \ $HEIGHT $WIDTH $CHOICE_HEIGHT \ "${OPTIONS[@]}" \ 2>&1 >/dev/tty) clear case $CHOICE in 1) # Make 1 echo "Executing Make 1..." # 这里替换为你的Make1实际逻辑 sleep 2 # 示例延迟,可删除 ;; 2) # PHP 7.x配置 # 加载子脚本并调用配置函数 source "${SCRIPT_PATH}/menu_php_7_x.sh" php_7_x_config ;; 3) # Make 3 echo "Executing Make 3..." # 这里替换为你的Make3实际逻辑 sleep 2 # 示例延迟,可删除 ;; 4) # 退出脚本 echo "Exiting..." exit 0 ;; esac done
2. 持久化配置参数到全局文件
我们创建一个全局配置文件(比如/etc/php_custom_config.conf),每次修改PHP参数时,不仅更新php.ini,还把参数写入这个文件,这样所有需要读取的脚本只要source这个文件就能获取最新值。
修改后的menu_php_7_x.sh代码:
#!/bin/bash # 定义全局配置文件路径 CONFIG_FILE="/etc/php_custom_config.conf" # 确保配置文件存在 touch "$CONFIG_FILE" # 自动获取当前PHP的配置文件路径(适配大部分PHP7.x版本) PHP_INI_PATH=$(php -i | grep "Loaded Configuration File" | awk '{print $NF}') php_7_x_config() { while true; do HEIGHT=30 WIDTH=60 CHOICE_HEIGHT=6 BACKTITLE="PHP Configuration" TITLE="PHP.ini Settings Menu" MENU="Choose one of the following options:" OPTIONS=(1 "Change post_max_size" 2 "Change upload_max_filesize" 3 "Change memory_limit" 4 "Back to Main Menu") CHOICE=$(dialog --clear \ --nocancel \ --backtitle "$BACKTITLE" \ --title "$TITLE" \ --menu "$MENU" \ $HEIGHT $WIDTH $CHOICE_HEIGHT \ "${OPTIONS[@]}" \ 2>&1 >/dev/tty) clear case $CHOICE in 1) # 获取当前值作为输入框默认值 current_val=$(grep -E '^post_max_size' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs) # 弹出输入框获取用户输入 post_max_size=$(dialog --clear \ --backtitle "$BACKTITLE" \ --inputbox "Please enter post_max_size value (e.g. 20M):" \ $HEIGHT $WIDTH "$current_val" \ 3>&1 1>&2 2>&3 3>&- \ ) # 更新php.ini配置 sed -i "s/^post_max_size.*/post_max_size = $post_max_size/" "$PHP_INI_PATH" # 更新全局配置文件(先删除旧条目再新增) sed -i "/^export POST_MAX_SIZE/d" "$CONFIG_FILE" echo "export POST_MAX_SIZE=\"$post_max_size\"" >> "$CONFIG_FILE" # 重新加载配置到当前会话 source "$CONFIG_FILE" # 提示用户修改完成 dialog --msgbox "post_max_size updated to $post_max_size" 10 40 ;; 2) current_val=$(grep -E '^upload_max_filesize' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs) upload_max_filesize=$(dialog --clear \ --backtitle "$BACKTITLE" \ --inputbox "Please enter upload_max_filesize value (e.g. 20M):" \ $HEIGHT $WIDTH "$current_val" \ 3>&1 1>&2 2>&3 3>&- \ ) sed -i "s/^upload_max_filesize.*/upload_max_filesize = $upload_max_filesize/" "$PHP_INI_PATH" sed -i "/^export UPLOAD_MAX_FILESIZE/d" "$CONFIG_FILE" echo "export UPLOAD_MAX_FILESIZE=\"$upload_max_filesize\"" >> "$CONFIG_FILE" source "$CONFIG_FILE" dialog --msgbox "upload_max_filesize updated to $upload_max_filesize" 10 40 ;; 3) current_val=$(grep -E '^memory_limit' "$PHP_INI_PATH" | awk -F= '{print $2}' | xargs) memory_limit=$(dialog --clear \ --backtitle "$BACKTITLE" \ --inputbox "Please enter memory_limit value (e.g. 256M):" \ $HEIGHT $WIDTH "$current_val" \ 3>&1 1>&2 2>&3 3>&- \ ) sed -i "s/^memory_limit.*/memory_limit = $memory_limit/" "$PHP_INI_PATH" sed -i "/^export MEMORY_LIMIT/d" "$CONFIG_FILE" echo "export MEMORY_LIMIT=\"$memory_limit\"" >> "$CONFIG_FILE" source "$CONFIG_FILE" dialog --msgbox "memory_limit updated to $memory_limit" 10 40 ;; 4) # 返回主菜单 clear return 0 ;; esac done }
关键说明
- 循环菜单设计:主脚本和子脚本都采用
while true循环,子脚本选“Back to Main Menu”时用return退出子函数,回到主脚本的循环,自动重新显示主菜单。 - 全局配置共享:用
/etc/php_custom_config.conf存储变量,所有需要读取的脚本只需在开头添加source /etc/php_custom_config.conf即可获取最新配置值。 - 实时更新php.ini:通过
sed命令直接修改PHP配置文件,同时在输入框显示当前值,提升用户体验。 - 权限注意:修改
/etc目录下的文件和php.ini需要root权限,运行start.sh时请加上sudo。
内容的提问来源于stack exchange,提问作者Dr.JoeBeer
相关产品推荐
相关产品推荐

