Neden aynı anda açık sayfaları arasında PHP paylaşımı toplantılarına gelmez FF çalışmak gibi görünüyor, ama değil IE veya Chrome?

2 Cevap php

EDIT I just realized that I must have had a massive brain fart while writing the abbreviated code sample. See, I'm using smarty. Thus, I'm actually already using Kips's solution, because smarty displays after the session is saved

Ben üzerinde çalışıyorum ve bir çok garip bir sorun haline çalıştırmak bir PHP sitesi için (yoğuşmalı sıkıştırma ve CSS & JS minifying için) bir kaynak yöneticisi uygulama üzerinde çalışıyorum. Bir kullanıcı index.php gider Yani, dosyaları tek bir dosya içine bunları birleştirir ve ya <script src="resource.php?id=123&ext=.js"> veya <link href="resource.php?id=123&ext=.css" /> vasıtasıyla sayfasında dahil bir kaynak yöneticisi nesne eklenir

Ne temelde aşağı kaynar bir dosya yolu erişilen sayfada bir oturumda depolanır ve kaynak sayfasındaki oturumunda okunan olmasıdır. FF, bu mükemmel çalışıyor. IE ve Chrome, öyle değil.

Burada bir çok kısaltılmış kod örneği var:

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

IE ve yeni siparişinin ikinci başlatarak Chrome işlevi karşılaştı iken bana gibi, FF sayfası için gerekli kaynaklara herhangi bir yeni istekleri yapmadan önce tüm bir sayfa yanıt bekler olduğunu göründüğü gibi. Bu nedenle, bu hata temelde bir yarış durumu aşağı kaynar.

Herkes bu gerçekten çalıştığını yolu olduğunu teyit edebilir? Ve eğer öyleyse - nasıl etrafında çalışmak istiyorsunuz?

2 Cevap

Edit: sorunuzun güncellemesinden sonra, o zaman sana bir yarış durumu alıyorsanız şaşırmadım. Firefox'ta çalışıyor, neden bilmiyorum, ama IE ve Chrome kesinlikle erken kaynaklarını isteyerek yasadışı bir şey yapmıyorlar. Bu çözmek için tek bir yol çıktı tamponlama ile. Index.php dosyasının en üstünde, ekleyebilirsiniz:

ob_start('ob_gzhandler');

Bu, bir taşla iki kuş, öldürür: a) çıkış tamponlu olduğundan emin, bu yüzden tüm sayfayı üretilen kadar tarayıcı dosyayı görmüyor; ve b) gzip sıkıştırmasını kullanarak sizin ve kullanıcıların bant genişliği tasarrufu.


Previous answer: Bu mantıklı görünmüyor. Çerezler sadece herhangi bir sayfa içeriği yüklenmeden önce olur başlığında, ayarlanabilir. Yani tarayıcı index.php ister ve PHPSESSID çerez başlığında yer almaktadır. Sonra sayfa içeriği teslim edilir.

Ben şu anda PHP ile bir makine erişimi yok, ama şu senin teoriyi test etmek için yardımcı olabilir. test1.php bir oturum değişkeni ayarlar, ancak daha sonra tamamen yüklenmesini tamamlamak için 30 saniye sürer. Bu arada, test2.php (Bir CSS dosyası) metin rengi gibi bu oturum değişkeni kullanmaya çalışacağız. Oturum test2 veya siyah (varsayılan renk) okuma olabilir eğer metin kırmızı aksi gösterecektir.

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

Sonunda bu düzeltmek için gerekli ne anladım. Yeni başlayanlar için, Kip önerilen çözüm ise aslında benim sorunum olduğunu söyledi ne gibi sorunuma çözüm değildi, doğru değildi aslında benim sorun ... daha fazla veya daha az.

Ben yapıyordu testlerden birinde, ben Sessionıd sayfası ve kaynak dosyası için farklı olduğunu aniden fark ettim. Ben sayfasına dahil başka bir bileşen, ben (session_regenerate_id()) CSRF saldırıları önlemek için Sessionıd yeniden hatırladı kadar, nasıl mümkün olduğunu hiç bir fikrim yoktu. Ben bu çizginin üzerinden yorumladı sonra, her şeyi, her tarayıcıda mükemmel çalıştı.

Benim için ancak, bu neden () oturum verileri koruyarak session_regenerate_id olmayan yeni bir soru ... yükseltir?

Edit - Follow up: It seems that this is actually a known issue and is well documented in the comments on the PHP docs page for session_regenerate_id().

Buradan başlayın: http://www.php.net/manual/en/function.session-regenerate-id.php#81212 ve okumak.