Sorcerer's Tower

Railo

Railo is the best CFML engine.

I guess you'll be wanting me to validate that statement? Well I'll make a start on that in a moment, but first I think I'll post a few disclaimers to pre-empt any potential whiney people.

I have nothing against Adobe, NewAtlanta, CFMX, nor BlueDragon. They're both great companies/products - without the company formally known as Allaire, I'd never have had my life enriched by the joy that is ColdFusion - and BlueDragon is no doubt a fine product if you find yourself stuck using that .NET thing. ;)

But Railo is better than both of them, and here's why:


Price

Like BD, Railo has a free "community" edition, which may be used for non-commercial use.
(NewAtlanta describe non-commercial as non-SSL; Railo doesn't give a clear definition, although they do mention 'low budget business applicants', so I'd say it's more or less the same thing)

However, when it comes to the "professional" edition, Railo costs a quarter of the price of BlueDragon - which itself is just over two-thirds the price of CFMX Standard.

Allow me to draw a little chart to put these values in perspective:

|      Railo                    BlueDragon    CFMX Standard
|--------++------------------------++--------------++
|       $250                      $900            $1300
|

With such a low price, you might think Railo is missing something important, so lets take a look...

Features

Like BlueDragon, Railo aims for CFMX6.1 compatibility, and then adds a selection of sensible enhancements. First, lets look at the list of 6.1 tags which Railo does not currently support: cfapplet, cfcache, cfchart, cfchartdata, cfchartseries, cfgrid, cfgridcolumn, cfgridrow, cfgridupdate, cfprocparam, cfprocresult, cfstoredproc, cfproperty, cfreport, cftree, cftreeitem.

If any of those are important to you, you'd need to find or create a custom tag.

There is only one 6.1 function which Railo does not currently support: GetException().

Other restrictions which may or not affect you include: No CORBA objects; no NTLM support for cflogin; no implicit date parsing; and a few other things.

So, what new features do you gain in return for those sacrifices?

Tag-wise, there are a few new tags that are nothing special, but a couple of rather cool enhancements to existing tags...

Anyone that has to debug scripts should know how useful the cfdump tag is. And thanks to Railo's eval attribute, cfdump is now even better. No longer must you tediously surround variable names with hashes and add a label to distinguish your dumps. You can now do this: <cfdump eval="Form"/> and Railo will interpret it in the same way as <cfdump var="#Form#" label="Form"/>

A very simple thing, though possibly my favourite Railo enhancement.

For anyone not jumping for joy at this brilliant shortcut, here is a new feature which you will hopefully find very useful: file reading with cfloop.

Fed up with having to load a huge file just to read a few lines from it? Then this enhancement is for you:

<cfloop filename="./myfile.txt" index="line" startline="3" endline="7">
    ...
</cfloop>

Cool huh? Oh, and see how that filename is relative? That's another Railo enhancement. No more must we suffer the ridiculous curse of ExpandPath!

Now, here's a new function for anyone who loves being able to create their own queries, but screams at having to endure the process of creating them. Whilst Railo still supports QueryNew(), QueryAddRow(), and QuerySetCell(), it can now do all that in one function:

<cfset MyQuery = Query
	( name: Array('Alex','Ben','Charlie')
	, age: Array(25,13,29)
	, country: Array('UK','IE','CA')
	)/>

If you've got sharp eyes you might have spotted another of Railo's new functions: Array(). Filling a similar role, it allows you to instantly initialise an array with any content, unlike ListToArray() which only allows strings, Array() allows you to do stuff like this:

<cfset MyArray = Array(1, 'Bob', Array('Tomato','Orange',5), GetSomething())/>

And can you guess what's coming next? Yep. Struct(). Same concept:

<cfset MyStruct = Struct
	( code:'GBP'
	, label:'Pounds Sterling'
	, symbol:Chr(163)
	)/>

Whilst there are several more enhancements I've not mentioned, I'll finish this section with a mention of just one more: nulls.

Railo provides you with the nullValue() function for creating nulls, and the isNull() function for testing against them.


So, despite being cheaper, it has good compatibility and a whole host of handy enhancements. You still looking for a catch?

Performance

Railo is just as fast as CFMX7.

Below are the results of running OpenWebLoad against the cfPetMarket Fusebox application. I ran the tests at the same time, and the source code used was identical.

For ColdFusion I used the "Microsoft Access" datasource type. For Railo I had to first create an ODBC datasource and then use Railo's "JDBC-ODBC bridge" to connect to that.

Railix 1.0.0.026
Total TPS: 1.88
Avg. Response time: 2.553 sec.
Max Response time: 6.493 sec
Total Requests: 117
Total Errors: 0
ColdFusion MX 7.0.1.116466
Total TPS: 1.94
Avg. Response time: 2.513 sec.
Max Response time: 6.905 sec
Total Requests: 121
Total Errors: 0

Both are development versions, on my development machine at work (a 3GHz P4 with 1GB RAM), with debugging turned on.

(If you're wondering why I haven't included BlueDragon, that's because OpenWebLoad is returning nonsense figures for it, that simply don't match up with what I'm getting in my browser. But going by debug numbers it looks to be around the same values as CFMX7 and Railo. I plan to do more tests once I have found some better software.)

Summary

So, Railo performs at the same speed, has many great features, and is considerably cheaper.

What are you waiting for? Hurry over to railo.ch/en and get your copy today!