2011-12-27 37 views
10

Tôi muốn biết liệu có cách nào ngăn PHP gửi cookie khi gọi session_start() hay không.Ngăn chặn php session_start() gửi cookie

trường hợp sử dụng của tôi là cho một tối ưu hóa trang web:

  • (1a) đầu tiên tôi mở một phiên/gửi tiêu đề.
  • (1b) Sau đó tạo và xuất một số nội dung văn bản.
  • (1c) Để tăng cường đọc/ghi phiên, tôi gọi "session_write_close" ngay sau khi tôi không cần phải viết trong phiên nữa.
  • (2) Cuối cùng tôi có quy trình hiển thị hậu trang (đối với số liệu thống kê) yêu cầu phải có quyền ghi vào phiên. Phiên làm việc đã bị đóng, tôi không thể gọi session_start() nữa vì nó gửi một cookie và nó đến muộn cho điều đó. Đây là một quá trình tính toán nặng, vì vậy tôi phải làm điều đó sau khi trang được gửi cho khách hàng.

Khách hàng đã nhận được cookie phiên. Vì vậy, tôi không cần session_start() để gửi một (và dự phòng) mới.

Có ai đó biết cách chặn cookie hoặc nội dung tương tự không? Tất nhiên tôi muốn tránh "Không thể gửi cookie phiên - tiêu đề đã được gửi". Lỗi này không hiển thị đối với người dùng vì trang đã được hiển thị nhưng có vẻ xấu xí trong nhật ký.

Câu hỏi của tôi có vẻ là dự phòng, nhưng không phải như vậy. Tôi biết cách đầu trang và nội dung hoạt động (gửi tiêu đề đầu tiên, nội dung sau). Nó chỉ là PHP không cho phép tôi làm những gì tôi muốn.

Trả lời

11

Tôi muốn biết liệu có cách nào ngăn PHP gửi cookie khi gọi session_start() hay không.

Có, bằng cách yêu cầu PHP không sử dụng cookie cho phiên. Các thiết lập PHP là session.use_cookies:

ini_set('session.use_cookies', 0); # disable session cookies 
session_start(); 

By cookie mặc định được kích hoạt bởi vì họ được coi là an toàn hơn sau đó sử dụng các thông số URL (xem Sessions and security­Docs).

(2) Cuối cùng tôi có quy trình hiển thị hậu trang (đối với số liệu thống kê) yêu cầu quyền ghi vào phiên. Phiên làm việc đã bị đóng, tôi không thể gọi session_start() nữa vì nó gửi một cookie và nó đến muộn cho điều đó. Đây là một quá trình tính toán nặng, vì vậy tôi phải làm điều đó sau khi trang được gửi cho khách hàng.

Có thể nói với PHP rằng cookie đã được đặt bằng cách thêm nó vào $_COOKIE superglobal array­Docs. Tôi không bao giờ thử nghiệm nó, nhưng trong trường hợp bạn sử dụng session_start() và PHP thấy rằng cookie phiên đã được đặt (bởi trình duyệt, không phải PHP, $_COOKIE đại diện cho cookie của trình duyệt), nó sẽ không gửi tiêu đề (một lần nữa) để thiết lập cookie (như tôi hiểu bạn là những gì bạn muốn).


Edit: Một số kịch bản thử nghiệm để chơi xung quanh với:

<?php 
header('Content-Type: text/plain;'); 

echo "Incomming Cookies:\n"; 
print_r($_COOKIE); 

// to simulate that this is a new session, the session cookie is removed 
// which makes PHP think it is a new session when invoking session_start() 
// unset($_COOKIE['PHPSESSID']); 

// run the first session 
session_start(); // creates the session cookie (as we don't have one yet) 
printf("Session %s has been started: %s\n", session_name(), session_id()); 
var_dump($_SESSION); 
$_SESSION['variable'] = isset($_SESSION['variable']) ? $_SESSION['variable']++ : 0; 
session_commit(); 

printf("Session has been closed, remaining id is: %s\n", session_id()); 

// visual confirmation that session cookie has been created 
echo "Outgoing Cookies:\n"; 
print_r(headers_list()); 

// run the second session 
ini_set('session.use_cookies', 0); # disable session cookies 
session_start(); 
printf("Second session %s has been started: %s\n", session_name(), session_id()); 
var_dump($_SESSION); 
$_SESSION['2nd-variable'] = isset($_SESSION['2nd-variable']) ? $_SESSION['2nd-variable']++ : 0; 
session_commit(); 

Bạn cần phải gọi nó với một trình duyệt web (và phiên PHP phải được cấu hình để làm việc).

+0

Tuyệt vời, giải pháp đầu tiên làm việc 'ini_set ('session.use_cookies', 0) '. Giải pháp thứ hai dường như không có bất kỳ hiệu ứng nào (tôi đã thử nó ngày hôm qua) nhưng nó có thể liên quan đến cấu hình php của tôi. Tôi sẽ dành nhiều thời gian hơn cho giải pháp thứ hai này. Cảm ơn ! – Mat

+0

Tôi đã chạy một số thử nghiệm với '$ _COOKIE'. Nó thực sự hoạt động nhưng điều này sẽ giống như sử dụng 'ini_set();' và với 'ini_set()' rõ ràng hơn nó làm gì. Tôi sẽ thêm một kịch bản vào câu trả lời tôi đã sử dụng để chơi xung quanh, một số mã về '$ _COOKIE' được nhận xét. Bỏ ghi chú để tạo id phiên mới cho phiên đầu tiên. Điều này cũng cho thấy cách '$ _COOKIE' có liên quan đến' session_start() '. – hakre

+0

'ini_set ('session.use_cookies', '0');' hoạt động hoàn hảo cho tiêu đề cookie, nhưng không hoạt động cho tiêu đề bộ nhớ cache sẽ hết hạn cookie SID. Xem câu trả lời từ @ techdude để sử dụng 'session_start (['use_cookies' => '0', 'cache_limiter' => '']);' – Code4R7

-3

Bạn có thể sử dụng ob_start() chức năng để đệm các tiêu đề/nội dung, bạn có thể xóa các nội dung đệm sử dụng ob_clean()

+4

ob_start không đệm header. Chỉ nội dung cơ thể. Vì vậy, nó doe snot làm việc. – Mat

4

tôi nghĩ rằng tôi nên đề cập đến một cách tuyệt vời để ngăn chặn các cookie (và giới hạn bộ nhớ cache) header được gửi khi gọi session_start.

Cuộc gọi session_start có một mảng tùy chọn nơi bạn có thể đặt bất kỳ phiên nào. biến tiền tố và bạn có thể tắt những thứ này chỉ cho cuộc gọi đó.

session_start(array(
    'use_cookies' => '0', 
    'cache_limiter' => '' 
)); 

Lưu ý rằng use_cookies giữ cookie được gửi, và thiết lập các giới hạn bộ nhớ cache để một chuỗi rỗng giữ nó từ việc cập nhật các tiêu đề bộ nhớ cache (không phải là tính năng ghi chép tốt nhất).

Dưới đây là hai thông báo rằng điều này sẽ khắc phục (điều này hữu ích khi bạn cần phải làm việc qua nhiều phiên).

Warning: session_start(): Cannot send session cookie - headers already sent 

Warning: session_start(): Cannot send session cache limiter - headers already sent 
+0

Đây sẽ là câu trả lời hàng đầu! +1 – Code4R7

Các vấn đề liên quan