簡體   English   中英

為什么在兼容打開的頁面之間共享PHP會話似乎在FF中有效,而不是IE或Chrome?

[英]Why does sharing PHP sessions between concurrently open pages seem to work in FF, but not IE or Chrome?

編輯我剛剛意識到在編寫縮寫代碼示例時我必須有一個大腦屁。 看,我用得很聰明。 因此,我實際上已經在使用Kips的解決方案了,因為會話保存后會有智能顯示

我一直在為我正在研究的PHP站點實現一個資源管理器(用於壓縮,壓縮和縮小CSS和JS),並且遇到了一個非常奇怪的問題。 因此,當用戶導航到index.php時,文件被添加到資源管理器對象,該對象將它們組合成單個文件,並通過<script src="resource.php?id=123&ext=.js">包含在頁面中。 <script src="resource.php?id=123&ext=.js"><link href="resource.php?id=123&ext=.css" />

它基本上歸結為文件路徑存儲在被訪問頁面上的會話中,並從資源頁面上的會話中讀取。 在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,並在標頭中設置PHPSESSID cookie。 然后傳遞頁面內容。

我目前無法使用PHP訪問計算機,但以下內容可能有助於測試您的理論。 test1.php設置會話變量,但是需要30秒才能完全加載。 同時, test2.php (一個CSS文件)將嘗試使用該會話變量作為文本顏色。 如果可以從test2讀取會話,則文本將顯示為紅色;否則,將顯示黑色(默認顏色)。

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']; ?>; }

我終於想出了解決這個問題所需要的東西。 對於初學者來說,Kip建議的解決方案是正確的,但實際上它並不是我問題的解決方案,因為我所說的問題實際上並不是我的問題...或多或少。

在我正在進行的其中一個測試中,我突然注意到SessionID對於頁面和資源文件是不同的。 我不知道這是怎么可能的,直到我記得在頁面中包含的另一個組件中,我重新生成SessionID( session_regenerate_id() )以防止CSRF攻擊。 一旦我評論出這條線,一切都在每個瀏覽器中完美運行。

然而,對我來說,這提出了一個新問題......為什么session_regenerate_id()不保留會話數據?

編輯 - 跟進:似乎這實際上是一個已知問題,並且在sessiondgenerate_id()的PHP文檔頁面的注釋中有詳細記錄。

從這里開始: http//www.php.net/manual/en/function.session-regenerate-id.php#81212並閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM