【发布时间】:2017-06-11 00:57:27
【问题描述】:
我在下面抽象了两个 PHP 文件: 文件 1:login.php
<?
ob_start();
session_start();
$q = "SELECT user_id, user_first_name, user_priv, user_reg_date, user_pref, user_last_login FROM Users WHERE (user_email='$e' AND user_pass=SHA1('$p')) AND user_active IS NULL";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));
if (mysqli_num_rows($r) == 1) { // A match was made.
// Register the values & redirect:
$_SESSION = mysqli_fetch_array ($r, MYSQLI_ASSOC);
session_write_close();
mysqli_close($dbc);
$url = BASE_URL . '/CustomIndex.php'; // Define the URL:
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}
?>
文件 2:CustomIndex.php
<?
ob_start();
session_start();
if (empty($_SESSION['user_first_name'])) {
if(isset($_GET['custom2'])){
$url = BASE_URL . '/index.php'; // Define the URL.
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}
sleep(5);
$url = BASE_URL . "/CustomIndex.php?custom2=1";
ob_end_clean(); // Delete the buffer.
header("Location: $url");
exit(); // Quit the script.
}
if(isset($_SESSION['user_first_name'])){
// …program code…
}
?>
当文件 1 (login.php) 被执行时,文件 2 (CustomIndesx.php) 中的“if (empty($_SESSION['user_first_name']))”语句可能有 10% 为真,并且客户端没有被执行,而是被重定向到 index.php,就好像没有设置 $_SESSION 变量一样。
但是,在那之后,如果我直接运行 FILE 2 (CustomIndesx.php),它会读取 $_SESSION 数据并正确执行。
我在“SLEEP”之后添加了所有代码来模拟手动运行 CustomIndesx.php,但除了将重定向延迟 5 秒外,没有任何改变。
谁能提出这种随机行为的原因,以及如何消除它?
【问题讨论】:
-
顺便说一句,这些脚本在 iPage.com 上运行
-
你能分享你
phpinfo()的会话部分吗? -
有人说
session.auto_start应该打开。如果您无法更改 php.ini 文件,您可以使用此ini_set函数。其他的有点复杂,你可以将会话保存处理程序文件更改为 redis。效率会更高。