Welche Vorteile hat es, wenn Sie Ihr Javascript in eine .php-Datei einfügen?

8

Ich stoße gelegentlich auf Seiten, wo Javascript über eine PHP-Datei eingebunden ist:

%Vor%

Der Inhalt von fake_js.php könnte etwa so aussehen:

%Vor%

Was sind die Vorteile (oder Nachteile) für die Aufnahme von Javascript?

    
Mark Biek 15.06.2009, 19:17
quelle

7 Antworten

13

Es macht es einfach, Javascript-Variablen vom Server aus einzustellen.

%Vor%

Ich habe normalerweise eine PHP / Javascript-Datei in meinen Projekten, die ich benutze, um alle Variablen zu definieren, die in Javascript verwendet werden müssen. Auf diese Weise kann ich einfach in Javascript auf Konstanten zugreifen, die auf der Serverseite verwendet werden (CSS-Farben, nicht-sensitive Site-Eigenschaften usw.).

Bearbeiten: Hier ist zum Beispiel eine Kopie meiner config.js.php Datei aus dem Projekt, an dem ich gerade arbeite.

%Vor%     
tj111 15.06.2009, 19:22
quelle
8

Wenn Sie es nicht brauchen, verwenden Sie es nicht:

  

Das erste, was du behalten musst   Geist ist YAGNI . Du kommst nicht   Brauchen Sie es. Bis zu einem bestimmten Merkmal,   Prinzip oder Richtlinie wird nützlich   und relevant, benutze es nicht.

Nachteile:

  • Zusätzliche Komplexität
  • Langsamer als statische Dateien.
  • Caching-Probleme (Serverseite)
  • Skalierbarkeitsprobleme (Load Balancer laden statische Dateien von den schweren PHP / Apache-Prozessen ab)

Vorteile:

  • Benutzerspezifisches JavaScript - Kann durch Initialisierung mit den richtigen Variablen / Parametern im Abschnitt <head> </head> des HTML
  • erreicht werden
  • Seitenspezifisches JavaScript - JS könnte auch verallgemeinert werden, um Parameter
  • zu verwenden
  • JSON wurde aus der Datenbank erstellt (normalerweise über AJAX angefordert)

Wenn das JavaScript nicht wirklich eindeutig ist (z. B. JSON, Parameter / Variablen), gewinnen Sie nicht viel. Aber in jedem Fall sollten Sie die Menge an JS minimieren, die auf der Serverseite generiert wird, und die Menge an Code in den statischen Dateien maximieren. Vergessen Sie nicht, dass, wenn es dynamisch ist, es immer wieder neu generiert / heruntergeladen werden muss, so dass es nicht für einen schweren Prozess ist.

Auch:

  • Dies könnte auch verwendet werden, um den Umfang der Serverkonfiguration zu minimieren (z. B. wenn der Webserver file.js nicht mit dem richtigen Inhaltstyp versorgt)
hannson 15.06.2009 19:57
quelle
1

Es gibt keinen Vorteil für das Beispiel, das Sie oben angegeben haben (abgesehen von speziellen Einsatzszenarien, in denen Sie Zugriff auf .php-Dateien und nicht auf .js-Dateien haben, die verrückt wären, aber nicht unbekannt sind).

Mit diesem Ansatz können Sie JS über den php-Parser übergeben. Das bedeutet, dass Sie Ihren JS dynamisch basierend auf Servervariablen generieren können.

    
Dan Davies Brackett 15.06.2009 19:21
quelle
1

Stimmen Sie mit tj111 überein. Abgesehen von dem, was ich erwähnte, fand ich auch php-generierte Javascripts eine großartige Waffe gegen die Caching-Tricks des Browsers. Vor nicht allzu langer Zeit verfluchte ich das ganze Javascript, weil es ständig vom Browser zwischengespeichert wurde. Das Aktualisieren der Seite half mir nicht, musste den gesamten Cache löschen, um den Browser zum erneuten Laden der Javascript-Dateien zu zwingen. Sobald ich eine PHP-Wand vor meinen Javascripts gebaut habe:

fake_js.php:

%Vor%

Ein frisches neues JavaScript würde immer auf der Client-Seite erscheinen. Allerdings ist dieser Ansatz offensichtlich nur in der Entwicklungsphase gut, wenn es dem Entwickler einiges Kopfzerbrechen bereiten kann, das richtige JavaScript im Browser geladen zu haben. Natürlich ist die Strafe beim wiederholten Laden der gleichen Datei nicht so groß, wenn man sich mit localhost verbindet.

In einer Live-Web-Anwendung / Site ist clientseitiges Caching willkommen, um den Netzwerkverkehr und die gesamte Serverlast zu reduzieren.

    
Peter Perháč 15.06.2009 20:12
quelle
0

Vorteil (nicht PHP-spezifisch - ich benutzte diese Technik in EmbPerl und JSP) wäre die Fähigkeit, den JavaScript-Code auf der Serverseite dynamisch zu generieren oder zu optimieren / anzupassen.

Eine Beispielverwendung wäre die Auffüllung eines Arrays basierend auf dem Inhalt einer DB-Tabelle. Oder Anwendung von Lokalisierungstechniken.

    
DVK 15.06.2009 19:26
quelle
0

Wenn Sie keinen vollen Serverzugriff haben und die gzip-Codierung nicht einschalten können, ist es sehr nützlich, folgendes in Ihre Javascript-Datei zu schreiben (Anmerkung: muss in file.js.php umbenannt oder als PHP geparst werden) durch .htaccess Direktive):

%Vor%

Sie können es auch anstelle von servergesteuerten Lösungen für eine bessere Cache-Steuerung, Besucherverfolgung usw. verwenden.

    
DisgruntledGoat 15.06.2009 20:47
quelle
-1

Absolut keine, IMHO. Ich benutze ein js-Framework, das ich geschrieben habe, um die Einstellung aller serverseitigen Variablen zu handhaben, auf die ich zugreifen muss. Es ist im Wesentlichen dasselbe wie das Einbetten von PHP in JavaScript, aber viel weniger mehrdeutig. Mit dieser Methode können Sie auch serverseitige Logik und HTML von Javascript vollständig trennen. Dies führt zu viel saubereren, besser organisierten und wenig gekoppelten modularen Code.

Sie könnten so etwas in Ihrem HTML tun:

%Vor%

Und dann mache so etwas in deiner js:

%Vor%     
Tres 16.06.2009 05:02
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ answer1058601 ___

Nein, es ist nicht ineffizient, viele %code% -Objekte zu erstellen und jedes einzelne zu schließen, wenn Sie fertig sind. Das ist genau das Richtige. Lassen Sie das .NET Framework Connection Pooling seine Arbeit machen - versuchen Sie es nicht selbst. Sie müssen nichts spezielles tun, um das Verbindungspooling zu aktivieren (obwohl Sie es deaktivieren können, indem Sie %code% in Ihrer Verbindungszeichenfolge setzen).

Es gibt viele Dinge, die schief gehen könnten, wenn Sie versuchen, die Verbindung selbst zu cachen. Sag einfach nein:)

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ tag123connectionpooling ___ In der Softwareentwicklung ist ein Verbindungspool ein Cache für Verbindungen, die verwaltet werden, sodass die Verbindungen wiederverwendet werden können, wenn zukünftige Anforderungen an die Ressource erforderlich sind. ___ answer8772652 ___

In meiner jüngsten Erfahrung, wenn Sie diesen Code verwenden:

%Vor%

hat einen Fehler und schließt die Verbindung nicht explizit, sie wird nicht geschlossen oder in den Pool zurücküberprüft. Verwenden Sie also einen Catch- oder Finally-Block, um die Verbindung zu schließen

    
___ qstntxt ___

Wir haben einen Clientcode, der die SqlConnection-Klasse in .NET verwendet, um mit einer SQLServer-Datenbank zu kommunizieren. Es schlägt mit diesem Fehler zeitweise fehl:

"ExecuteReader benötigt eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist Closed"

Die "temporäre" Lösung besteht darin, den Prozess neu zu starten, danach funktioniert alles - aber das ist offensichtlich nicht zufriedenstellend.

Der Code speichert einen Cache für SqlConnection-Instanzen, einen für jede Datenbank.

Wir würden den Code gerne neu schreiben, aber bevor ich das tue, muss ich ein paar Dinge wissen:

Meine erste Frage lautet: Ist es ineffizient, SqlConnection-Objekte wiederholt zu verbinden und zu trennen, oder führt die zugrunde liegende Bibliothek das Verbindungs-Pooling für uns durch?

%Vor%

Da unser Code nicht tut, scheint die wahrscheinliche Ursache des Problems darin zu liegen, dass während der "Lebensdauer" der Verbindung, die die Verbindung verursacht, etwas mit der zugrunde liegenden SQLServer-Datenbank passiert geschlossen ...

Wenn es sich herausstellt, dass es sich lohnt, SqlConnection-Objekte zu "cachen", was ist der empfohlene Weg, um alle Fehler zu behandeln, die einfach durch "Wiederverbinden" mit der Datenbank gelöst werden können. Ich spreche über Szenarien wie:

  • Die Datenbank wird offline genommen und wieder online geschaltet, aber der Clientprozess hatte während dieses Vorgangs keine offenen Transaktionen.
  • Die Datenbank wurde "getrennt" und dann "erneut verbunden"

Ich bemerke, dass es eine "State" -Eigenschaft in SqlConnection gibt ... gibt es eine geeignete Möglichkeit, das abzufragen?

Schließlich habe ich eine Test-SQLServer-Instanz mit vollen Zugriffsrechten eingerichtet: Wie kann ich den genauen Fehler reproduzieren? "ExecuteReader benötigt eine offene und verfügbare Verbindung. Der aktuelle Status der Verbindung ist Closed"

    
___ answer1058640 ___

Sie sollten Verbindungspooling für Ihre Verbindungszeichenfolge aktivieren . In diesem Fall fügt die Laufzeitumgebung Ihre Verbindungen zum "Pool" zurück, wenn Sie sie schließen, anstatt wirklich zu disconnecting. Wenn eine 'neue' Verbindung aus dem Pool genommen wird, wird sie zurückgesetzt (dh sp_reset_connection wird aufgerufen) und dann Ihrer Anwendung als brandneue, frische Verbindung präsentiert. Der Pool behandelt solche Fälle transparent, als ob die Verbindung im Leerlauf im Pool geschlossen wäre.

Die Kosten für das Erstellen einer neuen Verbindung von Grund auf neu sind von Bedeutung, da die Authentifizierung mehrere Roundtrips zwischen Client und Server erfordert (abhängig von der Authentifizierungsmethode und SSL-Einstellungen kann es im besten Fall 1 Roundtrip vs. etwa 10 sein ).

Und um Ihre Frage zu beantworten, werfen Sie einen Blick auf die OnStateChange Ereignis, wenn sich ihr Status ändert, aber Sie sollten sich nicht darum kümmern, wenn Sie das Pooling verwenden.

    
___