Temat: Co musi umieć programista php?
Z moich doświadczeń wynika, że praktycznie w ~99% przypadków żądania są ładowane w takiej kolejności, w jakiej zostały wysłane, ponieważ z reguły odbiera się dane o podobnym rozmiarze, które są wczytywane w podobnym czasie. Na kolejność odbierania żądań ma wpływ przede wszystkim czas oczekiwania i ilość ładowanych danych. W Twoim eksperymencie manipulujesz czasem oczekiwania i tam zmiany powinny być widoczne. Możliwe, że ich nie widać, ze względu na zbyt podobny czas oczekiwania.
Zrobiłem podobny eksperyment, tylko skorzystałem z jQuery i wygenerowałem większe rozbieżności w czasie ładowania danych:
plik: test.html
<!DOCTYPE html>
<html lang="pl">
<head>
<title>Test</title>
<meta charset="utf-8" />
<script src="jquery-1.4.4.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
for(var i = 0; i < 100; i++)
{
$.get('load.php?id=' + i, function(data) {
$('#result').append(data);
});
}
});
</script>
</head>
<body>
<div id="result"></div>
</body>
</html>
plik: load.php
<?php
sleep(3);
echo 'load.php?id='.$_GET['id'].'<br/>';
for($i = 0; $i < 5; $i++)
{
sleep(rand(0,10));
}
?>
Tutaj wyraźnie widać, że dane są ładowane nie po kolei. Gdy usuniemy pętlę z pliku load.php, dane prawie zawsze będą ładowane w kolejności wysyłania. Możliwe, że jedynie ok. 1% tych wszystkich żądań załaduje się z innej kolejności, co potwierdza moją wcześniejszą teorię.
Test wykonywałem w firefoksie i nie grzebałem w żadnych ustawieniach przeglądarki.
Możemy też zrobić inny eksperyment, w którym będziemy manipulować ilością ładowanych danych oraz czasem oczekiwania.
plik: load.php
<?php
sleep(3);
echo 'load.php?id='.$_GET['id'].'<br/>';
$array = array('http://onet.pl','http://goldenline.pl','http://wp.pl','http://localhost');
for($i = 0; $i < 5; $i++)
{
file_get_contents($array[rand(0,3)]);
}
?>
plik: test.html
j.w.
Tutaj też widać wyraźne rozbieżności.
Generalnie, w tego typu podejściu nie mamy wpływu na to, co załaduje się w pierwszej kolejności, gdyż dane są ładowane asynchronicznie.
Jeśli chcemy wyeliminować ten efekt, możemy synchronizować żądania, o czym już wcześniej pisałem. Można to zrobić m.in. za pomocą pluginu dla jQuery o nazwie AjaxQueue:
http://docs.jquery.com/AjaxQueue
ps. Ta rozmowa odbiega trochę od tematu wątku, ale przynajmniej jest ciekawa ;-).