Program Tip

PHP 세션 파일 정리

programtip 2020. 12. 7. 20:34
반응형

PHP 세션 파일 정리


내 웹 사이트에서는 PHP 세션을 사용합니다. 세션 정보는 내 ./session 경로의 파일에 저장됩니다. 몇 달 후이 세션 파일이 삭제되지 않는다는 사실을 발견했습니다. 지금까지이 디렉토리에는 145.000 개가 있습니다.

어떻게 정리해야합니까? 프로그래밍 방식으로 수행해야합니까, 아니면이 정리가 자동으로 수행되도록 어딘가에서 사용할 수있는 설정입니까?

편집 은 언급하는 것을 잊었습니다.이 사이트는 공급자에서 실행되므로 명령 줄에 액세스 할 수 없습니다. 나는 ftp-access를 가지고 있지만 세션 파일은 다른 사용자에게 속합니다 (웹 서버가 실행하는 것입니다) 첫 번째 답변에서 나는 그것이 서버 나 PHP의 설정이 아니라고 생각합니다. PHP에서 무언가를 구현하고 브라우저에서 주기적으로 호출해야합니다 (집에있는 내 컴퓨터에서 실행되는 cron 작업에서 수행 할 수 있음).


세션을 올바르게 처리하려면 http://php.net/manual/en/session.configuration.php를 살펴보십시오 .

여기에서 다음 변수를 찾을 수 있습니다.

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

이는 각 페이지 요청과 함께 실행될 가비지 수집기 (GC) 확률을 제어합니다.

스크립트 또는 .htaccess 파일의 시작 부분에 ini_set ()으로 설정하여 언젠가 삭제 될 것이라는 확신을 가질 수 있습니다.


Debian / Ubuntu는 /etc/cron.d/php5에 정의 된 cronjob으로이를 처리합니다.

# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm

maxlifetime 스크립트는 php.ini를 확인하여 세션이 유지되어야하는 시간 (분)을 반환합니다.

#!/bin/sh -e

max=1440

for ini in /etc/php5/*/php.ini; do
        cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
        [ -z "$cur" ] && cur=0
        [ "$cur" -gt "$max" ] && max=$cur
done

echo $(($max/60))

exit 0

누군가 cronjob을 사용하여이 작업을 수행하려는 경우 다음 사항을 명심하십시오.

find .session/ -atime +7  -exec rm {} \;

파일이 많을 때 정말 느립니다.

대신 이것을 사용하는 것이 좋습니다.

find .session/ -atime +7 | xargs -r rm

파일 이름에 공백이있는 경우 다음을 사용하십시오.

find .session/ -atime +7 -print0 | xargs -0 -r rm

xargs는 삭제할 파일로 명령 줄을 채운 다음 각 파일에 대해 명령을 호출하는 rm보다 훨씬 적은 명령 을 실행 합니다.-exec rm {} \;rm

내 2 센트


Use cron with find to delete files older than given threshold. For example to delete files that haven't been accessed for at least a week.

find .session/ -atime +7  -exec rm {} \;

You can create script /etc/cron.hourly/php and put there:

#!/bin/bash

max=24
tmpdir=/tmp

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete

Then make the script executable (chmod +x).

Now every hour will be deleted all session files with data modified more than 24 minutes ago.


# Every 30 minutes, not on the hour<br>
# Grabs maxlifetime directly from \`php -i\`<br>
# doesn't care if /var/lib/php5 exists, errs go to /dev/null<br>

09,39 * * * *   find /var/lib/php5/ -type f -cmin +$(echo "\`php -i|grep -i session.gc_maxlifetime|cut -d' ' -f3\` / 60" | bc) -exec rm -f {} \\; >/dev/null 2>&1

The Breakdown: Only files: find /var/lib/php5/ -type f
Older than minutes: -cmin
Get php settings: $(echo "`php -i|grep -i session.gc_maxlifetime
Do the math: |cut -d' ' -f3` / 60" | bc)
RM matching files: -exec rm -f {} \;


My best guess would be that you are on a shared server and the session files are mixed along all users so you can't, nor you should, delete them. What you can do, if you are worried about scaling and/or your users session privacy, is to move sessions to the database.

Start writing that Cookie to the database and you've got a long way towards scaling you app across multiple servers when time is due.

Apart from that I would not worry much with the 145.000 files.


cd to sessions directory and then:

1) View sessions older than 40 min: find . -amin +40 -exec stat -c "%n %y" {} \;

2) Remove sessions older than 40 min: find . -amin +40 -exec rm {} \;


Use below cron:

39 20     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm

참고URL : https://stackoverflow.com/questions/654310/cleanup-php-session-files

반응형