मुझे त्रुटियों को खत्म करने का एक तरीका मिला, हालांकि, सभी दांव इस बात से दूर हैं कि आप किसी समस्या को खत्म कर रहे हैं या बस इसे मास्क कर रहे हैं। मेरे पास कई कंटेनर चल रहे हैं, और कुछ को यह समस्या है जबकि अन्य नहीं हैं।
/usr/lib/PHP5/sessionclean कि त्रुटि उत्पन्न होगा है:
#!/bin/sh -e
SAPIS="apache2:apache2\napache2filter:apache2\ncgi:php5\nfpm:php5-fpm\n"
# Iterate through all web SAPIs
(
printf "$SAPIS" | { \
proc_names=""
while IFS=: read -r conf_dir proc_name; do
if [ -e /etc/php5/${conf_dir}/php.ini ]; then
# Get all session variables once so we don't need to start PHP to get each config option
session_config=$(php5 -c /etc/php5/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p')
save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*\)$/\1/p')
gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60))
if [ "$save_handler" = "files" -a -d "$save_path" ]; then
proc_names="$proc_names $proc_name";
printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
fi
fi
done
# first find all open session files and touch them (hope it's not massive amount of files)
for pid in $(pidof $proc_names); do
find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_\*" -exec touch -c {} \;
done
}) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do
# find all files older then maxlifetime and delete them
find -O3 "$save_path" -depth -mindepth 1 -name 'sess_*' -ignore_readdir_race -type f -cmin "+$gc_maxlifetime" -delete
done
exit 0
लेकिन अगर मैं की जगह है कि डब्ल्यू एक/usr/lib/PHP5/sessionclean/एक कंटेनर जो ऐसा नहीं करता से त्रुटि उत्पन्न करें, जो है:
#!/bin/sh -e
SAPIS="apache2:apache2\napache2filter:apache2\ncgi:php5\nfpm:php5-fpm\n"
# Iterate through all web SAPIs
(
proc_names=""
printf "$SAPIS" | \
while IFS=: read -r conf_dir proc_name; do
if [ -e /etc/php5/${conf_dir}/php.ini ]; then
# Get all session variables once so we don't need to start PHP to get each config option
session_config=$(php5 -c /etc/php5/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
save_handler=$(echo "$session_config" | sed -ne 's/^session\.save_handler=\(.*\)$/\1/p')
save_path=$(echo "$session_config" | sed -ne 's/^session\.save_path=\(.*\)$/\1/p')
gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session\.gc_maxlifetime=\(.*\)$/\1/p')/60))
if [ "$save_handler" = "files" -a -d "$save_path" ]; then
proc_names="$proc_names $proc_name";
printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
fi
fi
done
# first find all open session files and touch them (hope it's not massive amount of files)
for pid in $(pidof $proc_names); do
find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_\*" -exec touch -c {} \;
done
) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do
# find all files older then maxlifetime and delete them
find -O3 "$save_path" -depth -mindepth 1 -name 'sess_*' -ignore_readdir_race -type f -cmin "+$gc_maxlifetime" -delete
done
exit 0
तब मुझे त्रुटियां नहीं मिलतीं।
क्या आपने इसे होस्ट करने वाली मशीन को पुनरारंभ करने का प्रयास किया है? ;) क्या आप 'session.save_path' कॉन्फ़िगरेशन के पथ की पुष्टि भी कर सकते हैं? –
sessionclean गैर मौजूदा PHP प्रक्रियाओं के लिए सत्र अपडेट करने का प्रयास करता है। शायद आपको मशीन को पुनरारंभ करना चाहिए या कम से कम PHP प्रक्रिया जानकारी अद्यतन करने के लिए apache को पुनरारंभ करना चाहिए। – maxhb
पुनरारंभ करने में मदद नहीं करता है। सत्र save_path को सेट किया गया है:/var/lib/php5/सत्र ये त्रुटियां हर बार नहीं होती हैं (sessionclean हर 30 मिनट में चलता है और यह त्रुटियां कभी-कभी कई बार दिखाई देती हैं, कभी-कभी कई दिनों में केवल एक बार)। इस स्क्रिप्ट के अलावा कस्टम सत्र हैंडलर का उपयोग करें जिसका अर्थ है कि सत्र फ़ोल्डर लगभग हमेशा खाली होता है –