2009-03-17 2 views
52

Trên trang web của tôi, tôi sử dụng các phiên PHP. Thông tin phiên được lưu trữ trong các tệp trong đường dẫn ./session của tôi. Sau một vài tháng tôi phát hiện ra rằng các tập tin phiên này không bao giờ bị xóa, bây giờ có 145.000 trong số chúng trong thư mục này.dọn dẹp các tệp phiên php

Chúng sẽ được làm sạch như thế nào? Tôi có phải làm điều đó theo lập trình, hoặc là một thiết lập mà tôi có thể sử dụng ở đâu đó mà sẽ có sự dọn dẹp này xảy ra tự động?

EDIT quên đề cập: Trang web này chạy tại nhà cung cấp, vì vậy tôi không có quyền truy cập vào dòng lệnh. Tôi có quyền truy cập ftp, nhưng các tệp phiên thuộc về một người dùng khác (phiên bản máy chủ web chạy tôi đoán) Từ những câu trả lời đầu tiên, tôi nghĩ rằng đó không chỉ là cài đặt trên máy chủ hoặc PHP, vì vậy tôi đoán tôi sẽ phải thực hiện một cái gì đó cho nó trong PHP, và gọi đó định kỳ từ một trình duyệt (có thể từ một công việc cron chạy trên máy của riêng tôi ở nhà)

Trả lời

51

Để xử lý phiên đúng cách, hãy xem http://php.net/manual/en/session.configuration.php.

Ở đó bạn sẽ tìm thấy những biến:

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

Những kiểm soát thu gom rác (GC) khả năng chạy với mỗi yêu cầu trang.

Bạn có thể đặt những người có số ini_set() ở đầu tập lệnh hoặc tệp .htaccess để bạn chắc chắn ở một mức độ nào đó họ sẽ bị xóa đôi khi.

+7

LƯU Ý: Nếu bạn đang sử dụng tùy chọn thư mục con để lưu trữ các tệp phiên (xem session.save_path ở trên), thì việc thu thập rác sẽ không * xảy ra tự động. Bạn sẽ cần phải thực hiện bộ sưu tập rác của riêng mình thông qua một kịch bản lệnh shell, mục nhập cron hoặc một số phương thức khác. Ví dụ: tập lệnh sau sẽ tương đương với phiên thiết lập.gc_maxlifetime đến 1440 (1440 giây = 24 phút): cd/path/to/sessions; tìm -cmin +24 | xargs rm – Jehy

+0

@Jehy Có vẻ như bây giờ PHP có thể thực hiện bộ sưu tập rác ngay cả khi bạn có một session.save_path tùy chỉnh. –

+0

@ DarrellBrogdon Bạn có tài nguyên hoặc thông tin thêm về bộ sưu tập rác tự động của PHP khi sử dụng đường dẫn session.save tùy chỉnh không? Điều này sẽ tốt đẹp nếu như vậy. – maartenmachiels

5

Sử dụng cron với tìm xóa tệp cũ hơn ngưỡng đã cho. Ví dụ để xóa các tập tin chưa được truy cập trong ít nhất một tuần.

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

Cảm ơn câu trả lời của bạn, như tôi đã nói phiên bản mới nhất của câu hỏi của tôi nó không phải là một tùy chọn để chạy nó từ dòng lệnh, tôi sẽ xem nếu tôi có thể thuyết phục nhà cung cấp của tôi để đặt một cái gì đó như thế này trong cron. – Jack

33

Debian/Ubuntu xử lý này với một cronjob quy định tại /etc/cron.d/php5

# /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 

Kịch bản maxlifetime chỉ đơn giản là trả về số phút mỗi phiên phải được giữ sống bằng cách kiểm tra php .ini, có vẻ như thế này

#!/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 
+0

Cảm ơn câu trả lời của bạn Paul, như tôi đã nói trong phiên bản mới nhất của câu hỏi của tôi nó không phải là một tùy chọn để chạy nó từ dòng lệnh, tôi sẽ xem liệu tôi có thể thuyết phục nhà cung cấp của tôi để đặt một cái gì đó như thế này trong cron. – Jack

+0

Nhờ điều này, tôi thấy rằng ai đó phải cắt và dán cái này để không hiệu quả. Các & trong lệnh bây giờ là &. Server đã không thu gom rác trong hơn 2 năm. Không có gì ngạc nhiên khi nó có mùi rất tệ ở đây! – flickerfly

+0

Vì vậy, điều này hoàn toàn bỏ qua bất cứ điều gì được thiết lập thông qua ini_set? Không ngạc nhiên khi thiết lập gc trong kịch bản không có gì. – styks

2

Dự đoán tốt nhất của tôi là bạn đang ở trên máy chủ dùng chung và tệp phiên được trộn lẫn với tất cả người dùng để bạn không thể, cũng như bạn không nên xóa chúng. Những gì bạn có thể làm, nếu bạn lo lắng về việc mở rộng quy mô và/hoặc quyền riêng tư của phiên người dùng của bạn, là chuyển các phiên sang cơ sở dữ liệu.

Bắt đầu viết Cookie đó vào cơ sở dữ liệu và bạn đã có một chặng đường dài hướng tới mở rộng quy mô ứng dụng trên nhiều máy chủ khi đến hạn.

Ngoài ra, tôi sẽ không lo lắng nhiều với 145.000 tệp.

+0

Cảm ơn Frankie, ý tưởng tốt về việc chuyển nó sang cơ sở dữ liệu, sẽ ghi nhớ điều đó. – Jack

5

Bạn có thể tạo kịch bản /etc/cron.hourly/php và đặt ở đó:

#!/bin/bash 

max=24 
tmpdir=/tmp 

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

Sau đó thực hiện kịch bản thực thi (chmod + x).

Giờ mỗi giờ sẽ bị xóa tất cả các tệp phiên có dữ liệu được sửa đổi cách đây hơn 24 phút.

19

Trong trường hợp ai đó muốn để làm điều này với một cronjob, hãy nhớ rằng đây:

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

là rất chậm, khi có rất nhiều tập tin.

Xem xét sử dụng này để thay thế:

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

Trong trường hợp bạn có khoảng trống trong quý vị nộp tên sử dụng này:

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

xargs sẽ lấp đầy các dòng lệnh với các tập tin bị xóa, sau đó chạy rm lệnh ít hơn nhiều so với -exec rm {} \;, lệnh này sẽ gọi lệnh rm cho mỗi tệp.

Chỉ cần tôi hai xu

+0

Cũng nên nhớ rằng bạn có thể sử dụng '-exec $ cmd {} +;' thay vì '-exec $ cmd {} \;' Nó sẽ thực hiện tất cả các tệp được tìm thấy trong một lệnh thay vì chạy lệnh một lần cho mỗi tập tin được tìm thấy. Điều này rất giống với xargs như 'Andi' đã được đề xuất. Đọc thêm về nó tại đây: https://unix.stackexchange.com/questions/195939/what-is-meaning-of-in-finds-exec-command – domdambrogia

3
# 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 

Các Breakdown: Chỉ những tập tin: find/var/lib/php5/-type f
Hơn phút: -cmin
Nhận thiết lập php : $ (echo "` php -i | grep -i phiên.gc_maxlifetime
Làm phép tính: | cut -d '' -f3`/60 "| bc)
Tệp đối sánh RM: -exec rm -f {} \;

0

Sử dụng dưới đây 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 
0

cd đến các buổi thư mục và sau đó:

1) Xem phiên già hơn 40 phút: find . -amin +40 -exec stat -c "%n %y" {} \;

2) Di chuyển những session cũ hơn hơn 40 phút: find . -amin +40 -exec rm {} \;