Nginxを使用していて、更新時に削除または変更されない外部ファイルのPHP設定をオーバーライドする場合は、/etc/php/*/fpm/zz_overrides.ini
を作成してPHP envはそこで変更します。
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自体の変更は、アップグレードのたびに書き換えられるため、効果的ではないことに注意してください)。
Apacheでは、仮想ホスト構成内でphp_flag
ディレクティブ(またはドキュメントルートディレクトリ内で.htaccess
ファイル)を使用できます。
次の例は、有効な仮想ホストごとにphpオーバーライドディレクティブを使用して./conf-available/$vhost/php_overrides.conf
を作成し、そのファイルを指す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}"
ただし、すべての仮想ホストが同じPHPオーバーライドを使用しているように見えるため、ファイル./conf-available/php_overrides.conf
を一度作成し、各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