如何通过终端获取和设置 php.ini 变量

如何通过终端获取和设置 php.ini 变量

我想php.ini通过终端更改一些 (php5.6) 变量。示例:我需要获取值post_max_size(目前为8M),将其显示在终端中,将其更改为2048M并再次显示。

我怎能这样做?

答案1

得到:

grep '^post_max_size ' php.ini

代替:

sed -i 's,^post_max_size =.*$,post_max_size = 2048M,' php.ini

php.ini请注意,在运行之前创建备份是个好主意sed

cp php.ini php.ini.bak

答案2

我假设您存储的值php.ini每行一个,并用空格分隔,=也可以不带空格。变量名和值都不包含=

打印post_max_size(选择一个):

<php.ini awk -F"= *" '/^ *post_max_size/{print$2}'
<php.ini sed '/^ *post_max_size/!d;s/.*= *//'
<php.ini grep -oP '^ *post_max_size *= *\K.*'

改变创建备份的post_max_size价值在于:2048Mphp.ini.bak

sed -i.bak '/^ *post_max_size/s/=.*/= 2048M/' php.ini

解释

  • <php.ini awk -F"= *" '/^ *post_max_size/{print$2}'
    • <php.ini– 让 shell 打开php.ini并将其分配给程序的标准输入,这有许多优点,请参阅这里
    • -F"= *"– 设置=后跟零个或多个空格字符作为字段分隔符
    • /^ *post_max_size/{print$2}post_max_size– 从以print field开头的行开始2
  • <php.ini sed '/^ *post_max_size/!d;s/.*= *//'
    • /^ *post_max_size/!dd删除除以 开头的行之外的所有行post_max_size
    • s/.*= *//–用空字符s替换其前面的所有内容=以及其后的零个或多个空格字符(=删除它)
  • <php.ini grep -oP '^ *post_max_size *= *\K.*'
    • -oPo仅打印匹配行的匹配部分并使用Perl 兼容正则表达式 (PCRE)
    • ^ *post_max_size *= *\K.*– 搜索以零个或多个空格字符开头post_max_size并被=其包围的行,然后从整体正则表达式匹配 ( ) 中删除迄今为止匹配的文本,\K并匹配其后的所有内容
  • sed -i.bak '/^ *post_max_size/s/=.*/= 2048M/' php.ini
    • -i.bak– 更改文件in 位置并使用扩展名进行备份.bak
    • /^ *post_max_size/…– 在以 开头的行中post_max_size执行
    • s/=.*/= 2048M/substitute=及其后的所有内容= 2048M

答案3

我编写了一个简单的 bash 脚本来实现 Arkadiusz Drabczyk 的答案。

该脚本自动检测 php 的活动版本。

该脚本假定您正在使用 apache2(您可以传递第三个参数来覆盖)。

我命名了该文件php-iniset并将其添加到我的一个 bin 目录中。

现在你可以调用:

php-iniset post_max_size 2048M

或者像这样调用它来注释掉变量:

php-iniset post_max_size

您可能需要根据需要调整文件路径等内容

请记住先备份你的 ini 文件!

脚本如下:

#!/bin/bash
#
#   useage:
#   php-iniset key value
#
#   sets php ini key to value
#   if no value is supplied key will be commented
#   If value is supplied key will automatically be commented out
#
key=$1
val=$2
scope=${3:-apache2}

version=`php -r "echo substr(PHP_VERSION, 0, 3);"`
filepath="/etc/php/$version/$scope/php.ini"

if [ -f $filepath ]
then
    if [ -e $val ]
    then
        #disable if value is empty
        sudo sed -i "/^$key =.*$/s/^/;/g" $filepath

        #confirm disabled
        grep "^;$key " $filepath

    else
        #enable if value has been supplied
        sudo sed -i "/^;$key =.*$/s/^;//g" $filepath

        #modify value
        sudo sed -i "s,^$key =.*$,$key = $val," $filepath

        #confirm value
        grep "^$key " $filepath
    fi

else
    echo "$path does not exist"
fi

相关内容