Configure mỗi trang web cá nhân:
<?php
$cfgsession['file'] = "../sessions_global.txt";
$cfgsession['keepalive'] = 7200;
?>
Để làm phiên nhiều trang web chia sẻ, hãy để họ sử dụng cùng một $cfgsession['file']
. Bao gồm phiên từ một trang web trong một yêu cầu đến một tên miền khác (có thể do Jack đề xuất) và miễn là bạn không bắt họ yêu cầu trong trình duyệt khác hoặc bất kỳ điều gì (vui lòng một số nội dung để ngăn chặn việc chiếm đoạt phiên) , hãy để họ chỉ định phiên có $ _GET. Ví dụ:
include ("../session.php");
if (isset($_COOKIE['session'])) session_begin($_COOKIE['session'], $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']);
else session_begin("", $_SERVER['HTTP_USER_AGENT'] . "+" . $_SERVER['HTTP_ACCEPT_CHARSET'], $_SERVER['REMOTE_ADDR']);
setcookie("session", session_identity(), 0);
Và sau đó chỉ cần cuộn chức năng session_ riêng bạn:
<?php
function session_begin($mysession = "", $key = "", $client = "") {
global $cfgsession;
if (!preg_match("/^[a-z0-9]{32}$/i", $mysession)) $mysession = md5(microtime());
$error = false;
$client = trim($client);
$key = trim($key);
$cfgsession['returning'] = false;
if ($chandle = @tmpfile()) {
if ($shandle = @fopen($cfgsession['file'], "rb")) {
flock($shandle, LOCK_SH);
fputs($chandle, $mysession . " " . time() . " $" . $client . " $" . $key . "\n");
while (!feof($shandle)) {
$sline = explode(" ", trim(fgets($shandle)), 4);
if ($sline[1] >= (time() - $cfgsession['keepalive'])) {
if (($sline[0] == $mysession) && ($sline[3] == "$" . $key)) {
$cfgsession['client'] = substr($sline[2], 1);
$cfgsession['returning'] = true;
} elseif (count($sline) > 2) fputs($chandle, implode(" ", $sline) . "\n");
}
}
fclose($shandle);
fseek($chandle, 0);
if ($shandle = @fopen($cfgsession['file'], "cb")) {
if (flock($shandle, LOCK_EX)) {
ftruncate($shandle, 0);
$cfgsession['count'] = 0;
while (!feof($chandle)) {
$cline = trim(fgets($chandle));
fputs($shandle, $cline . "\n");
$cfgsession['count']++;
}
} else $error = true;
fclose($shandle);
} else $error = true;
} else $error = true;
fclose($chandle);
} else $error = true;
if (($cfgsession['returning'] == false) && ($mysession == $cfgsession['session'])) {
$cfgsession['returning'] = true;
$mysession = md5(microtime());
}
$cfgsession['session'] = $mysession;
if ($error) return -1;
else return 0;
}
function session_count() {
global $cfgsession;
return $cfgsession['count'];
}
function session_client() {
global $cfgsession;
return $cfgsession['client'];
}
function session_id() {
global $cfgsession;
return $cfgsession['session'];
}
function session_index() {
global $cfgsession;
$index_return = array();
if ($uhandle = @fopen($cfgsession['file'], "rb")) {
flock($uhandle, LOCK_SH);
while (!feof($uhandle)) {
$uline = explode(" ", trim(fgets($uhandle)), 4);
foreach ($uline as &$value) {
if ($value[0] == "$") $value = substr($value, 1);
}
if (count($uline) >= 2) $index_return[] = $uline;
}
fclose($uhandle);
}
return $index_return;
}
function session_returning() {
global $cfgsession;
return $cfgsession['returning'];
}
?>
Tại sao bạn không để PHP tạo ID phiên cho bạn? Bạn có thể chia sẻ ID phiên trên các tên miền BTW. Đó là một vấn đề của cookie * hoặc * truyền tham số truy vấn. – hakre
Thông số truy vấn không được ưu tiên, nó không an toàn và không thân thiện với url. Theo như tôi biết bạn chỉ cho phép cookie accros cùng một tên miền (tên miền phụ cũng) không multidomains. –
Nó chỉ là một cookie bạn vượt qua. Và bạn có thể tạo cookie cho tên miền của bên thứ ba, được gọi là cookie của bên thứ ba. Bạn cũng có thể cần phải kiểm tra mặt pháp lý để thực hiện việc này (bên cạnh khía cạnh kỹ thuật được giải quyết). Btw tất cả các chi tiết kỹ thuật bạn có thể muốn tìm hiểu về: [Cơ chế quản lý nhà nước HTTP RFC6265] (http://tools.ietf.org/html/rfc6265) – hakre