diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index fdf1632d6..eb0438a68 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -2270,11 +2270,12 @@ class Context * Returns the list of javascripts that matches the given type. * * @param string $type Added position. (head:.., body:..) + * @param bool $finalize (optional) * @return array Returns javascript file list. Array contains file, targetie. */ - public static function getJsFile($type = 'head') + public static function getJsFile($type = 'head', $finalize = false) { - return self::$_instance->oFrontEndFileHandler->getJsFileList($type); + return self::$_instance->oFrontEndFileHandler->getJsFileList($type, $finalize); } /** @@ -2322,11 +2323,12 @@ class Context /** * Return a list of css files * + * @param bool $finalize (optional) * @return array Returns css file list. Array contains file, media, targetie. */ - public static function getCSSFile() + public static function getCSSFile($finalize = false) { - return self::$_instance->oFrontEndFileHandler->getCssFileList(); + return self::$_instance->oFrontEndFileHandler->getCssFileList($finalize); } /** diff --git a/classes/frontendfile/FrontEndFileHandler.class.php b/classes/frontendfile/FrontEndFileHandler.class.php index e2c69ac95..2f2c27408 100644 --- a/classes/frontendfile/FrontEndFileHandler.class.php +++ b/classes/frontendfile/FrontEndFileHandler.class.php @@ -359,9 +359,10 @@ class FrontEndFileHandler extends Handler /** * Get css file list * + * @param bool $finalize (optional) * @return array Returns css file list. Array contains file, media, targetie. */ - public function getCssFileList() + public function getCssFileList($finalize = false) { $map = &$this->cssMap; $mapIndex = &$this->cssMapIndex; @@ -370,25 +371,28 @@ class FrontEndFileHandler extends Handler $this->_sortMap($map, $mapIndex); // Minify all scripts, and compile LESS/SCSS into CSS. - foreach ($map as $indexedMap) + if ($finalize) { - foreach ($indexedMap as $file) + foreach ($map as $indexedMap) { - $minify_this_file = !$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all'); - if ($file->fileExtension === 'css') + foreach ($indexedMap as $file) { - $this->proc_CSS_JS($file, $minify_this_file); - } - else - { - $this->proc_LESS_SCSS($file, $minify_this_file); + $minify_this_file = !$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all'); + if ($file->fileExtension === 'css') + { + $this->proc_CSS_JS($file, $minify_this_file); + } + else + { + $this->proc_LESS_SCSS($file, $minify_this_file); + } } } } // Add all files to the final result. $result = array(); - if ($concat && count($concat_list = $this->_concatMap($map))) + if ($concat && $finalize && count($concat_list = $this->_concatMap($map))) { foreach ($concat_list as $concat_fileset) { @@ -436,6 +440,18 @@ class FrontEndFileHandler extends Handler } } } + + // Enable HTTP/2 server push for CSS resources. + if ($finalize && config('view.server_push') && strncmp($_SERVER['SERVER_PROTOCOL'], 'HTTP/2', 6) === 0) + { + foreach ($result as $resource) + { + if ($resource['file'][0] === '/' && $resource['file'][1] !== '/') + { + header(sprintf('Link: <%s>; rel=preload; as=style', $resource['file']), false); + } + } + } return $result; } @@ -443,9 +459,10 @@ class FrontEndFileHandler extends Handler * Get javascript file list * * @param string $type Type of javascript. head, body + * @param bool $finalize (optional) * @return array Returns javascript file list. Array contains file, targetie. */ - public function getJsFileList($type = 'head') + public function getJsFileList($type = 'head', $finalize = false) { if($type == 'head') { @@ -463,20 +480,23 @@ class FrontEndFileHandler extends Handler $this->_sortMap($map, $mapIndex); // Minify all scripts. - foreach ($map as $indexedMap) + if ($finalize) { - foreach ($indexedMap as $file) + foreach ($map as $indexedMap) { - if (!$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all')) + foreach ($indexedMap as $file) { - $this->proc_CSS_JS($file, true); + if (!$file->isMinified && !$file->isExternalURL && !$file->isCachedScript && (($file->isCommon && $minify !== 'none') || $minify === 'all')) + { + $this->proc_CSS_JS($file, true); + } } } } // Add all files to the final result. $result = array(); - if ($concat && $type === 'head' && count($concat_list = $this->_concatMap($map))) + if ($concat && $finalize && $type === 'head' && count($concat_list = $this->_concatMap($map))) { foreach ($concat_list as $concat_fileset) { @@ -524,6 +544,18 @@ class FrontEndFileHandler extends Handler } } } + + // Enable HTTP/2 server push for JS resources. + if ($type === 'head' && $finalize && config('view.server_push') && strncmp($_SERVER['SERVER_PROTOCOL'], 'HTTP/2', 6) === 0) + { + foreach ($result as $resource) + { + if ($resource['file'][0] === '/' && $resource['file'][1] !== '/') + { + header(sprintf('Link: <%s>; rel=preload; as=script', $resource['file']), false); + } + } + } return $result; } diff --git a/common/defaults/config.php b/common/defaults/config.php index 05c9426dd..6e614bf75 100644 --- a/common/defaults/config.php +++ b/common/defaults/config.php @@ -74,6 +74,7 @@ return array( 'view' => array( 'minify_scripts' => 'common', 'concat_scripts' => 'none', + 'server_push' => false, 'use_gzip' => false, ), 'admin' => array( diff --git a/common/tpl/common_layout.html b/common/tpl/common_layout.html index d2859c612..cb70b9c19 100644 --- a/common/tpl/common_layout.html +++ b/common/tpl/common_layout.html @@ -15,14 +15,14 @@ {Context::getBrowserTitle()} - + {"\n"} - + {"\n"} @@ -70,7 +70,7 @@
- + {"\n"} diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index b02a9530f..ba8c9ce5c 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -700,6 +700,7 @@ class adminAdminController extends admin Rhymix\Framework\Config::set('session.use_db', $vars->use_db_session === 'Y'); Rhymix\Framework\Config::set('view.minify_scripts', $vars->minify_scripts ?: 'common'); Rhymix\Framework\Config::set('view.concat_scripts', $vars->concat_scripts ?: 'none'); + Rhymix\Framework\Config::set('view.server_push', $vars->use_server_push === 'Y'); Rhymix\Framework\Config::set('view.gzip', $vars->use_gzip === 'Y'); // Save diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 4c6cc6d0b..1447d1df0 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -531,6 +531,7 @@ class adminAdminView extends admin Context::set('use_db_session', Rhymix\Framework\Config::get('session.use_db')); Context::set('minify_scripts', Rhymix\Framework\Config::get('view.minify_scripts')); Context::set('concat_scripts', Rhymix\Framework\Config::get('view.concat_scripts')); + Context::set('use_server_push', Rhymix\Framework\Config::get('view.server_push')); Context::set('use_gzip', Rhymix\Framework\Config::get('view.gzip')); $this->setTemplateFile('config_advanced'); diff --git a/modules/admin/lang/en.php b/modules/admin/lang/en.php index f2f7cc5e5..e857f3b9b 100644 --- a/modules/admin/lang/en.php +++ b/modules/admin/lang/en.php @@ -92,6 +92,7 @@ $lang->cmd_concat_css_only = 'Combine all CSS'; $lang->cmd_concat_js_only = 'Combine all JS'; $lang->cmd_concat_css_js = 'Combine both CSS and JS'; $lang->about_concat_scripts = 'Automatically combine CSS and JS scripts into as few files as possible. External scripts are not combined.'; +$lang->use_server_push = 'Use HTTP/2 Server Push'; $lang->use_gzip = 'gzip Compression'; $lang->delay_session = 'Delay session start'; $lang->about_delay_session = 'To improve performance when using a caching proxy server such as Varnish, do not issue sessions to visitors until they log in.
Selecting this option may cause view counts and visitor counts to become inaccurate.'; diff --git a/modules/admin/lang/ja.php b/modules/admin/lang/ja.php index be7615755..61d8c023e 100644 --- a/modules/admin/lang/ja.php +++ b/modules/admin/lang/ja.php @@ -89,6 +89,7 @@ $lang->cmd_concat_css_only = 'CSSのみ結合'; $lang->cmd_concat_js_only = 'JSのみ結合'; $lang->cmd_concat_css_js = 'CSSやJSの両方を結合'; $lang->about_concat_scripts = 'CSS、JSファイルを一つにまとめて送信されます。外部からロードするスクリプトは、合わせてされません.'; +$lang->use_server_push = 'HTTP/2 Server Push使用'; $lang->use_gzip = 'gzip 圧縮'; $lang->delay_session = 'セッションの開始を遅延'; $lang->about_delay_session = 'Varnishなどのプロキシキャッシュサーバ使用時のパフォーマンスを向上させるために、ログインしていないユーザーには、認証セッションを付与しません。
このオプションを選択した場合、訪問者数とヒット集計が正確でない場合があります。'; diff --git a/modules/admin/lang/ko.php b/modules/admin/lang/ko.php index 4970668d2..dd7ffffe7 100644 --- a/modules/admin/lang/ko.php +++ b/modules/admin/lang/ko.php @@ -92,6 +92,7 @@ $lang->cmd_concat_css_only = 'CSS만 합침'; $lang->cmd_concat_js_only = 'JS만 합침'; $lang->cmd_concat_css_js = 'CSS와 JS를 모두 합침'; $lang->about_concat_scripts = 'CSS, JS 파일들을 하나로 합쳐서 전송합니다. 외부에서 로딩하는 스크립트는 합쳐지지 않습니다.'; +$lang->use_server_push = 'Server Push 사용'; $lang->use_gzip = 'gzip 압축'; $lang->delay_session = '세션 시작 지연'; $lang->about_delay_session = 'Varnish 등의 프록시 캐싱 서버 사용시 성능 개선을 위해, 로그인하지 않은 사용자에게는 인증 세션을 부여하지 않습니다.
이 옵션을 선택할 경우 방문자 수 및 조회수 집계가 정확하게 이루어지지 않을 수 있습니다.'; diff --git a/modules/admin/tpl/config_advanced.html b/modules/admin/tpl/config_advanced.html index ee9ec8025..cdfc01614 100644 --- a/modules/admin/tpl/config_advanced.html +++ b/modules/admin/tpl/config_advanced.html @@ -97,6 +97,13 @@

{$lang->about_concat_scripts}

+
+ +
+ + +
+
diff --git a/tests/unit/classes/FrontEndFileHandlerTest.php b/tests/unit/classes/FrontEndFileHandlerTest.php index 7d782ccf1..6f5f9a80d 100644 --- a/tests/unit/classes/FrontEndFileHandlerTest.php +++ b/tests/unit/classes/FrontEndFileHandlerTest.php @@ -39,7 +39,7 @@ class FrontEndFileHandlerTest extends \Codeception\TestCase\Test $handler = new FrontEndFileHandler(); $handler->loadFile(array('./common/css/rhymix.scss')); $handler->loadFile(array('./common/css/mobile.css')); - $result = $handler->getCssFileList(); + $result = $handler->getCssFileList(true); $this->assertRegexp('/\.rhymix\.scss\.css\?\d+$/', $result[0]['file']); $this->assertEquals('all', $result[0]['media']); $this->assertEmpty($result[0]['targetie']); @@ -155,7 +155,7 @@ class FrontEndFileHandlerTest extends \Codeception\TestCase\Test $handler = new FrontEndFileHandler(); $handler->loadFile(array('./common/css/rhymix.scss')); $handler->loadFile(array('./common/css/mobile.css')); - $result = $handler->getCssFileList(); + $result = $handler->getCssFileList(true); $this->assertRegexp('/\.rhymix\.scss\.min\.css\b/', $result[0]['file']); $this->assertEquals('all', $result[0]['media']); $this->assertEmpty($result[0]['targetie']); @@ -167,7 +167,7 @@ class FrontEndFileHandlerTest extends \Codeception\TestCase\Test $this->specify("minify (js)", function() { $handler = new FrontEndFileHandler(); $handler->loadFile(array('./common/js/common.js', 'head')); - $result = $handler->getJsFileList(); + $result = $handler->getJsFileList('head', true); $this->assertRegexp('/minified\/common\.js\.common\.min\.js\?\d+$/', $result[0]['file']); $this->assertEmpty($result[0]['targetie']); }); @@ -186,7 +186,7 @@ class FrontEndFileHandlerTest extends \Codeception\TestCase\Test $handler->loadFile(array('./tests/_data/formatter/concat.source2.css')); $handler->loadFile(array('./tests/_data/formatter/concat.target1.css')); $handler->loadFile(array('./tests/_data/formatter/concat.target2.css')); - $result = $handler->getCssFileList(); + $result = $handler->getCssFileList(true); $this->assertEquals(4, count($result)); $this->assertRegexp('/combined\/[0-9a-f]+\.css\?\d+$/', $result[0]['file']); $this->assertEquals('http://external.host/style.css', $result[1]['file']); @@ -207,7 +207,7 @@ class FrontEndFileHandlerTest extends \Codeception\TestCase\Test $handler->loadFile(array('./tests/_data/formatter/concat.source2.js', 'head', 'gt IE 7')); $handler->loadFile(array('./tests/_data/formatter/concat.target1.js')); $handler->loadFile(array('./tests/_data/formatter/concat.target2.js')); - $result = $handler->getJsFileList(); + $result = $handler->getJsFileList('head', true); $this->assertEquals(3, count($result)); $this->assertRegexp('/combined\/[0-9a-f]+\.js\?\d+$/', $result[0]['file']); $this->assertEquals('//external.host/js/script.js', $result[1]['file']);