Ich versuche, die Zwischenspeicherung zu verhindern, indem ich ein '? t=' an das Ende meiner JS-Dateien anhänge. Was ist der schnellste Weg, eine solche Zahl zu erhalten? time() oder rand() oder etwas anderes?
Antworten
Zu viele Anzeigen?Time() und mt_rand() sind sich in Bezug auf ihre Effizienz in PHP ziemlich ähnlich - je nachdem, wofür Sie sie brauchen, wählen Sie die eine oder andere Methode:
- Nur schwer zu erraten: mt_rand() verwenden (z. B. beim Erzeugen von Salt)
- Eine eindeutige Kennung erhalten, die schwer zu erraten ist: mt_rand(1, 931415926536); (z. B. Erzeugung einer Sitzungs-ID)
- (natürlich) Aufzeichnungen machen: time() verwenden (z. B. Zwischenspeicherung, Protokolle usw. verhindern)
Wenn Sie es wirklich wissen wollen, ist time() leicht schneller, aber Sie brauchen sich wirklich keine Sorgen zu machen. (Es ist der Unterschied zwischen einem oder zwei kleinen Teilen einer Sekunde.)
(mt_rand() ist etwa 4-mal so schnell wie rand())
Sie wissen das wahrscheinlich schon, aber stellen Sie sicher, dass Sie immer ein Profil Ihres Codes erstellen, bevor Sie Optimierungen vornehmen; oft läuft er aus ganz anderen Gründen langsam als erwartet.
Nennen Sie mich altmodisch, aber das Verhindern des Zwischenspeicherns ist etwas, das durch die Verwendung von HTTP-Headern und nicht von eindeutigen URLs erreicht werden kann und sollte. Wenn Sie die Datei dynamisch über PHP bereitstellen:
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
Andernfalls verwenden Sie eine .htaccess-Datei im Apache (oder eine ähnliche Konfiguration in jedem anderen Webserver):
<FilesMatch "\.js$">
Header set Cache-Control "no-cache, must-revalidate"
Header set Expires "Sat, 26 Jul 1997 05:00:00 GMT"
</FilesMatch>
Verwenden Sie nicht rand()
verwenden mt_rand()
.
Er verwendet einen Zufallszahlengenerator mit bekannten Eigenschaften unter Verwendung der Mersenne-Twister die Zufallszahlen erzeugen wird viermal schneller als das, was die durchschnittliche libc rand() bietet.
- See previous answers
- Weitere Antworten anzeigen
0 Stimmen
Am schnellsten bedeutet am wenigsten ressourcenintensiv.
8 Stimmen
Warum sind Sie so besorgt über die Geschwindigkeit bei dieser speziellen Operation? Haben Sie ein Profil erstellt? Wie viel Zeit erwarten Sie zu sparen, wenn Sie das eine dem anderen vorziehen? ...erlauben Sie mir, etwas direkter zu sein: Es macht keinen bedeutenden Unterschied. Wir reden hier von einem Unterschied, der in Nanosekunden gemessen wird.
2 Stimmen
@Frank Farmer: Es macht immer noch Spaß, darüber zu reden :)
0 Stimmen
22 Millionen Seitenaufrufe pro Tag, jeder mit 6 nicht zwischenspeicherbaren Dateien. Selbst Nanosekunden machen also irgendwann einen Unterschied
3 Stimmen
6 * 22 Millionen * 10 Nanosekunden = 1,32 Sekunden. Das ist nicht viel, wenn man es auf einen Tag umrechnet.
1 Stimmen
@Shrapnel Ich stimme zu, dass er schlecht mit Zahlen umgehen kann, aber ich stimme nicht zu, die Frage ist nicht dumm. Und ich sehe keinen Grund, so persönlich zu werden.
1 Stimmen
Beachten Sie, dass diese Funktionen unterschiedliche Eigenschaften erfüllen:
time
gibt "eindeutige" Werte zurück, währendrand
gibt zufällige Werte zurück. Aber Einzigartigkeit ist nicht dasselbe wie Zufälligkeit.1 Stimmen
Es sieht so aus, als ob für den Fragesteller die Einzigartigkeit das oberste Ziel ist.
0 Stimmen
Wenn Sie sichergehen wollen, dass die zwischengespeicherte Version korrekt ist, können Sie anstelle eines Zufallswertes einen Hash an das Ende anhängen. Es macht normalerweise keinen Sinn, eine Datei mit identischem Inhalt zu liefern, wenn sie zwischengespeichert wurde.