Jump to content

Module: AIOM+ (All In One Minify) for CSS, LESS, JS and HTML


David Karich

Recommended Posts

As would I. Currently I have a foreach pushing the list into an array and using that but if I could use the FilenameArray it would simplify my code a great deal.

$min_js = array();
foreach($config->scripts as $script){
	$min_js[] = $script;
}
if(count($min_js)) echo '<script src="'.AIOM::JS($min_js).'"></script>';

I'm not sure about my foreach since it could be run on an empty $config->scripts but I don't know how best to check a FilenameArray is not empty, count() returns 1 when it's empty usually.

  • Like 1
Link to comment
Share on other sites

What sort of hosting are you using, vxda? 

I sometimes come across this on Cloud hosting where shared NFS storage is used. Not just in this module, but also the core PW modules cache file, before that was moved to the new DB-backed WireCache class.

I've had success when removing the LOCK_EX parameter on file_put_contents calls. For this module, it's in two places - lines 464 and 111.

Link to comment
Share on other sites

Hi, for some reason module create empty files. Anyone else got same problem ?

I had this problem before I realised that the scripts and CSS files are relative to the templates directory. Check you're not using link relative to the site root.

Link to comment
Share on other sites

Some brief feedback after using this module (V 3.1.3) on a project with PW 2.4. All in all a great tool for reducing page load times.

There's an issue about this on Github and it will probably be addressed once the developer gets back from a trip but it took me a while to find so I'll mention that the cache ids are made from the modtime of the file(s). If you FTP files which arrive in the same second they will try to use the same cache file and your pages will be a mess. I suggested a fix.

When using dev tools in browsers to inspect elements and peek into CSS files you'll be seeing the cache file filenames (md5 gibberish). I made a small modification to list the file path(s) at the top of the file. Sort of contrary to minifying but useful.

EDIT: This idiom comes in handy to minimize only files in a certain folder. I do something just like it for 'styles' too. This way if I put URLs to external popular libraries (already minimized) in $config scripts they are left alone:

foreach ($config->scripts->unique() as $path){
    if(preg_match('#^'.$config->urls->templates.'scripts(.*)#',$path,$m)) $path = AIOM::JS('scripts'.$m[1]);
    echo '    <script type="text/javascript" src="'.$path.'"></script>'.PHP_EOL;
}    

 

  • Like 1
Link to comment
Share on other sites

  • 1 month later...

Hi David! Any thoughts on changing the compression library yet? I'm getting this suggestion from google page speed insights:
 

Minify JavaScript for the following resources to reduce their size by 1KiB (4% reduction).

Minifying http://…m/js_8d0a111a71c0967baaa819dcafec03f2.js could save 1KiB (4% reduction) after compression.

Link to comment
Share on other sites

  • 1 month later...

Hey David, 

what a useful module! Thank you so much.

Does anyone else have issues with inline svg graphics? During the compression it seems like the AIOM-Module is breaking up. Perhaps wrong escaping?

background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHB vcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4wLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLVNWRy0yMDAxMDkwNC9EVEQvc3ZnMTAuZHRkIj4NCjxzdmcgdmVyc2lvbj0iMS4wIiBpZD0iRWJlbmVfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiDQoJIHZpZXdCb3g9IjAgMCAyMCAyOSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjAgMjkiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggaWQ9InBob25lLTItaWNvbiIgZmlsbD0iI0ZGRkZGRiIgZD0iTTEzLjc5OCwyOC45MDRDMTMuNzk4LDI4LjkwNCwxMy43OTgsMjguOTA0LDEzLjc5OCwyOC45MDQNCgljLTEuNTY5LDAtMy4xNTctMC43NDctNC43MjEtMi4yMTljLTEuODM0LTEuNzI2LTMuNzQ2LTQuNTU3LTUuNjgzLTguNDE1QzAuNjUxLDEyLjgwOS0wLjQxMiw4Ljc1NiwwLjE0Miw1Ljg4DQoJQzAuNzM0LDIuODExLDIuNjQ0LDIuMDM0LDYuNzM4LDAuMWw0Ljc0OSw5LjQ1NWwtMy4xNzIsMS41OTNjLTAuMTQxLDAuNCwwLjAyNSwxLjkzMiwxLjA3OCw0LjA1NQ0KCWMxLjA3NiwyLjE3LDIuMjIzLDMuMjUyLDIuNjM2LDMuMzgzYzAuMTg2LTAuMDkxLDMuMTctMS41OCwzLjE3LTEuNThsNC44LDkuNDQ4QzE2L jE3NCwyOC4zNjgsMTUuMzY5LDI4LjkwNCwxMy43OTgsMjguOTA0eg0KCSBNMi41NDksNi4zNDRDMi4yNDUsNy45MiwyLjUyNSwxMS4wNzgsNS41ODQsMTcuMTdjMS44MDgsMy42LDMuNTQ4LDYuMjAxLDUuMTczLDcuNzNjMS4wOTUsMS4wMywyLjExOCwxLjU1MiwzLjA0MSwxLjU1Mw0KCWMwLjc4OCwwLDEuMzUzLTAuMzEzLDIuOS0xLjA4NmwtMi41ODEtNS4wODFjLTAuODM0LDAuNDE3LTEuMDMyLDAuNTE0LTEuMDkzLDAuNTQzYy0xLjc5MywwLjg3NS0zLjU3Mi0wLjkzMy00LjcwOS0yLjYxMQ0KCWMtMC45OTUtMS40NjgtMS44MjgtMy4yNzktMi4yMjgtNC44NDRDNS4zOCwxMC42MTQsNi4yMzEsOS40ODksNy4wNyw5LjAzMWwwLjAzOC0wLjAybDEuMDg5LTAuNTQ3bC0yLjU2MS01LjENCglDMy44NjgsNC4yNTQsMi44ODQsNC42MDcsMi41NDksNi4zNDR6Ii8+DQo8L3N2Zz4NCg==')




			
		
Link to comment
Share on other sites

  • 2 weeks later...
Hey guys, 

sorry for the late feedback. I currently have so much with my company around the ears and stuck in large projects that I currently have no time to maintain AIOM+. I'm sorry. The project will continue to maintain. 

Did any of you like to take care of to AIOM+? At best a German developer. Then I give him on Github access to the Repositority. 

Dave

  • Like 3
Link to comment
Share on other sites

Hi David,

I'd be glad to take care of AIOM. I'm coming from the South of Germany.

I work together with @phil at Conclurer, a web development company. 

If you want to, I can send you my personal mail address so that we can talk about AIOM.

Thanks in advance,

Marvin

  • Like 11
Link to comment
Share on other sites

Hi David,

I'd be glad to take care of AIOM. I'm coming from the South of Germany.

I work together with @phil at Conclurer, a web development company. 

If you want to, I can send you my personal mail address so that we can talk about AIOM.

Thanks in advance,

Marvin

Hi Marvin, 
 
perfect. With you, the project is certainly in good hands. Send me please your contact information, then we can talk about AIOM. 
 
Thanks and best regards from Cologne. 
Dave
  • Like 2
Link to comment
Share on other sites

  • 2 weeks later...

Calling AIOM/chmod experts...

Just today a whole website of mine using AIOM ceased to function.

Precicely 1 month after installing AIOM on the site, I was getting a 500 error. Looking at the PW log file I saw countless repetitions of...

2014-10-18 15:59:18	guest	http://***.com/?/	Error: 	Exception: The permissions (chmod) to delete old cache files could not be changed. (in /srv/***/www/***.com/public_html/site/modules/AllInOneMinify/AllInOneMinify.module line 646)

So, I guess one or more of my cached files had hit a 30 day expiry date.

I did a bit of investigating, and it seems that before deleting cache files, AIOM like to chmod 777 the file. If it can't chmod the file, it throws this error and stops the site loading. No logging into PW admin, nothing.

It seems similar to this problem here:

https://github.com/ryancramerdesign/ProcessWire/issues/648

And the exact line of code in question is highlighted by Ryan there. https://github.com/FlipZoomMedia/ProcessWire-AIOM-All-In-One-Minify/blob/AIOM%2B/AllInOneMinify.module#L641... It's line 646.

Is there any real need to change the permissions to 777 before deleting?

The problem in my case is that www-data doesn't own these files. I copied this installation over from another server, and the owner (chown) is actuall "admin". But I have group rw permission to www-data, so the files can be deleted. I think that should be okay, right?

So, what I did was comment line 646 and added the following three lines

        // ------------------------------------------------------------------------
        // Remove all files that are older than the maximum lifetime.
        // ------------------------------------------------------------------------
        foreach ($_cacheFiles as $_cacheFile) {
            if (((filemtime(wire('config')->paths->assets.self::$cacheDir.DIRECTORY_SEPARATOR.$_cacheFile->getFilename()) + self::$cacheMaxLifetime) < time() OR $force_all === true) AND is_file($_cacheFile)) {
                $_file  = wire('config')->paths->assets.self::$cacheDir.DIRECTORY_SEPARATOR.$_cacheFile->getFilename();
                if(chmod($_file, 0777) !== false) {
                    if(unlink($_file) === false) {
                        throw new WireException('The old cache files could not be deleted.');
                    }
                } else {
                    // throw new WireException('The permissions (chmod) to delete old cache files could not be changed.');
                    if(unlink($_file) === false) {
                        throw new WireException('The old cache files could not be deleted.');
                    }                    
                }
            }
        }

And now everything seems to work again.

Stuff like this sort of scares me. The last thing I want is for sites to completely and arbitrarily stop working!

  • Like 1
Link to comment
Share on other sites

Hello everybody,

I'm happy to announce that David and I have negotiated, how to continue both development and support of the AIOM module.

This is our deal:

  • Conclurer will develop and support the AIOM module from now on
  • David will continue developing once he'll have more time available

Therefore, the repository has been migrated to a new URL: https://github.com/conclurer/ProcessWire-AIOM-All-In-One-Minify

At Conclurer, we are exited to take care of AIOM. For the near future, we're working on necessary bug fixes. We're also planning to release a new major version (AIOM 4) within the next months. 

For any new bugs in the current version of AIOM: please open a ticket on our GitHub repository.

Thank you in advance,

Marvin

  • Like 9
Link to comment
Share on other sites

Hello everybody,

We've just updated AIOM to Version 3.1.4. This is a minor update including the following changes:

  • Bugfix: CacheFiles for Pages are now deleted when a new minimized file is created
  • Bugfix: An error is thrown if the document root is different to ProcessWire's base path

If you find additional bugs or have some feature wishes, please open up a ticket at our GitHub repository.

Thank you!

Marvin

  • Like 6
Link to comment
Share on other sites

  • 1 month later...

Hey guys, i am trying this module out on my development (Local) server before deploying to staging server.

I am currently having an issue with CSS URL rewrites. My Local implementation of processwire for the site I am developing is at 

http://localhost/sitename/

I have tried with config file to add host 'localhost' and 'localhost/sitename'. Neither seems to make a difference the module is rewriting to 

http://localhost/site/templates/css/{fonts or icons}/filename

Any ideas what i should be doing, for instance would this work if I moved the directories for fonts and icons up to just under /templates/ ?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...