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
'Program Tip' 카테고리의 다른 글
C ++에서 new 대신 std :: allocator를 사용하는 이점은 무엇입니까? (0) | 2020.12.07 |
---|---|
Jupyter에서 TensorFlow 그래프를 시각화하는 간단한 방법은 무엇입니까? (0) | 2020.12.07 |
프로그래밍 방식으로 릴리스 / 디버그 모드 감지 (.NET) (0) | 2020.12.07 |
Python에서 TeX를 사용하여 matplotlib 레이블에 개행 문자를 넣습니까? (0) | 2020.12.07 |
자바 스크립트 배열 전달-> PHP (0) | 2020.12.07 |