gpt4 book ai didi

php - 为什么在并发打开的页面之间共享 PHP session 似乎在 FF 中有效,但在 IE 或 Chrome 中却无效?

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:51 25 4
gpt4 key购买 nike

编辑 我刚刚意识到我在编写缩写代码示例时一定是脑放了一个大屁。看,我正在使用 smarty。因此,我实际上已经在使用 Kips 的解决方案,因为 smarty 在 session 保存后显示

我一直致力于为我正在处理的 PHP 网站实现资源管理器(用于压缩、压缩和缩小 CSS 和 JS),但遇到了一个非常奇怪的问题。因此,当用户导航到 index.php 时,文件将添加到资源管理器对象中,资源管理器对象将它们组合成一个文件,并通过 <script src="resource.php?id=123&ext=.js"> 包含在页面中。或 <link href="resource.php?id=123&ext=.css" />

它基本上归结为一个文件路径存储在访问页面的 session 中,并从资源页面的 session 中读取。在 FF 中,这工作得很好。在 IE 和 Chrome 中,它不会。

这是一个简化得多的代码示例:

index.php

<?php
session_start();
//Do a ton of stuff
//Including adding several files to the resource object
//Add the resource links to the head
$smarty->append('headSection','<link href="resource.php?id=<?=$resourceID?>&type=.js" />');
</head>
//Save the resource file which:
// - Outputs the file
// - Saves a reference to it in session
$_SESSION[$resourceID] = $file;
//Let Smarty display
$smarty->display($templateFile);
?>

resource.php

<?php
readfile($_SESSION[$_GET['id']] . $_GET['type']);
?>

在我看来,FF 在对页面所需的资源发出任何新请求之前等待整个页面响应,而 IE 和 Chrome 通过在遇到第二个新请求时启动新请求来运行。因此,这个错误基本上归结为竞争条件。

谁能证实这确实是它的工作方式?如果是这样 - 我将如何解决它?

最佳答案

编辑:在更新您的问题之后,我对您出现竞争条件并不感到惊讶。我不知道为什么它在 Firefox 中工作,但 IE 和 Chrome 肯定不会通过提前请求资源来做任何非法的事情。解决此问题的一种方法是使用输出缓冲。在 index.php 文件的顶部,您可以添加:

ob_start('ob_gzhandler');

这是一石二鸟,方法是:a) 确保缓冲输出,这样浏览器在生成整个页面之前看不到文件; b) 使用 gzip 压缩为您和您的用户节省带宽。


上一个回答:这似乎没有意义。 Cookie 只能在页眉中设置,这发生在加载任何页面内容之前。所以浏览器请求index.php,并且在header中设置了PHPSESSID cookie。然后传递页面内容。

目前我无法访问装有 PHP 的机器,但以下内容可能有助于检验您的理论。 test1.php 设置一个 session 变量,但需要 30 秒才能完全完成加载。同时,test2.php(一个 CSS 文件)将尝试使用该 session 变量作为文本颜色。如果可以从 test2 读取 session ,文本将显示为红色,否则为黑色(默认颜色)。

test1.php

<?php
session_start();
$_SESSION['mycolor'] = 'red';
?>
<html>
<head>
<link rel="stylesheet" href="test2.php" type="text/css" />
</head>
<body>
Starting test...<br/>
<?php
for($i = 0; $i < 6; $i++) //loop will take 30 seconds to complete
{
echo "$i<br/>\n";
sleep(5);
}
?>
Done!
</body>
</html>

test2.php

<?php
session_start();
?>
body { color: <?php echo $_SESSION['mycolor']; ?>; }

关于php - 为什么在并发打开的页面之间共享 PHP session 似乎在 FF 中有效,但在 IE 或 Chrome 中却无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1533163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com