<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-5521908772546073120</id><updated>2013-01-29T14:05:39.778-08:00</updated><category term="zoom" /><category term="tutorials" /><category term="ezapps" /><category term="fpc" /><category term="cache" /><category term="php" /><category term="nginx" /><category term="ecommerce" /><category term="override" /><category term="programming" /><category term="customize" /><category term="gzip" /><category term="magento" /><category term="open source" /><category term="full-page cache" /><category term="compress" /><category term="e-commerce" /><title type="text">EZAPPS.CA Development Journal</title><subtitle type="html">Ecommerce Software for Magento and more</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://journal.ezapps.ca/" /><author><name>Ezra Morse</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Ezapps" /><feedburner:info uri="ezapps" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Ezapps" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.plusmo.com/add?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://plusmo.com/res/graphics/fbplusmo.gif">Subscribe with Plusmo</feedburner:feedFlare><feedburner:feedFlare href="http://www.thefreedictionary.com/_/hp/AddRSS.aspx?http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://img.tfd.com/hp/addToTheFreeDictionary.gif">Subscribe with The Free Dictionary</feedburner:feedFlare><feedburner:feedFlare href="http://www.bitty.com/manual/?contenttype=rssfeed&amp;contentvalue=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.bitty.com/img/bittychicklet_91x17.gif">Subscribe with Bitty Browser</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><feedburner:feedFlare href="http://mix.excite.eu/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://image.excite.co.uk/mix/addtomix.gif">Subscribe with Excite MIX</feedburner:feedFlare><feedburner:feedFlare href="http://www.webwag.com/wwgthis.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.webwag.com/images/wwgthis.gif">Subscribe with Webwag</feedburner:feedFlare><feedburner:feedFlare href="http://www.podcastready.com/oneclick_bookmark.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.podcastready.com/images/podcastready_button.gif">Subscribe with Podcast Ready</feedburner:feedFlare><feedburner:feedFlare href="http://www.wikio.com/subscribe?url=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.wikio.com/shared/img/add2wikio.gif">Subscribe with Wikio</feedburner:feedFlare><feedburner:feedFlare href="http://www.dailyrotation.com/index.php?feed=http%3A%2F%2Ffeeds.feedburner.com%2FEzapps" src="http://www.dailyrotation.com/rss-dr2.gif">Subscribe with Daily Rotation</feedburner:feedFlare><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-3873506425000854917</id><published>2012-03-30T14:29:00.000-07:00</published><updated>2012-03-30T16:14:45.099-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="open source" /><category scheme="http://www.blogger.com/atom/ns#" term="fpc" /><category scheme="http://www.blogger.com/atom/ns#" term="zoom" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><category scheme="http://www.blogger.com/atom/ns#" term="full-page cache" /><title type="text">Zoom: The Magento Full-Page Cache goes Open Source</title><content type="html">&lt;div style="float: right; margin: 10px 0px 10px 10px; width: 50%;"&gt;&lt;a class="download-button" href="https://github.com/ezapps/Zoom-Magento-FPC/archives/master"&gt; Download  &lt;span id="someid"&gt;Latest version from GitHub&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="margin-left: auto; margin-right: auto; margin-top: 18px; text-align: center; width: 100%;"&gt;&lt;b&gt;Support the Zoom FPC Project:&lt;/b&gt;&lt;br /&gt;&lt;form action="https://www.paypal.com/cgi-bin/webscr" method="post"&gt;&lt;input name="cmd" type="hidden" value="_s-xclick" /&gt;&lt;input name="hosted_button_id" type="hidden" value="9KDSXMHXJYGZW" /&gt;&lt;input alt="PayPal - The safer, easier way to pay online!" border="0" name="submit" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" type="image" /&gt;&lt;img alt="" border="0" height="1" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" /&gt;&lt;/form&gt;&lt;/div&gt;&lt;/div&gt;Since releasing the&amp;nbsp;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;&lt;b&gt;Zoom Full-Page Cache for Magento&lt;/b&gt;&lt;/a&gt;, things have been exciting around here, but we are only getting started! From this point forward, Magento no longer needs to be saddled with the reputation of being a slow resource-hog. And no longer will businesses need special hosting providers or rooms full of servers to run a competent store. Zoom is now open-source at &lt;a href="https://github.com/ezapps/Zoom-Magento-FPC"&gt;GitHub&lt;/a&gt; and will be coming to Magento Connect soon.&lt;br /&gt;&lt;br /&gt;We &lt;a href="http://journal.ezapps.ca/2012/03/into-fray.html"&gt;jumped into this thinking&lt;/a&gt; that &amp;nbsp;a small, quick project like the &lt;b&gt;Zoom FPC&lt;/b&gt; woud be a great initial offering of our commercial services. But after some long thought and recent interaction with many community members, we've considered the following:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="margin-bottom: 12px;"&gt;&lt;span style="color: #3d85c6; display: block; font-size: 14px; margin-bottom: 4px;"&gt;&lt;b&gt;Magento really needs Zoom&lt;/b&gt;&lt;/span&gt;I have experienced everything from 4/10th of a second to 4 second page loads with Magento CE on highly optimized systems. This expansive code base--weighed down with magic gets, heavy-abstraction and&amp;nbsp;resource-insensitive design--can buckle under its own weight, rendering it useless in many scenarios. The Zoom Full-Page Cache really does unlock a large portion of Magento's potential by delivering the pages as fast as static content. Implemented properly, your webserver becomes your bottle-neck and Magento Community performs like enterprise level software.&lt;/li&gt;&lt;li style="margin-bottom: 12px;"&gt;&lt;b&gt;&lt;span style="color: #3d85c6; display: block; font-size: 14px; margin-bottom: 4px;"&gt;There are already enough commercial products fixing basic deficiencies&lt;/span&gt;&lt;/b&gt;I love open source software as much as the next guy, but I am apprehensive of the&amp;nbsp;&lt;b&gt;Open Source as Crack&lt;/b&gt;&amp;nbsp;&lt;i&gt;business model&lt;/i&gt;. Lipstick and&amp;nbsp;&lt;i&gt;potential&lt;/i&gt;&amp;nbsp;can lure a "customer" into adopting a&amp;nbsp;&lt;i&gt;free&lt;/i&gt;&amp;nbsp;platform, only to find themselves in a corner faced with a decision: "should I cough up thousands for an actual usable product or should I migrate yet again?" Many&amp;nbsp;&lt;i&gt;free&amp;nbsp;&lt;/i&gt;products are simply unsupported demos, and entire industries exists to "fix" these products for distressed users--I don't want Ezapps to be a part of that model.&lt;br /&gt;&lt;br /&gt;At this point, Zoom will never have a commercial version. What you see is what you get. When I have time, I will fix bugs found in the system. I will also accept community offered bug-fixes and incorporate them into the main code.&lt;br /&gt;&lt;br /&gt;With that said, I have been very busy altering Zoom to work with highly customized Magento stores, as well as expanding it. If you need any help in that area,&amp;nbsp;&lt;a href="http://www.ezapps.ca/contacts/"&gt;contact us&lt;/a&gt;&amp;nbsp;and we will be happy to provide a quote. &lt;/li&gt;&lt;li style="margin-bottom: 12px;"&gt;&lt;b&gt;&lt;span style="color: #3d85c6; display: block; font-size: 14px; margin-bottom: 4px;"&gt;This allows us focus on more important offerings&lt;/span&gt;&lt;/b&gt;The Zoom FPC was never originally on our radar (most of our active projects are platform independent). It was a quick idea, rush-coded in the midnight hours for Magento mass-consumption. Open-sourcing this product lets us get back to the basics. If the response to Zoom continues to be positive, we will probably be bringing these other projects out commercially.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;So, to finish up, if you download Zoom and find it useful, please realize that we are a small company that will only thrive if you:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Tell your friends&lt;/li&gt;&lt;li&gt;Report bugs and contribute&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=9KDSXMHXJYGZW"&gt;Support the project&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;If you need installation help or any custom work done, such as expanding Zoom's hole-punching to custom blocks or resolving conflicts with other custom modules, please &lt;a href="http://www.ezapps.ca/contacts/"&gt;let us know&lt;/a&gt;. Thanks!&lt;/div&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=tSWEr_PDA-A:KfhjWP5MeS0:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=tSWEr_PDA-A:KfhjWP5MeS0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=tSWEr_PDA-A:KfhjWP5MeS0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=tSWEr_PDA-A:KfhjWP5MeS0:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/tSWEr_PDA-A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/3873506425000854917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/zoom-magento-full-page-cache-goes-open.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/3873506425000854917" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/3873506425000854917" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/tSWEr_PDA-A/zoom-magento-full-page-cache-goes-open.html" title="Zoom: The Magento Full-Page Cache goes Open Source" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/zoom-magento-full-page-cache-goes-open.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-655248919732472502</id><published>2012-03-28T17:49:00.000-07:00</published><updated>2012-03-29T00:03:56.551-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="zoom" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><category scheme="http://www.blogger.com/atom/ns#" term="override" /><category scheme="http://www.blogger.com/atom/ns#" term="full-page cache" /><category scheme="http://www.blogger.com/atom/ns#" term="customize" /><title type="text">Zoom Full-Page Cache and Customized Magento, Part 1</title><content type="html">&lt;h4 class="entry-title"&gt; Resolving Conflicts&lt;/h4&gt;The most common question I have been asked about &lt;b&gt;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;the&amp;nbsp;Zoom Full-Page Cache&lt;/a&gt;&lt;/b&gt; is: &lt;i&gt;will it work with my&amp;nbsp;custom&amp;nbsp;&lt;/i&gt;&lt;i&gt;Magento modules&lt;/i&gt;? In most cases Zoom has proven to be versatile, but if you have a module installed that is trying to override the same core block that Zoom is, there is some leg-work required.&lt;br /&gt;&lt;br /&gt;When these conflicts appear either 1) a block will not be punched, or 2) it will be punched, but it will lack the functionality of your custom module. In one scenario, your block is being used, while in the other, the Zoom block has been chosen by Magento.&amp;nbsp;There is also the case of a model being in conflict, and that is resolved in a similar way to what I describe below.&lt;br /&gt;&lt;br /&gt;When there is a conflict, you will normally have a class that looks like:   &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;class Custom_Module_Block_Template_Links extends Mage_Page_Block_Template_Links &lt;/div&gt;And a Zoom class that looks like:  &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;class Ezapps_Zoom_Block_Wrapper_Links extends Mage_Page_Block_Template_Links &lt;/div&gt; If you do not feel comfortable altering your store source, or even the source of your extensions, you may not want to proceed without professional help. &lt;b&gt;When in doubt, please feel free to &lt;a href="http://www.ezapps.ca/contacts/"&gt;contact us&lt;/a&gt; and we can provide a quote&lt;/b&gt;. And remember, always backup your source and database before making evasive changes.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;         Method 1: Using your block&lt;/h4&gt;Zoom overrides very little core functionality, and is normally just trying to wrap the HTML content to mark a "hole" (an area to remove and fill in later with dynamic content). So the easy answer is to simply copy the Zoom source into your custom class.&lt;br /&gt;&lt;br /&gt;First, copy the following variables/code from the Zoom block to yours. You may have to merge the two versions if they share methods: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;pre&gt;private $_key = '&lt;span style="color: #3d85c6;"&gt;holename&lt;/span&gt;';&lt;br /&gt;private $_cache_tag = true;&lt;br /&gt;&lt;br /&gt;public function __construct() {  &lt;span style="color: #3d85c6;"&gt;// COPY ZOOM CLASS CODE&lt;/span&gt;  }&lt;br /&gt;&lt;br /&gt;public function _afterToHtml($html) {  &lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #999999;"&gt;// ONLY CALL ZOOM FROM CUSTOM MODULE IF IT EXISTS AND IS ACTIVE&lt;/span&gt;&lt;br /&gt;    $modules = (array)Mage::getConfig()-&amp;gt;getNode('modules')-&amp;gt;children();&lt;br /&gt;    if (array_key_exists('Ezapps_Zoom', $modules) &amp;amp;&amp;amp; &lt;br /&gt;        $modules['Ezapps_Zoom']-&amp;gt;is('active') ) {&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: #3d85c6;"&gt;//&amp;nbsp;COPY ZOOM CLASS CODE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    } else return parent::_afterToHtml($html);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public function setCacheTag($status) {  &lt;span style="color: #3d85c6;"&gt;// COPY ZOOM CLASS CODE&lt;/span&gt;  }&lt;br /&gt;&lt;br /&gt;public function getCacheTag() {  &lt;span style="color: #3d85c6;"&gt;// COPY ZOOM CLASS CODE&lt;/span&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Next, remove the rewrite statement for this block in Zoom's "config.xml". Your custom block will now create its own hole. &lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;         Method 2: Using Zoom's Block&lt;/h4&gt;You may not want to alter your own custom block, because this may prevent future upgrades of that module. A more brute-force method of over-ridding a previously over-ridden core block is as follows...  &lt;br /&gt;&lt;br /&gt;First, change: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;class Ezapps_Zoom_Block_Wrapper_Links extends Mage_Page_Block_Template_Links &lt;/div&gt;To: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;span style="color: #999999;"&gt;// PATH TO CONFLICTING BLOCK&lt;/span&gt;&lt;br /&gt;require_once("Custom/Module/Block/Template/Links.php"); &lt;br /&gt;&lt;br /&gt;class Ezapps_Zoom_Block_Wrapper_Links extends Custom_Module_Block_Template_Links &lt;/div&gt;Next, remove the rewrite statement for this block in the custom module's "config.xml". The Zoom block will inherit the other blocks changes, and continue to create the hole.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;     Method 3: Give EZAPPS a Call&lt;/h4&gt;By now, we have a plethora of experience when it comes to identifying and resolving these conflicts, and we have made Zoom cache very difficult content without dramatic effort.&amp;nbsp;What might be hours for you could be a few minutes for us (though we have faced some &lt;i&gt;very&lt;/i&gt; customized Magento stores that required a great deal of effort). We have some popular extensions already modified to play nice with the Zoom Full-Page Cache. &lt;br /&gt;&lt;br /&gt;With that, I hope enough people in the community learned how to resolve conflicts when you have two modules competing for the same core Magento block. This principle also applies to any situation where this may occur (even outside the usage of Zoom).&lt;br /&gt;&lt;br /&gt;We have some very exciting news on the horizon and soon I will also cover how to hole-punch custom modules that are not in the original Zoom package--so stay tuned.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=0aLGzN-JBp4:bDtd-iNUV5s:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=0aLGzN-JBp4:bDtd-iNUV5s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=0aLGzN-JBp4:bDtd-iNUV5s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=0aLGzN-JBp4:bDtd-iNUV5s:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/0aLGzN-JBp4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/655248919732472502/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/zoom-full-page-cache-and-customized.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/655248919732472502" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/655248919732472502" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/0aLGzN-JBp4/zoom-full-page-cache-and-customized.html" title="Zoom Full-Page Cache and Customized Magento, Part 1" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><thr:total>5</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/zoom-full-page-cache-and-customized.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-3405790521859461642</id><published>2012-03-21T11:08:00.002-07:00</published><updated>2012-03-29T00:04:18.055-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fpc" /><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="gzip" /><category scheme="http://www.blogger.com/atom/ns#" term="zoom" /><category scheme="http://www.blogger.com/atom/ns#" term="nginx" /><category scheme="http://www.blogger.com/atom/ns#" term="compress" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><category scheme="http://www.blogger.com/atom/ns#" term="cache" /><title type="text">So you want to GZIP your Magento Full-Page Cache?</title><content type="html">Compressing dynamic pages on the fly, to a high degree, can be resource-prohibited. Most, if not all, modern webservers have the ability to compress a page before serving (as does PHP). But for optimal compression, whatever you may save in bandwidth, you may be giving up in performance. And if performance is always in the back of your mind from running a bloated piece of architecture (if you run &lt;a href="http://www.magentocommerce.com/"&gt;Magento&lt;/a&gt;) then it probably isn't a great idea to churn out pages on a high traffic site with maximum GZIP compression.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;      The Good News&lt;/h4&gt;&lt;div&gt;Now if you are running a &lt;i&gt;full-page cache&lt;/i&gt; for &lt;b&gt;Magento&lt;/b&gt;&amp;nbsp;that supports GZIP (like my product &lt;b&gt;Zoom&lt;/b&gt;), not only do you have to generate a page just a single time, you really only have to compress it once! As the number hits begins to dwarf your new page generation/compression rate, the pendulum quickly swings to favor maximum compression; in a short time, the effort can save a merchant a great deal on both hardware (from using less CPU cycles) and bandwidth (from serving pages with up to 90% compression)--and further, your customers get the pages even faster! The only real cost is a little more hard-drive space to hold the copies.&lt;br /&gt;&lt;br /&gt;This is why I opted to support GZIP compression with the &lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;Zoom Full-Page Cache&lt;/a&gt;. It only makes sense to give performance-concerned stores the ability to maintain a GZIPed version of their pages to serve in place of the uncompressed cached file. This feature is straight-forward, out-of-the-box, and can be employed within minutes of installation.&lt;br /&gt;&lt;br /&gt;To give you a brief illustration, here is a listing of my cache at &lt;a href="http://www.ezapps.ca/"&gt;http://www.ezapps.ca/&lt;/a&gt;:  &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;pre&gt;[root@ezapps magento]# ls -l var/zoom/default&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 18722 Mar 19 04:00 about-ezapps.html&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm  6560 Mar 19 04:00 about-ezapps.html.gz&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 19061 Mar 19 04:00 privacy-policy&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm  6608 Mar 19 04:00 privacy-policy.gz&lt;br /&gt;drwxrwxrwx 3 php-fpm php-fpm  4096 Mar 19 20:58 review&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 22598 Mar 19 04:00 terms-and-conditions&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm  8018 Mar 19 04:00 terms-and-conditions.gz&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 17350 Mar 19 16:27 zoom-free.html&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm  5992 Mar 19 16:27 zoom-free.html.gz&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 39406 Mar 19 14:34 ZOOM_INDEX&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm  7452 Mar 19 04:00 ZOOM_INDEX.gz&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 70736 Mar 20 02:05 zoom-magento-full-page-cache.html&lt;br /&gt;-rw-rw-rw- 1 php-fpm php-fpm 15609 Mar 20 02:05 zoom-magento-full-page-cache.html.gz&lt;/pre&gt;&lt;/div&gt;My pages are small and few, but if you are running a store with thousands of products (and categories that have numerous states), there can be immense CPU and bandwidth savings here.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;     Using the Compressed Cache with Zoom FPC&lt;/h4&gt;Just speaking for my own cache, usage is simple: The Zoom PHP retriever&lt;b&gt; will automatically&lt;/b&gt; attempt to find the GZIPed page, set the headers correctly and serve it (unless your customers are using MSIE &amp;lt;= 6). No further work is needed for those sending requests straight to PHP from the webserver.&lt;br /&gt;&lt;br /&gt;But if you've taken my earlier advice and setup &lt;a href="http://journal.ezapps.ca/2012/03/setting-up-zoom-full-page-cache-with.html"&gt;NGINX to serve the Magento full-page&lt;/a&gt; cache files directly, there is some leg work required. &lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;     Introducing GZIP static for NGINX users&lt;/h4&gt;If you did not yet know, there is an NGINX module called &lt;a href="http://wiki.nginx.org/HttpGzipStaticModule"&gt;HttpGzipStatic&lt;/a&gt;&amp;nbsp;that can make the process just as automatic as passing the request to my handler.&amp;nbsp;With this module active, whenever you issue a "&lt;b&gt;try_files&lt;/b&gt;" directive, NGINX will look for a GZIP version to send instead. In other words, when you issue:&lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;try_files $zoomuri $zoomg $uri $uri/ @handler;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;NGINX does this: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;try_files $zoomuri.gz $zoomuri $zoomg.gz $zoomg $uri.gz $uri $uri/ @handler; &lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;From what I can ascertain, the overhead is not significant.  &lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;  Using GZIP static&lt;/h4&gt;This module is not built into many standard NGINX distributions, which means that you will need to compile NGINX by hand. This is not a difficult process: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;pre&gt;wget http://nginx.org/download/nginx-1.0.14.tar.gz&lt;br /&gt;tar -zxvf nginx-1.0.14.tar.gz&lt;br /&gt;cd nginx-1.0.14&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #999999;"&gt;# Your compile line may differ&lt;/span&gt;&lt;br /&gt;./configure --without-http_autoindex_module --with-http_ssl_module --without-http_geo_module &lt;b&gt;&lt;span style="color: #45818e;"&gt;--with-http_gzip_static_module&lt;/span&gt;&lt;/b&gt; --without-http_empty_gif_module&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;cd ..&lt;br /&gt;rm -rf nginx-1.0.14&lt;br /&gt;service nginx restart&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;Now we have to tell NGINX to use this module inside our server configuration files. You can try a configuration simular to: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;pre&gt;gzip  on;&lt;br /&gt;gzip_disable        "MSIE [1-6]\.";&lt;br /&gt;gzip_vary           on;&lt;br /&gt;gzip_comp_level 2;&lt;br /&gt;gzip_min_length 1000;&lt;br /&gt;gzip_proxied any;&lt;br /&gt;gzip_types      text/plain  text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;&lt;br /&gt;charset  utf-8;&lt;br /&gt;gzip_static on;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;After a server restart/reload, you should can now be serving pre-gzipped files directly from NGINX! Paired with my &lt;a href="http://journal.ezapps.ca/2012/03/setting-up-zoom-full-page-cache-with.html"&gt;earlier tutorial&lt;/a&gt; on serving Zoom from NGINX, you can be running one of the fastest and efficient Magento stores possible. &lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;  Taking it one step further&lt;/h4&gt;Why stop here? We are already checking from NGINX for GZIP copies of every file, so why not give it to them? If you want to take this one step further, extend Magento's core thumbnailing libraries to produce a GZIP copy as well so your product images are zooming on over to the user (for compressed images, this won't save much). CSS and javascript and other text files are also prime subjects.&lt;br /&gt;&lt;br /&gt;If you are interested in any custom work related to anything I've discussed in this article, please &lt;a href="http://www.blogger.com/ezapps.software@gmail.com"&gt;contact me&lt;/a&gt;. &lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=-jgqXUg4oOU:9R9mF3SGEcI:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=-jgqXUg4oOU:9R9mF3SGEcI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=-jgqXUg4oOU:9R9mF3SGEcI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=-jgqXUg4oOU:9R9mF3SGEcI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/-jgqXUg4oOU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/3405790521859461642/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/so-you-want-to-gzip-your-magento-full.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/3405790521859461642" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/3405790521859461642" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/-jgqXUg4oOU/so-you-want-to-gzip-your-magento-full.html" title="So you want to GZIP your Magento Full-Page Cache?" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/so-you-want-to-gzip-your-magento-full.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-6716869058877789033</id><published>2012-03-19T08:45:00.000-07:00</published><updated>2012-03-29T00:04:41.448-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="tutorials" /><category scheme="http://www.blogger.com/atom/ns#" term="zoom" /><category scheme="http://www.blogger.com/atom/ns#" term="nginx" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><title type="text">Setting up Zoom Full-Page Cache with Magento &amp; NGINX</title><content type="html">&lt;div style="margin-left: -15px;"&gt;&lt;a href="http://3.bp.blogspot.com/-pWjK85jGSiY/T2WZcYSTjxI/AAAAAAAAAF8/8uQuQGjmRiI/s1600/nginx-magento-zoom.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="NGINX + MAGENTO + ZOOM" border="0" src="http://3.bp.blogspot.com/-pWjK85jGSiY/T2WZcYSTjxI/AAAAAAAAAF8/8uQuQGjmRiI/s1600/nginx-magento-zoom.png" title="Configuring Zoom Full-Page Cache for Magento and NGINX" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: x-small;"&gt;(&lt;b&gt;Please Note:&lt;/b&gt; The following is not necessary for using EZAPPS Zoom, nor is&amp;nbsp;NGINX&amp;nbsp;even required for this FPC)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;While &lt;b&gt;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;Zoom: The Magento Full-Page Cache&lt;/a&gt;&lt;/b&gt;&amp;nbsp;is quite fast on its own, I've found that&amp;nbsp;&lt;b&gt;NGINX&lt;/b&gt;&amp;nbsp;can retrieve files in half the time of Zoom alone. NGINX also scales much better and has a lower memory footprint--this becomes immensely important if you need to keep your store functioning in the midst of a DDoS attack or heavy traffic spikes. Therefore, I would encourage all Zoom users to go the extra step and configure it to work with NGINX as well.&lt;br /&gt;&lt;br /&gt;For the scope of this article, I will assume that:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The reader has a working&amp;nbsp;&lt;b&gt;&lt;a href="http://www.magentocommerce.com/"&gt;Magento ecommerce store&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;This store runs uses the&amp;nbsp;&lt;b&gt;&lt;a href="http://nginx.org/"&gt;NGINX&lt;/a&gt; &lt;/b&gt;webserver&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;EZAPPS Zoom&lt;/a&gt;&lt;/b&gt; has been purchased &amp;amp; installed successfully&lt;/li&gt;&lt;li&gt;You have basic knowledge of server management&lt;/li&gt;&lt;li&gt;You have a development environment to test this in before using it live&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;If any of these assumptions are incorrect, I encourage you to catch yourself up to speed before proceeding.&lt;/div&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;             Background&lt;/h4&gt;Zoom caches Magento pages using a very simple idea: save the pages as files to an alternative directory where the webserver (or the Zoom handler) can access them. Further, do it in such a way that it is not difficult for the server to find the files (hence, no complicated hashing).&lt;br /&gt;&lt;br /&gt;For a quick overview of how these files are created, reference the following (assuming "example" is the store code): &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;/product1.html&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;becomes&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;var/zoom/example/product1.html&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;/category1/product2.html&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;becomes&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;var/zoom/example/category1/product2.html&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;b&gt;/somepagename/&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;&amp;nbsp;&amp;nbsp;becomes&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;var/zoom/example/somepagename/ZOOM_INDEX&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;What becomes more difficult is categories, because each view has a state attached to it--therefore, the file names must preserve this state. A category url like "&lt;b&gt;cat1.html&lt;/b&gt;" will be cached as:&lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;var/zoom/example/cat1.html/zget/p/1/dir/asc/limit/9/......../ZOOM_INDEX&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;var/zoom/example/cat1.html/zget/p/1/ZOOM_INDEX&lt;/span&gt;&lt;/b&gt; &amp;nbsp; &amp;nbsp;(possible symlink)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;                   Now lets put it together&lt;/h4&gt;With NGINX, you can use the "&lt;b&gt;try files&lt;/b&gt;" directive to try multiple files (they are tried in order from left to right, and if they do not exist, the request gets pushed to PHP in the typical Magento setup). In your ".conf" file, there should be a line that looks like:&lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;try_files $uri $uri/ @handler;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;We will be changing this line to: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;&lt;span style="color: #0b5394;"&gt;try_files $zoomuri $zoomg $uri $uri/ @handler;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Now, outside any &lt;b&gt;location&lt;/b&gt; directive, all we have to do is define &lt;b&gt;$zoomuri&lt;/b&gt; and &lt;b&gt;$zoomg&lt;/b&gt;. &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;set $ua '';&lt;br /&gt;set $zget /zget;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# User Agent theme overrides will be cached to their own sub-directories&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# if ( $http_user_agent ~ iphone ){&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# &amp;nbsp; &amp;nbsp;set $ua '/default/default/iphone';&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;set $mzi /ZOOM_INDEX;&lt;br /&gt;set $code default; &amp;nbsp; &lt;span style="color: #999999;"&gt;# This should match your&amp;nbsp;MAGE_RUN_CODE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Multi-language stores use different codes on the same domain. Use the 'store' cookie to detect this&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# if ($cookie_store) { set $code $cookie_store; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;set $zoombase &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/var/zoom/$code$ua;&lt;br /&gt;set $zoomuri &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; $zoombase$uri; &amp;nbsp; &amp;nbsp; &lt;span style="color: #999999;"&gt;# This will be pages without toolbars (products, CMS, etc)&lt;/span&gt;&lt;br /&gt;set $zoomuriget &amp;nbsp; &amp;nbsp; $zoomuri$zget; &amp;nbsp; &amp;nbsp; &lt;span style="color: #999999;"&gt;# Here is our initial category variable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# By default, we will always check for the first page of a potential category page&lt;/span&gt;&lt;br /&gt;set $p 1;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Initialize toolbar state according to Zoom cookies.&lt;/span&gt;&lt;br /&gt;set $dir &amp;nbsp; $cookie_zoom_dir;&lt;br /&gt;set $limit $cookie_zoom_limit;&lt;br /&gt;set $mode &amp;nbsp;$cookie_zoom_mode;&lt;br /&gt;set $order $cookie_zoom_order;&lt;br /&gt;&lt;br /&gt;set $zoomg $zoomuriget;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Initialize layered navigation variables&lt;/span&gt;&lt;br /&gt;set $cat &amp;nbsp; &amp;nbsp;"";&lt;br /&gt;set $price &amp;nbsp;"";&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Over-ride toolbar state with GET variables (if they exist)&lt;/span&gt;&lt;br /&gt;if ($arg_p) &amp;nbsp; &amp;nbsp; { set $p &amp;nbsp; &amp;nbsp; $arg_p; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;if ($arg_dir) &amp;nbsp; { set $dir &amp;nbsp; $arg_dir; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;if ($arg_limit) { set $limit $arg_limit; &amp;nbsp;}&lt;br /&gt;if ($arg_mode) &amp;nbsp;{ set $mode &amp;nbsp;$arg_mode; &amp;nbsp; }&lt;br /&gt;if ($arg_order) { set $order $arg_order; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Layered navigation will be appended in alphabetical order to the final string&lt;/span&gt;&lt;br /&gt;if ($arg_cat) &amp;nbsp; { set $cat &amp;nbsp; /cat/$arg_cat; &amp;nbsp; }&lt;br /&gt;if ($arg_price) { set $price /price/$arg_price; }&lt;br /&gt;&lt;br /&gt;set $control &amp;amp;dir=$dir&amp;amp;limit=$limit&amp;amp;mode=$mode&amp;amp;order=$order;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# If there is no given toolbar state, look for symlink of the default state (at the given page)&lt;/span&gt;&lt;br /&gt;if ($control = "&amp;amp;dir=&amp;amp;limit=&amp;amp;mode=&amp;amp;order=") { set $zoomg $zoomg/p/$p; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Otherwise, construct complete cache filename (this requires normalized URL for consistent hits)&lt;/span&gt;&lt;br /&gt;if ($zoomg = $zoomuriget)&amp;nbsp;{ set $zoomg&amp;nbsp;$zoomg/p/$p/dir/$dir/limit/$limit/mode/$mode/order/$order$cat$price; &amp;nbsp;}&lt;br /&gt;&lt;span style="color: #999999;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #999999;"&gt;# A fix to redirect the index page to the proper file&lt;/span&gt;&lt;br /&gt;if ($request_uri = /) { set $zoomuri $zoomuri$mzi; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Append the "ZOOM_INDEX" to the file category path&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&lt;b&gt;set $zoomg $zoomg$mzi;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;&lt;/span&gt;&lt;span style="color: #999999;"&gt;# Now clean the filename of irregular characters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #3d85c6;"&gt;&lt;b&gt;if ($zoomg ~ (.*)/price/([0-9]+),([0-9]+)(.*)) { set $zoomg $1/price/$2%2C$3$4; }&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;I realize that for many unfamiliar with NGINX, this could be intimidating. Hopefully the comments will guide you in making customizations that your own Magento installation may require.&lt;br /&gt;&lt;br /&gt;This code belongs above "&lt;b&gt;location / {&lt;/b&gt;" &amp;nbsp;and should be sufficient to locate the proper Zoom full-page cache file that corresponds to the Magento page. If this page is not found, NGINX will seamlessly push the request to the PHP handler (and the page will be created for next time).&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;            Using Zoom's category URL rewrite option&lt;/h4&gt;Zoom FPC gives you the additional option of creating clean Magento navigation URLs (but you need to block redundant content with "&lt;i&gt;robots.txt&lt;/i&gt;"). The following URL: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;http://www.example.com/cat1.html?p=1&amp;amp;dir=asc&amp;amp;limit=9&amp;amp;mode=grid&amp;amp;order=price&amp;amp;price=2,10&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Becomes &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;http://www.example.com/cat1.html/zget/p/1/dir/asc/limit/9/mode/grid/order/price/price/2,10&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;Handling these works in much the same manner as before. &lt;u&gt;Replace&lt;/u&gt; the two blue lines given above with the following block: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;set $match &amp;nbsp; &amp;nbsp;"";&lt;br /&gt;set $matchbool 0;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;&amp;nbsp;# Is the URL a rewritten category URL?&lt;/span&gt;&lt;br /&gt;if ($request_uri ~ (.+)/zget/p/([0-9]+)(.*) ) { &amp;nbsp;set $zoomg $zoombase$1$zget/p/$2; set $match $3; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Are we looking for a specific tool bar state?&lt;/span&gt;&lt;br /&gt;if ($match ~ /dir/([a-z]+)/limit/([0-9]+)/mode/([a-z]+)/order/([a-z]+)(.*)) { set $zoomg $zoomg$match$mzi; set $matchbool 1; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Otherwise, return the default state for that page&lt;/span&gt;&lt;br /&gt;if ($matchbool = 0) { set $zoomg $zoomg$mzi; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #999999;"&gt;# Now clean the filename of irregular characters&lt;/span&gt;&lt;br /&gt;if ($zoomg ~ (.*)/price/([0-9]+),([0-9]+)(.*)) { set $zoomg $1/price/$2%2C$3$4; }&lt;/div&gt;Simple enough? Maybe not, but by letting NGINX serve up your Zoom cache pages directly, there is little doubt that you will have one of the fastest stores around.&lt;/div&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;     Finishing up&lt;/h4&gt;You may notice that when NGINX serves a cached page, it is downloaded directly to your browser. If you come across this situation, the following line in your location directive seems to remedy this: &lt;br /&gt;&lt;div class="rounded-corners code-box"&gt;&lt;ul&gt;&lt;li&gt;default_type text/html;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Another aspect to explore is debugging and determining which pages are being served by the webserver, and which ones are being served by PHP. One simple approach, after PHP generates the cache, is to run phpinfo(); at the start of index.php and exit the program prior to Zoom's retrieval mechanism. So if you see the store page,&amp;nbsp;NGINX is pulling from the cache. If you do not, there is something wrong with your configuration.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I realize that I may have taken a few of you down the rabbit-hole with this DIY course in&amp;nbsp;NGINX configuration, but I strongly feel that it is important to teach my customers how to get the most of Zoom (so they can get the most of their Magento store). If you need further clarification or direct aid, please contact us.&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=QOxMFh_buHo:eLvLP04Ay_4:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=QOxMFh_buHo:eLvLP04Ay_4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=QOxMFh_buHo:eLvLP04Ay_4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=QOxMFh_buHo:eLvLP04Ay_4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/QOxMFh_buHo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/6716869058877789033/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/setting-up-zoom-full-page-cache-with.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/6716869058877789033" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/6716869058877789033" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/QOxMFh_buHo/setting-up-zoom-full-page-cache-with.html" title="Setting up Zoom Full-Page Cache with Magento &amp; NGINX" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-pWjK85jGSiY/T2WZcYSTjxI/AAAAAAAAAF8/8uQuQGjmRiI/s72-c/nginx-magento-zoom.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/setting-up-zoom-full-page-cache-with.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-4487407322032999951</id><published>2012-03-18T06:14:00.001-07:00</published><updated>2012-03-31T18:40:06.958-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="zoom" /><category scheme="http://www.blogger.com/atom/ns#" term="nginx" /><category scheme="http://www.blogger.com/atom/ns#" term="ezapps" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><category scheme="http://www.blogger.com/atom/ns#" term="ecommerce" /><category scheme="http://www.blogger.com/atom/ns#" term="full-page cache" /><title type="text">Introducing ZOOM: The Magento Full-Page Cache</title><content type="html">&lt;div class="separator" style="float: right; margin-left: 8px;"&gt;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;&lt;img alt="EZAPPS ZOOM: The Magento Full Page Cache" border="0" height="200" src="http://4.bp.blogspot.com/-O5wkLvlcpXw/T2UiRYys21I/AAAAAAAAAF0/e4U2K8-PB2c/s200/zoomlogo-large_1.jpg" title="Shift Magento into overdrive with EZAPPS Zoom FPC" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href="http://www.ezapps.ca/zoom-magento-full-page-cache.html"&gt;EZAPPS Zoom&lt;/a&gt; is a feature-rich full-page cache mechanism for &lt;b&gt;&lt;a href="http://www.magentocommerce.com/"&gt;Magento&lt;/a&gt;&amp;nbsp;CE&lt;/b&gt;, designed for webserver integration. It includes block-level "hole-punching", versatile cache controls, event &amp;amp; time-driven invalidation, GZIP compression, multi-currency &amp;amp; language support and much more. Best of all, it is now open-source and completely free.&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;          Creating Zoom&lt;/h4&gt;Almost anyone who has worked with Magento has experienced that the power of this platform is unfortunately offset by its speed. While facing this dilemma a few weeks ago, a very simple thought occurred to me: &lt;i&gt;what if I could save a rendered Magento page to a basic file location that a webserver can access and serve?&lt;/i&gt; And within a couple of minutes, I had &lt;a href="http://nginx.org/"&gt;NGINX&lt;/a&gt; spitting out Magento pages in thousands of a second--almost immediately, I knew I was on to something big.&lt;br /&gt;&lt;br /&gt;But there was a long path before me on this project.&amp;nbsp;First, I had to remove personalized content from these pages like cart information (aka "&lt;b&gt;Hole-Punching&lt;/b&gt;"). Simply creating edited template files would never accomplish this competently--this approach would leave a mess for anyone implementing the cache on a custom design. So I looked beyond the template files and decided to punch at block level, targeting a plethora of personalized blocks. And when I implemented this on my custom design, I couldn't have been more pleased with the time it saved me in the long run--I never had to touch a line of code in the layout and template files.&lt;br /&gt;&lt;br /&gt;Next, there was the matter of controlling which pages to cache and which to ignore. My first thought: &lt;i&gt;why build a comprehensive full-page cache mechanism and only allow a few different modules to interact with it?&lt;/i&gt;&amp;nbsp;So as a developer, along with standard controls for Categories/Products/Reviews/CMS pages, I included regular expression matching at both the URI and module level. This allows you to target pages for inclusion and exclusion at a very micro level, letting you cache or ignore virtually any page. I rounded this component off with time and event-driven invalidation so store owners can focus on running their stores instead of managing more infrastructure.&lt;br /&gt;&lt;br /&gt;On our last pass, we made sure it can play well with multi-currency and multi-language sites, and handle almost any situation that we can predict. As a bonus, to reduce your miss rates we've included an optional feature to clean up and normalize your category URLs. To top it off, we've also added the ability to GZIP the cache, which can save you a dramatic amount of bandwidth that you don't have to pay for anymore. Let us know if you think there is anything we missed!&lt;br /&gt;&lt;br /&gt;&lt;h4 class="entry-title"&gt;         In the end, there was Zoom&lt;/h4&gt;&lt;a href="http://www.ezapps.ca/"&gt;EZAPPS&lt;/a&gt; is proud of our first commercial extension, and we are very happy with how it turned out. And when we deployed Apache Bench this weekend, we just became that much happier. We feel that the results speak for themselves: &lt;br /&gt;&lt;div id="chart_div" style="height: 300px; margin-left: auto; margin-right: auto; width: 570px;"&gt;&lt;/div&gt;&lt;script src="https://www.google.com/jsapi" type="text/javascript"&gt;&lt;/script&gt;     &lt;script type="text/javascript"&gt;      google.load("visualization", "1", {packages:["corechart"]});        google.setOnLoadCallback(drawChart);        function drawChart() {          var data = new google.visualization.DataTable();          data.addColumn('string', 'Configuration');          data.addColumn('number', 'Total Time (seconds)');          data.addRows([    ['Standard Magento', 10.69],    ['Magento + Zoom + PHP', .7829],    ['Magento + Zoom + NGINX', .366975],          ]);            var options = {            title:  'Zoom Benchmark Results (100 requests, 10X concurrency)',            vAxis:  {title: 'Configuration',  titleTextStyle: {color: '#3f90ae'}},     hAxis:  {title: 'Total time (seconds)',  titleTextStyle: {color: '#3f90ae'}},            series: {0:{color: '#4ba6c8'}},            width: 570,            height: 300,            legend: {position: 'none'}          };            var chart = new google.visualization.BarChart(document.getElementById('chart_div'));          chart.draw(data, options);        }       &lt;/script&gt;   Remember as a new developer, we are going to live or die based on how many people can hear about us and use our products--especially at these prices. So please, if you wish to see more great extensions from us (and we have some major projects in the works), tell your friends' friends. Let's continue to build this community together and solidify Magento's place in the ecommerce world.&lt;br /&gt;&lt;br /&gt;For a limited time, the first 50 customers who order from us using coupon "&lt;b&gt;ZOOM&lt;/b&gt;" will get $5 dollars off!&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=K2ooRMf08nw:BCDcn1OxT14:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=K2ooRMf08nw:BCDcn1OxT14:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=K2ooRMf08nw:BCDcn1OxT14:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=K2ooRMf08nw:BCDcn1OxT14:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/K2ooRMf08nw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/4487407322032999951/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/introducing-zoom-magento-full-page.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/4487407322032999951" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/4487407322032999951" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/K2ooRMf08nw/introducing-zoom-magento-full-page.html" title="Introducing ZOOM: The Magento Full-Page Cache" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-O5wkLvlcpXw/T2UiRYys21I/AAAAAAAAAF0/e4U2K8-PB2c/s72-c/zoomlogo-large_1.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/introducing-zoom-magento-full-page.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5521908772546073120.post-7283019940232759133</id><published>2012-03-08T12:01:00.001-08:00</published><updated>2012-03-08T20:40:07.703-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="e-commerce" /><category scheme="http://www.blogger.com/atom/ns#" term="ezapps" /><category scheme="http://www.blogger.com/atom/ns#" term="magento" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="php" /><title type="text">Into the fray</title><content type="html">Here at &lt;b&gt;&lt;a href="http://www.ezapps.ca/"&gt;EZAPPS&lt;/a&gt;&lt;/b&gt;, we’ve finally decided that it is time to toss our hat in the ring and become a full-fledged software provider for the &lt;a href="http://www.magentocommerce.com/"&gt;&lt;b&gt;Magento E-commerce Platform&lt;/b&gt;&lt;/a&gt;. This most certainly isn’t a hasty decision, as we have been designing our core offerings for almost a year now—though, our first public product is not part of that initial plan.&lt;br /&gt;&lt;br /&gt;Frankly, it was 5 quick lines of PHP code and a simple idea that woke us from our methodical slumber two weeks ago. And 3000 lines later, this concept morphed into a product that I feel transforms Magento towards a goal of dominating e-commerce platforms (and once we have an actual store put together, you get to find out what it is). &lt;br /&gt;&lt;br /&gt;But the best news of all is that we are practically giving it away—and not just for the publicity (but be sure to tell your friends anyway). First off, I want EZAPPS to become synonymous with “Magento”. In one way or another, every Magento store should know us by name and use at least one of our offerings—we are willing to do whatever we must to make this possible. Secondly, it took us only a week to finish the programming, working a few hours each night. Considering this, and the fact that this extension isn’t part of our “big plans”, why not be reasonable?&lt;br /&gt;&lt;br /&gt;And lastly, we want the Magento community to strengthen and grow exponentially, and this involves helping new merchants unlock the potential of this platform without immediate and immense out-of-pocket costs. I’ve too often seen people hooked on the elegance of Magento Community, but shortly faced with the decision to turn to Enterprise or turn away entirely. We have an incredible e-commerce/cms platform here, and I feel that it is time to fill in the holes and nurture the community that has supported it thus far.&lt;br /&gt;&lt;br /&gt;We head into this field with the mindset of offering affordable, transformative extensions that will grow the Magento community along with your sales. We know big ideas can be easy—and they are right around the corner.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;If there is any lacking functionality that you feel that Magento just can’t live without, &lt;a href="mailto:ezapps.software@gmail.com"&gt;drop us a line&lt;/a&gt; so we will see what we can do.&lt;/span&gt;&lt;/i&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:4cEx4HpKnUU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=PhLoJJv6qtw:l-FdTWHh9xg:4cEx4HpKnUU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=PhLoJJv6qtw:l-FdTWHh9xg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?i=PhLoJJv6qtw:l-FdTWHh9xg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Ezapps?a=PhLoJJv6qtw:l-FdTWHh9xg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Ezapps?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Ezapps/~4/PhLoJJv6qtw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://journal.ezapps.ca/feeds/7283019940232759133/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://journal.ezapps.ca/2012/03/into-fray.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/7283019940232759133" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5521908772546073120/posts/default/7283019940232759133" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Ezapps/~3/PhLoJJv6qtw/into-fray.html" title="Into the fray" /><author><name>Ezra Morse</name><uri>https://plus.google.com/113882198042899179929</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh6.googleusercontent.com/-VN5th3ZQVFE/AAAAAAAAAAI/AAAAAAAAAHc/DnTk30CMBug/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://journal.ezapps.ca/2012/03/into-fray.html</feedburner:origLink></entry></feed>
