PHP - JavaScript idő szinkronizáció
Sziasztok
Nagyon kezdő vagyok, de már napok, sőt hetek óta böngészem a netet. Egy olyan problémám van, hogy php-ben lekérem a szerver időt, és alapban 20 másodperces késéssel jelenik meg, utána meg folyamatosan el kezd késni( 1 óra alatt 10-15 percet téved). Egy általános scriptet használok. Ez alapból 20 másodpercet késik, ami később több lesz. A site-on olyan megoldás kellene számomra, ami a szerver időt mutatja, és azt frissíti időnként. Nagyon sokféle dolgot írtak a neten erről,(csak mivel írtam hogy kezdő vagyok) nekem kínai... Kérlek segítsetek ebben...
■ Nagyon kezdő vagyok, de már napok, sőt hetek óta böngészem a netet. Egy olyan problémám van, hogy php-ben lekérem a szerver időt, és alapban 20 másodperces késéssel jelenik meg, utána meg folyamatosan el kezd késni( 1 óra alatt 10-15 percet téved). Egy általános scriptet használok. Ez alapból 20 másodpercet késik, ami később több lesz. A site-on olyan megoldás kellene számomra, ami a szerver időt mutatja, és azt frissíti időnként. Nagyon sokféle dolgot írtak a neten erről,(csak mivel írtam hogy kezdő vagyok) nekem kínai... Kérlek segítsetek ebben...
<script type="text/javascript">
// Current Server Time script (SSI or PHP)- By JavaScriptKit.com (http://www.javascriptkit.com)
// For this and over 400+ free scripts, visit JavaScript Kit- http://www.javascriptkit.com/
// This notice must stay intact for use.
//Depending on whether your page supports SSI (.shtml) or PHP (.php), UNCOMMENT the line below your page supports and COMMENT the one it does not:
//Default is that SSI method is uncommented, and PHP is commented:
//var currenttime = '<!--#config timefmt="%B %d, %Y %H:%M:%S"--><!--#echo var="DATE_LOCAL" -->' //SSI method of getting server date
var currenttime = '<?php echo date("F d, Y, H:i:s", time())?>' //PHP method of getting server date
///////////Stop editting here/////////////////////////////////
var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec")
var serverdate=new Date(currenttime)
function padlength(what){
var output=(what.toString().length==1)? "0"+what : what
return output
}
function displaytime(){
serverdate.setSeconds(serverdate.getSeconds()+1)
var datestring=montharray[serverdate.getMonth()]+" "+padlength(serverdate.getDate())+", "+serverdate.getFullYear()
var timestring=padlength(serverdate.getHours())+":"+padlength(serverdate.getMinutes())+":"+padlength(serverdate.getSeconds())
document.getElementById("servertime").innerHTML=datestring+" "+timestring
}
window.onload=function(){
setInterval("displaytime()", 1000)
}
</script>
<span id="servertime"></span>
Probléma
setInterval
futásban kérdezd le a kliens idejét, add hozzá a különbséget, majd ezt az új időt mutasd meg.Mivel a pontos időt a kliensen kérdezed le a szervertől, viszont a szervernek időbe tart mire visszaadja a választ, valamint a kliensnek is, hogy feldolgozza, ezért az idő semmiképp se nevezhető majd pontosnak, legalább pár tizedmásodperc, ha nem pár másodperc különbség mindenképpen lesz.
Zónaidő?
A kliensen pedig beállítja ugyanazt a zónát, elvileg mindkét gép "órája" ugyanonnét frissül időnként, így elkerülhetők az átviteli időkülönbségek.
JS-ben gondolom meg lehet oldani, hogy nem az egész böngésző, csak az adott szkript / oldal időzónáját állítja a szerverére. Mondjuk egyetlen Date() objektumét.
Persze ilyenkor is kérdés, hogy a kliens órája milyen sűrűn "pontosít".
JS-ben gondolom meg lehet
JS-ben semminek nem tudod megadni az időzónáját, maximum lekérdezni tudod, hogy a kliensen mi van beállítva. Az, hogy mennyire pontos időt állított be a felhasználó az operációs rendszerén, és hogy azt mikor szinkronizálja (mondjuk soha), arról neked fogalmad sincs, maximum le tudod kérdezni a felhasználó gépén levő időt és össze tudod hasonlítani egy publikus időszerverrel (NTP).
Akkor rosszul gondoltam
Gagyi js.
mint említettem...
Próbáld meg
Az lesz a jó, amit javasolt: leküldöd a szerverét, rögtön lekéred a helyit, egy kivonás a különbségért, és ezt mindig utána hozzáadod a helyihez, mikor kell. Meg tudod csinálni, kezdj neki, lássuk a kódot! Ha hiba lesz benne, segítünk.
Mivel én is kezdő vagyok izgatott a téma
$most_az_ido_70_ota_in_sec = time();
$emberiora = date('H',$most_az_ido_70_ota_in_sec);
$emberiperc = date('i',$most_az_ido_70_ota_in_sec);
$emberisec= date('s',$most_az_ido_70_ota_in_sec);
echo(" <script type=\"text/javascript\" language=\"javascript\"> ");
echo ("var jshour = ").("$emberiora;");
echo ("var jsmin = ").("$emberiperc;");
echo ("var jssec = ").("$emberisec;");
echo ('
function szamolj()
{
if(jssec == 59)
{
jssec =-1;
jsmin++;
}
if(jsmin == 59)
{
jsmin = -1;
jshour++;
}
jssec++;
document.getElementById(\'clockbox\').innerHTML=" "+jshour+":"+jsmin+":"+jssec+" ";
setTimeout("szamolj()", 1000);
}
window.onload=szamolj;
</script>
');
echo ("<div id=\"clockbox\">hol</div>");
?>
Az igaz, hogy tíz alatt egyszámjegyet ad, de jó az így is.
A szerver time kiirva onnan óra számol, meg ott van js változóban is.
Ja bocs ...
Talán így már teljes ....
$most_az_ido_70_ota_in_sec = time();
$emberiora = date('H',$most_az_ido_70_ota_in_sec);
$emberiperc = date('i',$most_az_ido_70_ota_in_sec);
$emberisec= date('s',$most_az_ido_70_ota_in_sec);
echo(" <script type=\"text/javascript\" language=\"javascript\"> ");
echo ("var jshour = ").("$emberiora;");
echo ("var jsmin = ").("$emberiperc;");
echo ("var jssec = ").("$emberisec;");
echo ('
function szamolj()
{
if(jssec == 59){jssec =-1;jsmin++;}
if(jsmin == 59){jsmin = -1;jshour++;}
jssec++;
if(jssec<10){jssec = "0"+jssec;}
if(jsmin<10){jsmin = "0"+jsmin;}
if(jshour<10){jshour = "0"+jshour;}
if(jshour == 24){jshour =0;}
document.getElementById(\'clockbox\').innerHTML=" "+jshour+":"+jsmin+":"+jssec+" ";
setTimeout("szamolj()", 1000);
}
window.onload=szamolj;
</script>
');
echo ("<div id=\"clockbox\"></div>");
?>
Minden oldalletöltésnél frissíti a szerverről az aktuális időt, és kiirja js-el.
Erre gondoltál ???
Még volt benne egy kis hiba - Ez a hibátlan
$most_az_ido_70_ota_in_sec = time();
$emberiora = date('H',$most_az_ido_70_ota_in_sec);
$emberiperc = date('i',$most_az_ido_70_ota_in_sec);
$emberisec= date('s',$most_az_ido_70_ota_in_sec);
echo(" <script type=\"text/javascript\" language=\"javascript\"> ");
echo ("var jshour = ").("$emberiora;");
echo ("var jsmin = ").("$emberiperc;");
echo ("var jssec = ").("$emberisec;");
echo ('
function szamolj()
{
if(jshour == 24){jshour =0;}
if(jssec == 59){jssec =-1;jsmin++;}
if(jsmin == 59){jsmin = -1;jshour++;}
jssec++;
if(jssec<10){jssec = "0"+jssec;}
if(jsmin<10){jsmin = "0"+jsmin;}
if(jshour<10){jshour = "0"+jshour;}
document.getElementById(\'clockbox\').innerHTML=" "+jshour+":"+jsmin+":"+jssec+" ";
setTimeout("szamolj()", 1000);
}
window.onload=szamolj;
</script>
');
echo ("<div id=\"clockbox\"></div>");
?>
Bocsi, de ez teljesen mellőzi
Azt vegyétek figyelembe, hogy a
setTimeout("szamolj()", 1000);
lehet, hogy legközelebb 900 vagy 1100 msec múlva fog futni... Úgy elcsúszik így az idő, mint a huzat.Helyette a
Date()
objektummal kell időt kezelni, első futáskor pedig egy különbséget számolni a szerverhez képest, ezzel a különbséggel kell a helyi időt kezelni. Teljesen felesleges ilyen string-bűvészkedésbe menni, ha van rá megfelelő objektum, megfelelő metódusokkal.Most légyszíves mindketten tanulmányozzátok a
Date()
(js) objektumot!Best practices
setTimeout()
függvényében sose használj első paraméterként stringet. Ilyenkor ugyanis, ha nem is tudsz róla, egyeval()
-t hívsz. Ez lényegesen lassabb, valamint potenciálisan veszélyes is lehet. Mindig függvényt adj át helyette, például:setInterval()
-ra, aFunction()
konstruktorra és magára azeval()
-ra is.window.onload
és társait, ez az eseménykezelő modell már rég elavult. A szkriptjeid folyton össze fognak így akadni, mert mindegyik egyedül akarja majd bitorolni az adott esemény kezelését. Mielőbb szokj rá az addEventListener() használatára.Remélem segítettem. Mindez nem a te hibád, egy kezdő rengeteg pocsék minőségű, rég elavult, összetákolt kóddal szembesül tanulmányai során, sok ezek közül egyenesen tananyagnak álcázza magát. Ha már tanulsz, érdemes rögtön a jó gyakorlatokat megtanulni, és elfelejteni ezeket a szörnyűségeket, sok időt és fájdalmat megspórolhatsz vele :).
Én szurkolok.
+1
Lehet róla szó? Mert ez is olyan téma, amit különben lehet eldugott fórumkommentből linkelgetni, de én nem könyvjelzőzök magamnak annyit, viszont tényleg sok alapot leírtál.
Nem tudom, hogy ez cikként
Gondolkoztam rajta, hogy indítok valami blogszerűséget, ahol ilyen random 1-2 bekezdéses tanácsok is lennének, mint ezek. De ha egyszer rászánom magam (ha egyáltalán), asszem akkor már inkább angolul írnám.
Azt is tervezgetem egy ideje, amióta Gábor felvetette, hogy írok kezdőknek Javascriptes sorozatot ide a Weblaborra, de erre most épp nincs kapacitásom.
Ha van bármi konkrét ötlet, hogy lehetne a jövőre nézve hasznosítani a bejegyzést, bármiben benne vagyok, a szöveg szabadon felhasználható/kiegészíthető.
JS sorozat
Ehhez mit szólsz? Js-t legfeljebb átnézni vállalom, most nekem sincs úgy időm - és annyira nem tartom magam sem tájékozottnak, én inkább kérdezek js-ben, mint mondok. Vagy bújok manual-t, ami viszont elavult is lehet... (Jó, a szarvashibákat tudom, de nem sokkal többet.)
Nem ígérek semmit, de az
Saját blogot mindenképp angolul írnék, ha írnék. Egyszerű, több emberhez juthat el, így több embernek segíthet. A szakmánk nyelve az angol - aki nem beszéli, és webprogramozó szeretne lenni, előbb az angolt kell megtanulnia, anélkül semmi esélye.
Akkor pihen
Ja, és a WL is magyar, nekem ez a szakmai fórum, az a kedvenc, ami itt jelenik meg. És van is szűrve rendesen, próbáld csak ki "Főszerkesztő Urat"! :) Emiatt viszont színvonalasak a cikkek.
A szakmánk nyelve az angol -
Sorry, I don't fully understand English! ;-(
Gondolkoztam rajta, hogy
Mit gondolsz az itteni blog mire való? (no offense)
Isten vagy
Megfogadom őket.
Erről az addEventListener() -ről
meg a tömbberakásnak erről a módjáról nem is hallottam.
Nagyon köszi !!!
Az addEventListener()-nél
Ha valami könyvtárat használsz DOM-kezelésre, például jQuery-t, az alapból áthidalja ezeket a különbségeket (kivéve ha a jQuery 2.x vonalat használod, mert az már nem törődik az IE8-al, az 1.x vonal viszi tovább az oldtimerek támogatását).
Fél off
Hát erről is lehetne hosszan
Annó írogattam a saját kis függvényeimet egy functions.js-be, persze kis részét se értettem, mi is az a Javascript, de büszke voltam rá nagyon, a jQuery-t meg gyűlöltem, pedig sose használtam. Aztán egyszer valamiért mégis kipróbáltam (asszem akkoriban ráadásul épp újraírtak csomó dolgot benne), az akkori szintemen új dimenziókat nyitott meg, rácsodálkozás volt. Kitanultam alaposan, és egyre inkább érdekelt, mit hogy csinálnak, illetve miért. Érdekes módon tehát nálam pont fordítva volt tehát, a jQuery-től visszafelé indulva kezdtem elmélyedni magában a Javascriptben (nemcsak a DOM függvényekben, hanem magában a nyelvben is), aztán rá is kattantam egy idő után.
Én is így voltam, csak a
Nézd meg
Inkabb ne
Nem akarom a fent emlitett szerzot bantani, de az inline esemenykezelok es javascript kod, document.write stb. azert hagynak kivanni valot maguk utan, fontos reszek mindemellett meg nincsenek is benne (pl. prototipusos oroklodes).
A Good Partsot én is nagy
Nagy Gusztáv jegyzeteiben sose jutottam el a Javascriptig, de ha tényleg ilyesmiket használ, akkor valóban nem javasolt. Ezekről jobb ha csak akkor hall az ember, ha már legalább jó közepes szinten van.
Elég ritka helyzet, amikor