2010-06-01 3 views
6

Ein wesentlicher Nachteil von CSS ist, dass man keine Variablen verwenden kann. Ich möchte zum Beispiel Variablen verwenden, um den Speicherort von importiertem CSS zu steuern, und es wäre toll, Variablen für Farben zu erstellen, die in einem Design wiederholt verwendet werden.Was sind die Nachteile der Verwendung von PHP zum Erstellen von Variablen in meinem CSS-Stylesheet?

Ein Ansatz besteht darin, eine PHP-Datei für das CSS-Stylesheet zu verwenden. Mit anderen Worten, erstellen Sie ein "style.php" mit ...

<?php header("Content-type: text/css"); ?>

... am Anfang der Datei, und verknüpft es mit ...

<link href="style.php" rel="stylesheet" type="text/css" />

... in jeder Datei, die diese Stile verwendet.

Also, was ist der Haken? Ich denke, es könnte Leistung sein - ich habe ein paar schnelle Experimente in Firefox/Firebug gemacht und wie man erwarten würde, ist das CSS-Stylesheet zwischengespeichert, aber das PHP-Stylesheet ist nicht. Also zahlen wir den Preis für ein zusätzliches GET.

Die andere lästige Sache ist, dass TextMate Syntax für CSS in einer .php-Datei nicht richtig hervorhebt.

Gibt es andere Nachteile? Haben Sie diesen Ansatz verwendet, und wenn ja, würden Sie ihn empfehlen?

+1

Sie könnten den Header 'Last-Modified:' im PHP-Skript festlegen und den Browser wissen lassen, dass er nicht erneut geladen werden muss. (Es sei denn natürlich, es tut) – amphetamachine

Antwort

7

Leistung ist es ziemlich viel. Es ist eine gute Idee, aber nur, wenn Sie es zwischenspeichern. Sie können Browser-Header senden, um den Client aufzufordern, ihn zu cachen, aber wenn die Leistung ein Problem ist, können Sie davon profitieren, ein System zu entwickeln, mit dem Sie Ihre PHP-fähigen Stylesheets zu normalen CSS-Dateien kompilieren.

Wenn Sie Ihre eigenen Compilation-System von Hand zu rollen, können Sie stattdessen in SASS suchen.

+1

Caching der PHP-Ausgabe auf dem Server ist sowieso keine schlechte Idee, weil Sie zusätzliche Optimierungen wie Chain Stylesheets zusammen durchführen und die Datei gzip/minimieren können. –

+0

Was ist mit nur in eine CSS-Datei schreiben, dann diese Datei einbeziehen? Und haben Sie die Datei nur bei Updates neu geschrieben? –

1

Der Nachteil ist, dass die Datei nicht zwischengespeichert wird (wie Sie darauf hingewiesen haben) sowie die Tatsache, dass der Server die CSS-Datei für jede Anfrage berechnen muss.

Laden der statischen Datei ist ziemlich keine Belastung für den Server, da es nur liest und die Datei ablegt, aber für das PHP-Skript muss es für jede Seitenanforderung ausführen, die zusätzlichen Overhead hinzufügen könnte.

Sie könnten möglicherweise die CSS im Speicher oder Memcache oder so etwas, aber das ist immer noch nicht eine effiziente als nur mit einer statischen Datei.

Warum nicht die Mehrheit Ihrer CSS in einer statischen Datei definieren und dann nur die spezifischen Stile überschreiben, die sich ändern?

+0

Danke webdestroya. Ich mache tatsächlich die "Mehrheit Ihres CSS in einer statischen Datei und überschreibe dann nur die spezifischen Stile, die sich ändern", aber es wäre immer noch viel bequemer/effizienter (& DRY), bestimmte Farben und Stile an einer Stelle anzugeben und Lassen Sie sie durch das Design sickern. – Greg

2

Sie sollten weiterhin die entsprechenden HTTP-Header festlegen können, um den Browser anzuweisen, das dynamisch generierte CSS zwischenzuspeichern. Sie können bei der Prüfung der folgenden Google-Code Artikel für weiterführende Literatur zum Thema interessieren:

Sie auch in Erwägung ziehen könnten Erzeugen eine statische CSS-Datei von Ihrem Skript, und dann schließen, dass aus Ihr Webdokument. Dies eliminiert die Echtzeit-Vorverarbeitung und damit zusammenhängende Performance-Probleme, wobei die CSS-Dateien bei jeder Änderung "kompiliert" werden müssen.Wenn Sie jedoch bereits minifying CSS oder JavaScript verwenden, können Sie diesen zusätzlichen Schritt einfach zu Ihrem Build-Prozess hinzufügen.

Wie bei der Code-Hervorhebung möchten Sie möglicherweise normale CSS-Dateien mit Variablen anstelle von fest codierten Konstanten verwenden. Dann kann Ihr PHP-Präprozessor die CSS-Datei laden und ersetzt die Variablen für die tatsächlichen Werte.

+0

Auf der einen Seite ist es eine gute Antwort, auf der anderen Seite verwendet es das Wort "Hebelwirkung". Dennoch, upvote: p – Artefacto

+0

Daniel, danke, aber ich bekomme diesen Teil nicht ... "Sie können normale CSS-Dateien mit Variablen in ihnen anstelle von fest codierten Konstanten verwenden". Meinst du, geben Sie der Datei eine CSS-Erweiterung? Ich dachte nicht, dass der Präprozessor in diesem Fall aufgerufen würde. Ich muss etwas verpassen. – Greg

+0

@Greg: Sie könnten es eine CSS-Erweiterung geben, und dann könnten Sie den Präprozessor mit etwas wie 'style.php? File = mystyles.css' aufrufen. Der Präprozessor kann dann die Datei aus dem Dateisystem laden und verarbeiten. –

0

Nicht genau eine Antwort, aber eine Ergänzung zu @Matchu Antwort.
Hier ist ein Code Sni [et ich vor einigen Jahren verwendet, Sie können von diesem als Basis starten, um Ihre eigene Methode der clientseitigen Caching-Regeln zu entwickeln. Jeder, der das Gefühl hat, dass er das verbessern kann, sei willkommen.

<?php 

//functions to cache HTML output Or JS/CSS output from a PHP script 

class ControlHtmlCache 

{ 

    //Will cache output of a php script on the browser for the giver hours. 

    //Do notice, this will not cahce from now until now+hours, but rather for a rounded time period in the time stamp 

    //For example, If I send 4 it will refresh the cache at approx 3,7,11,15,19,23 (In the summer, it will be 4,8,12....) 

    static function client_side_cache($hours) 

    { 

     //in the event a session start is used, I have to clean all the #$%# headers it sends to prevent caching 

     header('Cache-Control: ',true); 

     header("Pragma: ", true); 

     header("Expires: ", true); 



     //get the If-Modified-Since header in a unix time format 

     $headers = getallheaders(); 

     if (isset($headers['If-Modified-Since'])) 

     { 

      $modifiedSince = explode(';', $headers['If-Modified-Since']); 

      $modifiedSince = strtotime($modifiedSince[0]); 

     } 

     else 

     { 

      $modifiedSince = 0; 

     } 



     //calculate the Last-Modified timestamp 

     $current_time=time(); 

     $last_modified=($current_time)/($hours*3600); 

     $last_modified=(int)$last_modified; 

     $last_modified=$last_modified*$hours*3600; 



     //check cache not expires 

     if ($last_modified <= $modifiedSince) 

     { 

      header('HTTP/1.1 304 Not Modified'); 

      exit(); 

     } 

     else //emit a new Last-Modified (either cache expired or page wasn'r cached 

     { 

      Header('Last-Modified: '.gmdate("D, d M Y H:i:s",$last_modified).' GMT '); 

     } 

    } 

}//EOF class 
Verwandte Themen