2012-04-30 33 views
25

Vì một số lý do kỳ lạ, hôm nay máy chủ của chúng tôi đã quyết định rất chậm trong thời gian bắt đầu phiên. Đối với mỗi session_start, máy chủ sẽ hết thời gian chờ sau 30 giây hoặc sẽ mất khoảng 20 giây để máy chủ bắt đầu phiên. Điều này là rất lạ, nhìn thấy như nó đã không làm điều này trong một thời gian rất dài (lần cuối cùng máy chủ của chúng tôi đã làm điều này là khoảng 7 vài tháng trước đây). Thay vào đó, tôi đã cố gắng thay đổi phiên chạy qua cơ sở dữ liệu và hoạt động tốt, vì trang web hiện tại của chúng tôi được xây dựng, sẽ mất vài ngày để đi trên mỗi trang và thay đổi tải phiên để bao gồm phiên mới xử lý. Do đó, câu hỏi của tôi vẫn là:session_start có vẻ rất chậm (nhưng đôi khi chỉ)

Tại sao quá chậm và tại sao chỉ thỉnh thoảng?

Chúng tôi chạy trên một máy chủ hetzner chuyên dụng với ram 24GB và CPU đủ nhanh để chỉ chạy một máy chủ web đơn giản (một Xeon, tôi tin, nhưng tôi không chắc chắn). Chúng tôi chạy debian trên máy chủ với thiết lập apache + fastcgi + php5.

Máy chủ không báo cáo tải nhiều, không thông qua trạng thái máy chủ cũng như lệnh top. Vnstat báo cáo không có vấn đề gì với liên kết mạng của chúng tôi (một lần nữa, điều đó sẽ không dẫn đến việc xử lý phiên chậm cục bộ). IOtop báo cáo không có vấn đề với các quá trình chiếm toàn bộ đĩa cứng. Viết vào thư mục tmp nơi tệp phiên được đặt hoạt động nhanh nếu được thực hiện thông qua vim.

Một lần nữa, để làm điều này rõ ràng, mối quan tâm chính của tôi ở đây không phải là chúng ta nên chuyển sang DB hay phiên bản bộ nhớ được lưu trong bộ nhớ, đơn giản là hỏi tại sao điều này xảy ra nhìn vào dường như làm việc tốt, ngoại trừ bản thân PHP.

CHỈNH SỬA: Tệp tối đa trong thư mục tmp PHP của chúng tôi là 2,9 MB, vì vậy không có gì phải ảnh hưởng, tôi tin.

CẬP NHẬT: Tôi chưa bao giờ tìm ra điều gì sai và/hoặc cách khắc phục, nhưng sự cố đã biến mất sau khi chúng tôi chuyển sang phiên memcached/db.

+2

Hãy xem trong thư mục 'tmp' của bạn. PHP lưu trữ các phiên của nó ở đó. Xem có bất cứ điều gì không ổn. – freshnode

+1

Có vấn đề gì với đĩa hoặc hệ thống tập tin? – Jon

+10

"nó sẽ mất nhiều ngày để đi trên mỗi trang và thay đổi tải phiên để bao gồm một phiên xử lý mới" Nếu đó là trường hợp bạn nghiêm túc nên xem xét sửa chữa thực tế đó đầu tiên – PeeHaa

Trả lời

14

Bạn đã thử session_write_close(); chưa? Điều này sẽ vô hiệu hóa khả năng ghi trong các biến phiên nhưng bạn vẫn có thể đọc dữ liệu từ chúng. Và sau đó khi bạn cần phải viết một biến phiên, mở lại nó.

Tôi cũng đã gặp phải vấn đề này nhưng điều này hoạt động như một sự quyến rũ.Đây là những gì tôi làm:

session_start(); //starts the session 
$_SESSION['user']="Me"; 
session_write_close(); // close write capability 
echo $_SESSION['user']; // you can still access it 
+0

Cảm ơn bạn. Tôi ít nhất nghĩ rằng nó hoạt động ngay bây giờ. Nhanh hơn nhiều và không hoàn toàn chậm lại chưa :) –

0

Mỗi phiên được lưu trữ bởi apache dưới dạng tệp văn bản.

Khi bắt đầu phiên được sử dụng để tiếp tục phiên hiện tại (thông qua mã định danh cookie), có thể tệp phiên lớn (Phiên có nhiều nội dung bên trong) có thể bắt đầu chậm?

Nếu đây là trường hợp có thể ứng dụng của bạn đang đặt nhiều dữ liệu vào các phiên.

+0

Tệp lớn nhất trong thư mục tmp của chúng tôi là 2,9MB, vì vậy không có gì mà _should_ tạo ra tác động. – h2ooooooo

1

Tôi cũng gặp sự cố này. Nó được trả lời ở đây:

Problem with function session_start() (works slowly)

Sessions đang bị khóa bởi PHP trong khi một kịch bản được thực hiện, vì vậy nếu kịch bản được xếp chồng lên nhau dưới cùng một phiên, họ có thể gây ra những sự chậm trễ dài đáng ngạc nhiên.

+0

Tôi muốn điều này sẽ chỉ đơn giản là cố định nó, nhưng nó chỉ là lạ làm thế nào nó xảy ra với MỌI người dùng trên trang web (bao gồm truy cập từ văn phòng của chúng tôi trên máy tính khác nhau), nếu nó chỉ đơn giản là một tập tin phiên bị khóa. Có lẽ nó có thể là do chúng tôi đã sử dụng các tệp văn bản và do đó nó đã sử dụng tệp ** cùng **, đã bị khóa? – h2ooooooo

4

Tôi đã gặp vấn đề tương tự: đột nhiên máy chủ mất 30 giây để thực hiện yêu cầu. Tôi nhận thấy đó là vì session_start(). Yêu cầu đầu tiên là nhanh, nhưng mỗi yêu cầu tiếp theo mất một số 30 giây để được thực thi. Tôi thấy rằng tệp phiên trong c: \ wamp \ tmp đã bị khóa bởi yêu cầu đầu tiên trong khoảng 30 giây. Trong thời gian này, yêu cầu thứ hai đang chờ tệp mở khóa. Tôi phát hiện ra rằng nó có liên quan đến rewrite_mod.htaccess. Tôi vô hiệu hóa rewrite_mod và nhận xét ra mọi dòng trong .htaccess và nó hoạt động trở lại như một sự quyến rũ. Tôi không biết tại sao điều này lại xảy ra vì tôi không nhớ thay đổi bất kỳ cài đặt nào hay không.

+0

Tôi hoàn toàn đồng ý với giải pháp này .. nhưng tại sao tôi không biết. –

0

Vui lòng kiểm tra xem bạn có cài đặt memcache chính xác hay không, ví dụ: trong /etc/php.d/memcached.ini