2010-01-11 1 views
11

Tôi gặp sự cố khi tôi mất phiên PHP giữa 2 trang.Thay đổi Id phiên PHP giữa các trang

Session_start() được bao gồm trong tệp có tên là session-inc.php vào mỗi trang yêu cầu phiên được đặt. Điều này làm việc cho tất cả các trang trên trang web ngoại trừ một trang cụ thể, member-profile.php. Khi trang này được truy cập một phiên mới với một id khác (cùng tên phiên) được đặt và sử dụng thay thế.

Một vài chi tiết:

  • tên phiên được thiết lập bằng tay
  • Tất cả các trang trên cùng một máy chủ dưới cùng một tên miền
  • Nếu tôi đặt một session_start bổ sung() trên đây bao gồm ('session-inc.php') trong tệp member-profile.php, phiên được thực hiện chính xác
  • Tôi đã thử đặt session_cookie_domain và session.session_name trong .htaccess, phiên này hoạt động cho miền này nhưng nó đã dừng phiên được chuyển sang miền thanh toán ngoài
  • Chúng tôi đang chạy apache 2.2.6 với php 5.2.5

Đưa session_start() phía trên bao gồm ('phiên inc.php') trong tập tin thành viên profile.php là nhanh chóng và sửa chữa bẩn cho vấn đề này, nhưng tôi tự hỏi nếu có ai biết tại sao điều này sẽ xảy ra.

Cheers

Will

+0

Bạn có thể đăng nội dung tập tin session-inc.php của mình không? Bao gồm ('session-inc.php'); điều đầu tiên bạn làm trong member-profile.php? – Dominik

Trả lời

7

Theo tài liệu PHP, session_start phải được gọi trước khi thông tin được gửi trở lại browser-- trang này có thể có một rogue CR/LF, đánh dấu Unicode byte đặt hàng hoặc tương tự đang gây ra kết quả trước khi bạn include('session-inc.php')?

+0

Xin chào Ken Tôi đã kiểm tra các tập lệnh và dường như không có bất kỳ đầu ra nào trước cuộc gọi session_start(). – willl69

+0

+1 cho gợi ý đánh dấu thứ tự byte Unicode. Bạn đã cứu ngày của tôi! – AquilaRapax

0

Tìm thấy sự cố

Có dấu thứ tự byte ở đầu tệp chính bao gồm tệp của tên miền thứ hai. như đã nói bởi ken, cant có bất kỳ đầu ra trước khi một phiên bắt đầu, nó đã không được thiết lập phiên một cách chính xác.

2

Trong khi di chuyển trang web cũ từ PHP4 sang PHP5, tôi nhận thấy cài đặt cấu hình php.ini khiến php tự động khởi động phiên khi mọi yêu cầu. Đó là một thay thế cho đặt session_start() lên mọi trang ...

Có nhiều cách để kích hoạt thiết lập này:

Đặt dòng sau vào php.ini:

session.auto_start = on 

hoặc đưa điều này vào bạn apache virtual-site config hoặc .htaccess file:

<IfModule mod_php5.c> 
    php_flag session.auto_start on 
</IfModule> 

và nó sẽ làm cho $ _SESSION có sẵn trên tất cả các trang

0

Tìm thấy sự cố là dấu thứ tự byte (BOM) đang được đặt ở đầu tệp. Đã loại bỏ nó và nó sắp xếp ra vấn đề phiên.

2

Tôi vừa gặp sự cố này. Thật thú vị khi duyệt qua http://127.0.0.1 thay vì http://localhost đã giúp tôi.

0

SOLUTION: session.auto_start = on trong file: php.ini

Nó giải quyết được vấn đề tái tạo phiên id trên trang tải lại (refresh trang trang/thay đổi).

Sự cố đã xuất hiện sau khi cập nhật CPanel (và bao gồm nhiều PHP), ngay cả phiên bản php vẫn giữ nguyên.

Tệp PHP.ini hoàn toàn không có biến đó. Đã ở trong Cpanel -> Trình chỉnh sửa INPH đa biên -> Chế độ soạn thảo (không phải Cơ bản, trong cơ bản bạn không có cài đặt này) và thêm dòng. Nhấn Lưu.

M TO/KHI SỬ DỤNG GIẢI PHÁP NÀY: Để xác định xem đó có phải là vấn đề hay không, hãy đặt một dòng ở đầu và cuối tập tin index.php của bạn để kiểm tra id phiên. Sử dụng hàm: session_id(); Điều hướng qua các trang/tải lại trang. Nếu giá trị session_id thay đổi vấn đề không có trong mã của bạn và giải pháp này sẽ giải quyết vấn đề của bạn (phiên bị mất bên ngoài mã của bạn).

Tôi cũng đã cố gắng xác minh tính khả dụng của phiên lưu trên máy chủ web (session.save_path) nhưng, ngay cả khi đó là khách hàng tiềm năng thì cũng không phải như vậy. Tôi tưởng tượng đây là một "tính năng" của Cpanel với MULTIPHP UPDATE sẽ xảy ra khá thường xuyên.