如何用Shell脚本编辑php.ini中含点的变量(PHP7.2 OPCache配置)
嘿,我之前也踩过这个坑!Bash变量名确实不能带点,所以直接用变量存opcache.enable这类配置项肯定行不通,不过有几个不用纠结变量名的办法,直接搞定php.ini的配置,给你分享一下:
解决Shell脚本配置PHP7.2 OPCache的问题
针对你自动化配置时遇到的带点配置项无法用Bash变量处理的问题,这里有几个实用方案:
方案1:用sed+grep直接修改/追加配置
sed是处理文本文件的神器,我们可以直接定位php.ini里的OPCache配置项,要么修改已有值,要么在配置项不存在时追加到文件末尾。
比如这段脚本片段可以处理核心的OPCache配置:
# 先定义你的php.ini路径,根据实际环境调整 PHP_CLI_INI="/etc/php/7.2/cli/php.ini" PHP_FPM_INI="/etc/php/7.2/fpm/php.ini" # 如果用PHP-FPM的话也要同步配置 # 配置opcache.enable=1 # 先尝试替换已有的配置行 sed -i 's/^opcache.enable=.*/opcache.enable=1/' $PHP_CLI_INI # 如果没找到这个配置项,就追加到文件末尾 grep -q "^opcache.enable" $PHP_CLI_INI || echo "opcache.enable=1" >> $PHP_CLI_INI # 配置opcache.memory_consumption=256 sed -i 's/^opcache.memory_consumption=.*/opcache.memory_consumption=256/' $PHP_CLI_INI grep -q "^opcache.memory_consumption" $PHP_CLI_INI || echo "opcache.memory_consumption=256" >> $PHP_CLI_INI # 同理处理其他OPCache配置,比如opcache.max_accelerated_files sed -i 's/^opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/' $PHP_CLI_INI grep -q "^opcache.max_accelerated_files" $PHP_CLI_INI || echo "opcache.max_accelerated_files=10000" >> $PHP_CLI_INI # 如果是FPM环境,同步配置到FPM的php.ini sed -i 's/^opcache.enable=.*/opcache.enable=1/' $PHP_FPM_INI grep -q "^opcache.enable" $PHP_FPM_INI || echo "opcache.enable=1" >> $PHP_FPM_INI # 其他FPM配置同理... # 最后重启PHP-FPM使配置生效(如果用了FPM) systemctl restart php7.2-fpm
这个方法的好处是不用管Bash的变量命名限制,直接操作文件内容,能覆盖配置项存在和不存在的两种场景,稳定性很高。
方案2:创建独立的OPCache配置文件(更推荐)
大部分PHP环境都支持在conf.d目录下加载独立的配置文件,这样不用修改主php.ini,维护起来更干净。我们可以直接用脚本生成一个专门的OPCache配置文件:
# 创建OPCache的独立配置文件 cat > /etc/php/7.2/mods-available/opcache.ini << EOF opcache.enable=1 opcache.memory_consumption=256 opcache.max_accelerated_files=10000 opcache.revalidate_freq=2 opcache.fast_shutdown=1 opcache.enable_cli=1 # 如果需要CLI环境也启用OPCache的话 EOF # 给CLI和FPM分别创建软链接,启用这个配置 ln -sf /etc/php/7.2/mods-available/opcache.ini /etc/php/7.2/cli/conf.d/10-opcache.ini ln -sf /etc/php/7.2/mods-available/opcache.ini /etc/php/7.2/fpm/conf.d/10-opcache.ini # 重启服务生效 systemctl restart php7.2-fpm
这种方式我个人更推荐,因为主php.ini不会被改动,后续排查问题或者升级PHP时都更方便,脚本逻辑也更简单,直接写入完整的配置块就行。
方案3:用awk处理配置项
awk也能很好地处理这类带点的配置,逻辑是找到对应配置行替换,其他行保持不变:
# 备份原文件(保险起见) cp $PHP_CLI_INI ${PHP_CLI_INI}.bak # 替换opcache.enable的值为1 awk -v conf_key="opcache.enable" -v conf_val="1" ' $1 == conf_key "=" { print conf_key "=" conf_val; next } 1' $PHP_CLI_INI > temp.ini && mv temp.ini $PHP_CLI_INI
这个方法也能生效,但记得先备份原文件,避免操作失误导致配置丢失。
总结一下,最省心的是方案2,用独立配置文件;如果必须修改主php.ini,方案1的sed+grep组合最可靠,能覆盖各种情况。
内容的提问来源于stack exchange,提问作者CarComp
相关产品推荐
相关产品推荐

