2010-06-01 3 views
6

CSS의 중요한 단점은 변수를 사용할 수 없다는 것입니다. 예를 들어 변수를 사용하여 가져온 CSS의 위치를 ​​제어하고 디자인에서 반복적으로 사용되는 색상에 대한 변수를 만드는 것이 좋습니다.PHP를 사용하여 CSS 스타일 시트에 변수를 만드는 단점은 무엇입니까?

한 가지 방법은 CSS 스타일 시트에 PHP 파일을 사용하는 것입니다. ... 즉, 파일의 상단에 ...와 ...

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

는 "style.php"를 만든 다음 사용에 링크

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

... 이러한 스타일을 사용하는 모든 파일에서

그래서 무엇을 잡을 수 있습니까? 나는 그것이 성능일지도 모른다고 생각한다. 파이어 폭스/파이어 버그에서 몇 가지 빠른 실험을했고, CSS 스타일 시트가 캐시되지만 예상대로 PHP 스타일 시트는 캐시되지 않았다. 그래서 우리는 추가 GET의 가격을 지불하고 있습니다.

다른 성가신 사실은 TextMate가 .php 파일의 CSS에 대해 올바르게 강조 표시하지 않는다는 것입니다.

다른 단점이 있습니까? 이 접근 방식을 사용 했습니까? 그렇다면 권장 할만한 방법이 있습니까?

+1

PHP 스크립트에서'Last-Modified :'헤더를 설정하여 브라우저가 다시로드 될 필요가 없다는 것을 브라우저에 알릴 수 있습니다. (물론, 않는 한) – amphetamachine

답변

7

성능이 꽤 있습니다. 캐시하는 경우에만 좋은 생각입니다. 브라우저 헤더를 보내어 클라이언트에게 캐시를 넣어 주도록 요청할 수 있지만 성능에 문제가 있다면 PHP에서 사용 가능한 스타일 시트를 바닐라 CSS 파일로 컴파일하여 정상적으로 작동하는 시스템을 개발하면 도움이 될 것입니다.

자신 만의 컴파일 시스템을 신경 써야한다면, 대신 SASS을 조사하고 싶을 것입니다.

+1

체인 스타일 시트와 같은 추가 최적화를 수행하고 파일을 gzip/minify 할 수 있기 때문에 서버에 PHP 출력을 캐시하는 것은 나쁜 생각이 아닙니다. –

+0

그냥 CSS 파일에 쓰고 그 파일을 포함하면 어떨까요? 그리고 업데이트시에만 파일을 다시 작성합니까? –

1

단점은 파일이 캐시되지 않고 (지적한 것처럼) 서버가 각 요청에 대해 CSS 파일을 계산해야한다는 것입니다.

정적 파일을로드하는 것은 파일을 읽고 덤프하기 때문에 서버에 부하가 거의 없지만 PHP 스크립트의 경우 각 페이지 요청마다 실행해야하므로 추가 오버 헤드가 추가 될 수 있습니다.

CSS를 메모리 나 Memcache 또는 다른 캐시에 캐시 할 수는 있지만 여전히 정적 파일을 사용하는 것만 큼 효율적이지는 않습니다.

대다수의 CSS를 정적 파일에 정의하고 변경하는 특정 스타일을 덮어 쓰지 않는 이유는 무엇입니까?

+0

감사합니다 webdestroya. 실제로 정적 파일에서 CSS의 대다수를 수행 한 다음 변경되는 특정 스타일을 덮어 씁니다. 그러나 특정 색상과 스타일을 한 곳에서 지정하는 것이 훨씬 더 편리하고 효율적입니다 (& DRY). 그것들을 디자인을 통해 퍼 뜨리게하십시오. – Greg

2

동적으로 생성 된 CSS를 브라우저에 캐시하도록 적절한 HTTP 헤더를 설정할 수 있어야합니다. 또한 다음 스크립트에서 정적 CSS 파일을 생성하는 것을 고려하고 있었다

부터 것을 포함한다 : 당신은 주제에 대한 추가 읽기에 대한 다음 Google 코드 문서를 체크 아웃에 관심이있을 수 있습니다 귀하의 웹 문서. 이렇게하면 CSS 파일을 변경할 때마다 "컴파일"해야하는 대신 실시간 전처리 및 성능 관련 문제가 제거됩니다.그러나 이미 minifying CSS 또는 JavaScript 인 경우이 추가 단계를 빌드 프로세스에 추가하기 만하면됩니다.

코드 강조 표시의 경우 하드 코딩 된 상수 대신 변수가있는 일반 CSS 파일을 사용할 수 있습니다. 그러면 PHP 사전 처리기가 CSS 파일을로드하고 실제 값을 변수로 대체 할 수 있습니다.

+0

다른 한편으로는 "레버리지"라는 단어를 사용하는 것이 좋은 대답입니다. 아직도, upvote : p – Artefacto

+0

다니엘, 고마워,하지만이 부분을 얻지는 않을거야 ... "하드 코딩 된 상수 대신 변수가있는 일반 CSS 파일을 사용하고 싶을지도 모른다." 파일에 CSS 확장자를 지정 하시겠습니까? 이 경우 전처리 기가 호출 될 것이라고 생각하지 않았습니다. 나는 뭔가를 놓치고 있어야합니다. – Greg

+0

@ 그렉 : 당신은 CSS 확장을 줄 수 있습니다, 그리고 당신은'style.php? file = mystyles.css'와 같은 것으로 전 처리기를 부를 수 있습니다. 그러면 전처리 기는 파일 시스템에서 파일을로드하고 처리 된 파일을 제공 할 수 있습니다. –

0

정확하게 대답은 아니지만 @Matchu 응답에 추가됩니다.
여기 몇 년 전에 사용 된 코드 스 니가 있습니다. 클라이언트 측 캐싱 규칙에 대한 독자적인 방법을 개발하기 위해 기초부터 플레이를 시작할 수 있습니다. 그가 그것을 향상시킬 수 있다고 생각하는 사람은 누구나 환영합니다.

<?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 
관련 문제