Version 1
[yaffs-website] / web / modules / contrib / advagg / README.txt
diff --git a/web/modules/contrib/advagg/README.txt b/web/modules/contrib/advagg/README.txt
new file mode 100644 (file)
index 0000000..afab89e
--- /dev/null
@@ -0,0 +1,342 @@
+
+----------------------------------
+ADVANCED CSS/JS AGGREGATION MODULE
+----------------------------------
+
+
+CONTENTS OF THIS FILE
+---------------------
+
+ - Features & benefits
+ - Configuration
+ - JSMin PHP Extension
+ - JavaScript Bookmarklet
+ - Technical Details & Hooks
+ - How to get a high PageSpeed score
+ - nginx Configuration
+ - Troubleshooting
+
+
+FEATURES & BENEFITS
+-------------------
+
+**Advanced CSS/JS Aggregation core features**
+
+ - On demand generation of CSS/JS Aggregates. If the file doesn't exist it will
+   be generated on demand.
+ - Stampede protection for CSS and JS aggregation. Uses locking so multiple
+   requests for the same thing will result in only one thread doing the work.
+ - Fully cached CSS/JS assets allow for zero file I/O if the Aggregated file
+   already exists. Results in better page generation performance.
+ - Smarter aggregate deletion. CSS/JS aggregates only get removed from the
+   folder if they have not been used/accessed in the last 30 days.
+ - Smarter cache flushing. Scans all CSS/JS files that have been added to any
+   aggregate; if that file has changed then flush the correct caches so the
+   changes go out. The new name ensures changes go out when using CDNs.
+ - Url query string to turn off aggregation for that request. ?advagg=0 will
+   turn off file aggregation if the user has the "bypass advanced aggregation"
+   permission. ?advagg=-1 will completely bypass all of Advanced CSS/JS
+   Aggregations modules and submodules. ?advagg=1 will enable Advanced CSS/JS
+   Aggregation if it is currently disabled.
+ - Button on the admin page for dropping a cookie that will turn off file
+   aggregation. Useful for theme development.
+ - Gzip support. All aggregated files can be pre-compressed into a .gz file and
+   served from Apache. This is faster then gzipping the file on each request.
+
+**Included submodules**
+
+ - advagg_bundler:
+   Smartly groups files together - given a target number of CSS/JS aggregates,
+   this will try very hard to meet that goal.
+ - advagg_cdn:
+   Load CSS or JavaScript libraries from a public CDN; currently only supports
+   jQuery and jQuery UI with either Google's or Microsoft's CDN.
+ - advagg_css_minify:
+   Minify the compiled CSS files using a 3rd party minifier; currently
+   supports YUI (included).
+ - minify:
+   Compress the compiled JavaScript files using a 3rd party minifier;
+   built in support for a number of minifiers.
+ - advagg_mod:
+   Includes additional tweaks that may not work for all sites:
+   - Force preprocessing for all CSS/JS.
+   - Move all JS to footer.
+   - Add defer tag to all JS.
+   - Inline all CSS/JS for given paths.
+   - Use a shared directory for a unified multisite.
+ - advagg_validator:
+   Validate all CSS files using jigsaw.w3.org. Check all CSS files with CSSLint.
+   Check all JS files with JSHint.
+
+
+CONFIGURATION
+-------------
+
+Settings page is located at:
+`admin/config/development/performance/advagg`
+
+**Global Options**
+
+ - Enable Advanced Aggregation: Check this to start using this module. You can
+   also quickly disable the module here. For testing purposes, this has the same
+   effect as placing ?advagg=-1 in the URL. Disabled by default.
+ - Create .gz files: Check this by default as it will improve your performance.
+   For every Aggregated file generated, this will create a gzip version of file
+   and then only serve it out if the browser accepts gzip files compression.
+   Enabled by default.
+ - Use Cores Grouping Logic: Leave this checkbox enabled until you are ready to
+   begin exploring the AdvAgg Bundler sub-module which overrides Core's
+   functionality. This groups files just like Core does so should just work.
+   Enabled by default. You will also have to disable this checkbox if you wish
+   to enable some of the CSS Options below on this settings page.
+ - AdvAgg Cache Settings: As a reference, core takes about 25 ms to run.
+   Development will scan all files for a change on every page load. Normal is
+   fine for all use cases. Aggressive should be fine in almost all use cases;
+   if your inline css/js changes based off of a variable then the aggressive
+   cache hit ratio will be low; if that is the case consider using
+   Drupal.settings for a better cache hit ratio.
+
+**CSS Options & JS Options**
+
+ - Combine CSS files by using media queries: "Use cores grouping logic" needs to
+   be unchecked in order for this to work. Also noted is that due to an issue
+   with IE9, compatibility mode is forced off if this is enabled by adding this
+   tag in the html head:
+
+       <!--[if IE]>
+       <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
+       <![endif]-->
+
+   Disabled by default.
+ - Prevent more than 4095 CSS selectors in an aggregated CSS file: Internet
+   Explorer before version 10; IE9, IE8, IE7, & IE6 all have 4095 as the limit
+   for the maximum number of css selectors that can be in a file. Enabling this
+   will prevent CSS aggregates from being created that exceed this limit. For
+   more information see
+   http://blogs.msdn.com/b/ieinternals/archive/2011/05/14/10164546.aspx Disabled
+   by default.
+ - Fix improperly set type (CSS/JS): If type is external but does not start with
+   http, https, or // change it to be type file. If type is file but it starts
+   with http, https, or // change type to be external.
+
+**Information page**
+
+located at `admin/config/development/performance/advagg/info`. This page
+provides debugging information. There are no configuration options here.
+ - Hook Theme Info: Displays the process_html order. Used for debugging.
+ - CSS files: Displays how often a file has changed.
+ - JS files: Displays how often a file has changed.
+ - Modules implementing AdvAgg CSS/JS hooks: Lets you know what modules are
+   using advagg.
+ - AdvAgg CSS/JS hooks implemented by modules: Lets you know what advagg hooks
+   are in use.
+ - Hooks And Variables Used In Hash: Show what is used to calculate the 3rd hash
+   of an aggregates filename.
+ - Get detailed info about an aggregate file: Look up detailed array about any
+   CSS or JS file listed.
+
+**Operations page**
+
+located at `admin/config/development/performance/advagg/operations`. This is a
+collection of commands to control the cache and to manage testing of this
+module. In general this page is useful when troubleshooting some aggregation
+issues. For normal operations, you do not need to do anything on this page below
+the Smart Cache Flush. There are no configuration options here.
+ - Smart Cache Flush
+   - Flush AdvAgg Cache: Scan all files referenced in aggregated files. If
+     any of them have changed, increment the counters containing that file and
+     rebuild the bundle.
+
+ - Aggregation Bypass Cookie
+    - Toggle The "aggregation bypass cookie" For This Browser: This will set or
+      remove a cookie that disables aggregation for the remainder of the browser
+      session. It acts almost the same as adding ?advagg=0 to every URL.
+
+ - Cron Maintenance Tasks
+   - Remove All Stale Files: Scan all files in the advagg_css/js directories and
+     remove the ones that have not been accessed in the last 30 days.
+   - Clear Missing Files From the Database: Scan for missing files and remove
+     the associated entries in the database.
+   - Delete Unused Aggregates from Database: Delete aggregates that have not
+     been accessed in the last 6 weeks.
+   - Delete orphaned/expired advagg locks from the semaphore database table.
+
+ - Drastic Measures
+   - Clear All Caches: Remove all data stored in the advagg cache bins.
+   - Remove All Generated Files. Remove all files in the advagg_css/js
+     directories.
+   - Increment Global Counter: Force the creation of all new aggregates by
+     incrementing a global counter.
+
+**Hidden Settings**
+
+The following settings are not configurable from the admin UI and must be set in
+settings.php. In general they are settings that should not be changed. The
+current defaults are shown.
+
+    // Display a message that the bypass cookie is set.
+    $conf['show_bypass_cookie_message'] = TRUE;
+
+    // Skip the 404 check on status page.
+    $conf['advagg_skip_404_check'] = FALSE;
+
+    // Run advagg_url_inbound_alter().
+    $conf['advagg_url_inbound_alter'] = TRUE;
+
+    // Pregenerate aggregate files. If disable the browser requesting the file
+    // will cause the generation to happen. If advagg 404 handling is broken
+    // then setting this to false will break your site in bad ways.
+    $conf['advagg_pregenerate_aggregate_files'] = TRUE;
+
+    // Value for the compression ratio test.
+    $conf['advagg_js_compress_max_ratio'] = 0.9;
+
+    // Value for the compression ratio test.
+    $conf['advagg_js_compress_ratio'] = 0.1;
+
+    // Skip far future check on status page.
+    $conf['advagg_skip_far_future_check'] = FALSE;
+
+    // Skip preprocess and enabled checks.
+    $conf['skip_enabled_preprocess_check'] = FALSE;
+
+    // Default root dir for the advagg files; see advagg_get_root_files_dir().
+    $conf['root_dir_prefix'] = 'public://';
+
+JSMIN PHP EXTENSION
+-------------------
+
+The AdvAgg JS Minify module can take advantage of jsmin.c. JavaScript parsing
+and minimizing will be done in C instead of PHP dramatically speeding up the
+process. JsMin C extension can be found at https://github.com/sqmk/pecl-jsmin.
+
+
+JAVASCRIPT BOOKMARKLET
+----------------------
+
+You can use this JS code as a bookmarklet for toggling the AdvAgg URL parameter.
+See http://en.wikipedia.org/wiki/Bookmarklet for more details.
+
+    javascript:(function(){var loc = document.location.href,qs = document.location.search,regex_off = /\&?advagg=-1/,goto = loc;if(qs.match(regex_off)) {goto = loc.replace(regex_off, '');} else {qs = qs ? qs + '&advagg=-1' : '?advagg=-1';goto = document.location.pathname + qs;}window.location = goto;})();
+
+
+TECHNICAL DETAILS & HOOKS
+-------------------------
+
+**Technical Details**
+
+ - Files are generated by this pattern:
+
+       css__[BASE64_HASH]__[BASE64_HASH]__[BASE64_HASH].css
+
+   The first base64 hash value tells us what files are included in the
+   aggregate. Changing what files get included will change this value.
+
+   The second base64 hash value is used as a sort of version control; it changes
+   if any of the base files contents have changed. Changing a base file's content
+   (like drupal.js) will change this value.
+
+   The third base64 hash value records what settings were used when generating
+   the aggregate. Changing a setting that affects how aggregates get built
+   (like toggling "Create .gz files") will change this value.
+
+ - Aggressive Cache Setting: This will fully cache the rendered html generated
+   by AdvAgg. The cache ID is set by this code:
+
+       $hooks_hash = advagg_get_current_hooks_hash();
+       $css_cache_id_full = 'advagg:css:full:' . $hooks_hash . ':' . drupal_hash_base64(serialize($full_css));
+
+       $hooks_hash = advagg_get_current_hooks_hash();
+       $js_cache_id_full = 'advagg:js:full:' . $hooks_hash . ':' . drupal_hash_base64(serialize($js_scope_array));
+
+   The second and final hash value in this cache id is the css/js_hash value.
+   This takes the input from drupal_add_css/js() and creates a hash value from
+   it. If a different file is added and/or inline code changed, this hash value
+   will be different.
+
+   The first hash value will take the current_hooks_hash value which is the
+   third base64 hash value listed above in this section (Technical Details) as
+   the first part of the hash. This means that if any value is changed in this
+   nested array a different cache id will be used. You can see the contents of
+   this nested array by going to
+   `admin/config/development/performance/advagg/info` under
+   "Hooks And Variables Used In Hash". An example of this being properly used is
+   if you enable the core locale module the language key will appear in the
+   array. This is needed because the locale_css_alter and locale_js_alter
+   functions both use the global $language variable in determining what css or
+   js files need to be altered. To add in your own context you can use
+   hook_advagg_current_hooks_hash_array_alter to do so. Be careful when doing so
+   as including something like the user id will make every user have a different
+   set of aggregate files.
+
+**Hooks**
+
+Modify file contents:
+ - advagg_css_contents_alter. Modify the data of each file before it
+   gets glued together into the bigger aggregate. Useful for minification.
+ - advagg_js_contents_alter. Modify the data of each file before it
+   gets glued together into the bigger aggregate. Useful for minification.
+
+Modify file names and aggregate bundles:
+ - advagg_current_hooks_hash_array_alter. Add in your own settings and hooks
+   allowing one to modify the 3rd base64 hash in a filename.
+
+Others:
+ - advagg_hooks_implemented_alter. Tell advagg about other hooks related to
+   advagg.
+ - advagg_get_root_files_dir_alter. Allow other modules to alter css and js
+   paths.
+ - advagg_modify_css_pre_render_alter. Allow other modules to modify $children
+   & $elements before they are rendered.
+ - advagg_modify_js_pre_render_alter. Allow other modules to modify $children
+   & $elements before they are rendered.
+ - advagg_changed_files. Let other modules know about the changed files.
+ - advagg_removed_aggregates. Let other modules know about removed aggregates.
+ - advagg_scan_for_changes. Let other modules see if files related to this file
+   has changed. Useful for detecting changes to referenced images in css.
+ - advagg_scan_file_alter. Let other modules modify information about
+   the base CSS/JS files.
+ - advagg_context_alter. Allow other modules to swap important contextual
+   information on generation.
+ - advagg_bundler_analysis. If the bundler module is installed allow for other
+   modules to change the bundler analysis.
+
+
+HOW TO GET A HIGH PAGESPEED SCORE
+---------------------------------
+
+Go to `admin/config/development/performance/advagg`
+ - uncheck "Use cores grouping logic"
+ - check "Combine CSS files by using media queries"
+
+Install AdvAgg Modifier if not enabled and go to
+`admin/config/development/performance/advagg/mod`
+ - Under "Move JS to the footer" Select "All"
+ - set "Enable preprocess on all JS/CSS"
+ - set "Move JavaScript added by drupal_add_html_head() into drupal_add_js()"
+ - set "Move CSS added by drupal_add_html_head() into drupal_add_css()"
+ - Enable every checkbox under "Optimize JavaScript/CSS Ordering"
+
+Install AdvAgg Minify Javascript if not enabled and go to
+`admin/config/development/performance/advagg/js-minify`
+ - Select JSMin if available; otherwise select JSMin+
+
+**Other things to consider**
+
+On the `admin/config/development/performance/advagg/mod` page there is the
+setting "Remove unused JavaScript tags if possible". This is a backport of D8
+where it will not add any JS to the page if it is not being used.
+https://drupal.org/node/1279226
+
+The AdvAgg Bundler module on the
+`admin/config/development/performance/advagg/bundler` page. The bundler provides
+intelligent bundling of CSS and JS files by grouping files that belong together.
+This does what core tried to do; group CSS & JS files together that get used
+together. Using this will make your pagespeed score go down as there will be
+more css/js files to download but if different css/js files are used on
+different pages of your site this will be a net win as a new full aggregate will
+not have to be downloaded, instead a smaller aggregate can be downloaded,
+ideally with only the css/js that is different on that page. You can select how
+many bundles to create and the bundler will do it's best to meet that goal; if
+using browser css/js conditionals (js browser conditionals backported from D8
+https://drupal.org/node/865536) then the bundler might not meet your set value.