如果您使用 Nginx,并且想要从不会在更新中被删除或更改的外部文件覆盖您的 PHP 设置,您可以创建一个/etc/php/*/fpm/zz_overrides.ini
并将您的 PHP 环境更改放在那里。
当我使用 Nginx 时,我zz_overrides.ini
通过运行此脚本在我的环境中进行配置:
#!/bin/bash
for dir in /etc/php/*/fpm/; do
cat <<-"EOF" > "$dir"/zz_overrides.ini
[PHP]
post_max_size = 2000M
upload_max_filesize = 2000M
max_execution_time = 3000
EOF
done
ln -s /etc/php/*/fpm/zz_overrides.ini /etc/php/*/fpm/conf.d/20-zz-overrides.ini
# Enable the above php.ini extension via a symlink in conf.d;
现在我回去使用 Apache(我从来没有在其中执行过这项任务,并且我相信由于缺乏 php-fpm 利用,那里的情况应该会有很大不同)。
我应该如何在 Apache 中进行类似的覆盖?
新手:请注意,更改 PHP.ini 本身是无效的,因为它会在每次升级时被重写)。
答案1
在 Apache 中,您可以php_flag
在虚拟主机配置(或.htaccess
文档根目录中的文件)中使用指令。
以下示例模拟您当前的脚本,通过./conf-available/$vhost/php_overrides.conf
为每个启用的虚拟主机创建一个带有 php 覆盖指令的脚本并插入(或更新)Include
指向该文件的指令(路径是 Debian 风格,可根据您的需要进行调整):
apache_confdir="${apache_confdir:-/etc/apache2}"
apache_confavailable="${apache_confdir}/conf-available"
overrides_name="php_overrides.conf"
overrides=(
"post_max_size = 2000M"
"upload_max_filesize 2000M"
"max_execution_time 3000"
)
# name of the directive under which the new Include directive will be placed
parentdirective_name="DocumentRoot"
parentdirective_re="^([[:space:]]*)(${parentdirective_name}[[:space:]]+.*)$"
oldpwd="$(pwd)"
cd ${apache_confdir}/sites-enabled
for vhostconf in *.conf; do
# construct and create/overwrite the per vhost php_overrides.conf file
vhost_realpath="$(readlink -m "${vhostconf}")"
vhost_realname="${vhost_realpath##*/}"
vhost_name="${vhost_realname%*.conf}"
vhost_confdir="${apache_confavailable}/${vhost_name}"
[[ ! -d "${vhost_confdir}" ]] && mkdir -p "${vhost_confdir}"
vhost_overrides="${vhost_confdir}/${overrides_name}"
printf "php_flag %s\n" "${overrides[@]}" > ${vhost_overrides}
# construct and insert/update the Include directive
printf -v includedirective "Include %s" "${vhost_overrides}"
include_re="^([[:space:]]+Include[[:space:]]+${vhost_overrides})$"
if grep -qE "${include_re}" "${vhostconf}"; then
sed -i "s#${include_re}# ${includedirective}#g" "${vhost_realpath}"
else
declare -a directives=()
while IFS='' read line; do
directives+=("${line}")
if [[ "${line}" =~ ${parentdirective_re} ]]; then
directives+=("${BASH_REMATCH[1]}${includedirective}")
fi
done<"${vhost_realpath}"
printf "%s\n" "${directives[@]}" > "${vhost_realpath}"
fi
done
cd "${oldpwd}"
./conf-available/php_overrides.conf
但是,由于看起来所有虚拟主机都使用相同的 PHP 覆盖,因此只需创建一次文件,在每个 vhost 配置中包含以下行,然后创建或删除符号链接 ./conf-enabled
以控制是否使用它,会更容易:
# inside /etc/apache2/sites-available/vhost1
Include /etc/apache2/conf-enabled/vhost1/*.conf
因此使用它:
cd /etc/apache2/conf-enabled
mkdir vhost1
cd vhost1
ln -s /etc/apache2/conf-available/php_overrides.conf
要停止使用:
rm /etc/apache2/conf-enabled/vhost1/php_overrides.conf