Lucee undocumented
Gert Franz, Rasia Switzerland
About me
- Gert Franz
- Involved with Railo since day 1
- Into CFML for 16 years
- DBA, System architect
- CTO Rasia Ltd, CIO Rasia CH
- Rasia is founding Member of the Lucee association
My evolution
Assembler > Basic > Clipper > Pascal > Delphi > Java > CFML > Lucee
What is this about?
ONE DOES NOT SIMPLY
DOCUMENT EVERYTHING HE HAS CODED
What does undocumented mean?
- Documentation is improving (docs.lucee.org)
- Some things are either not known to the CFML community
- or just simply not documented
What will we be looking at?
- Administration of Lucee
- Coding gems
- Unknown functionality
- Other gems / uncategorized
- Tips and tricks
Lucee Administrators
Tips and tricks around the administration
Configuration XML
- Let's have a look at the XML first
- location and structure
Reset the Lucee Admin password
- At the top of the Lucee administrator XML's you will find the following entry
<cfLuceeConfiguration
default-hspw="23d82bcab39f7cbfc41e2e9f5d539482ae76d86646e58e113166f0f370da06b0"
hspw="23d82bcab39f7cbfc41e2e9f5d539482ae76d86646e58e113166f0f370da06b0"
salt="F7323339-8891-474F-B59F0D00CCB8BAB3" version="4.5">
<cfabort/>
...
<cfLuceeConfiguration>
Compiling into RAM
- This can speed up your server's performance
- Can be changed to any resource
<file-system
deploy-directory="zip://d:\Gert\Lucee\classes.zip!cfclasses"
fld-directory="{lucee-web}/library/fld/"
temp-directory="{lucee-web}/temp/"
tld-directory="{lucee-web}/library/tld/">
</file-system>
<file-system
deploy-directory="ram://cfclasses"
fld-directory="{lucee-web}/library/fld/"
temp-directory="{lucee-web}/temp/"
tld-directory="{lucee-web}/library/tld/">
</file-system>
Lucee constants
- If you have inspected the XML, you probably have noticed these entries
- You can also define your own constants
<!--
Path placeholders:
{lucee-web}: path to the lucee web directory typical "{web-root}/WEB-INF/lucee"
{lucee-server}: path to the lucee server directory typical where the lucee.jar is located
{lucee-config}: same as {lucee-server} in server context and same as {lucee-web} in web context}
{temp-directory}: path to the temp directory of the current user of the system
{home-directory}: path to the home directory of the current user of the system
{web-root-directory}: path to the web root
{system-directory}: path to the system directory
{web-context-hash}: hash of the web context
-->
<constants>
<constant name="log-file-dir" value="/storage/logfiles/myWeb" />
</constants>
Copy the XML file to maintain settings
- at startup the configuration is read from XML
- This means you can "export" it
- Copy the file to any new context
- Settings are maintained
Using the DEPLOY folder
- located in the Lucee server directory
- can be used to install extensions
- can also be used for upgrading Lucee
While we are at it
- drivers and templates for Lucee are located in
/lucee-server/context/context/admin
- In there you will find all different kind of drivers
- Database Drivers (configure your own)
- Event gateway drivers
- Cache drivers
- log drivers
- Also the global debugging templates are located there. You can edit them (but be aware, that they might be overwritten in case of an update)
- Server admin plugins are stored there as well
Compile mappings - Lucee archives
- You are all familiar with mappings
- In Lucee there are tons of more possibilities
- Compile mappings is very useful when
- When converting from ACF to Lucee
- Trying to reduce the performance hit for the first page request
- Check for Lucee errors
- Create an archive for source protection and performance
Debugging
- Use a different debugging template
- much more information to find
- especially about unscoped variables
- scope-checker at 100% hit ratio
- but be careful, it consumes 30% of performance
Lucee Quarantine mode
- Lets you run Lucee in a READONLY way
- This means that Lucee will NOT compile any CFM files anymore
- Protects you from exploits (happened several times)
- Only code you trust will be actually executed on your server
- Additional RSA encryption possible
- Deploying an application with the CFDEPLOY tool
Other mapping tricks
- Map to a resource
- Resources usable are:
- RAM
- ZIP
- FTP
- HTTP
- Database
- S3
- SFTP
Coding Gems
Lots of unknown or hidden stuff regarding coding with Lucee
cfapplication action="update"
- Have you ever
- wanted to load mappings from a database
- store configuration in a separate file
- add mappings to existing ones
- configure other application settings at a later time?
- Let's have a look
sleeping and other nice additions
- Sometimes it is necessary to pause the code
- I mostly use it in event gateways or to visualize an effect (eg. long running query)
- Look at the following code. It contains some nice additions in Lucee
<cfscript>
myArr = "1,2,3,4,5".listToArray();
myArr.append(6).append(7).append(8).append(9).append(10);
myArr.each( function(iValue) {
sleep(1000);
echo(iValue & "<br>");
flush;
}, true, 2);
</cfscript>
how about loops
- Looping is possible in many ways
- index and item confusion
- key and value introduced
- looping over dates possible
- for in works with all kinds of types
- let's have a look
other nice coding additions
- Cached functions
- Handling the page cache
- Closures for filters
Unknown functionality
Functions or tags few people know or use
Query functions
- querySlice(), querySort()
- queryColumnData()
- useful when query columns are dynamic
- when columns contain complex data
- While we are at queries...
- cfquery returntype
Documentation functions
- getFunctionList()
- getFunctionData()
- getTagList()
- getTagData()
Other functions
- getCurrentContext()
- pagePoolList()
- pagePoolClear()
- _internalRequest()
- fileInfo() - similar to CFFILE action="info"
- isEmpty()
- contractPath()
- htmlParse()
Trial and error
- CFRETRY tag
- allows you to retry a failed action
- Have a look at the following code
- Planned for Lucee 5.2
- cftimeout time="10"
- expects the surrounded code block to execute within 10s, otherwise an exception is thrown
<cftry>
<cffile action= "write" file="D:\test\myFile.txt">
Some content for the file.
</cffile>
<cfcatch>
<cfif !directoryExists("D:\test")>
<cfdirectory action="create" directory="D:\test">
<cfretry>
</cfif>
</cfcatch>
</cftry>
Other Gems
Other gems hidden in Lucee
Gems in CFScript
- You can use <> in cfscript
- or all other boolean JS operators
- === checks for same instance
- general usage of tags in cfscript
- assigning results to new variables
Miscelaneous
- All pathes (except include) can be absolute or relative
- cachedWithin accepts the value "request"
- cachedWithin can also be a number
Extending Lucee
- Do you have a library you use in your company?
- You would like to extend the functionality of Lucee tags?
- Write them yourself
- Either for one Context or global
- Just by writing one single file
- Caution: overwrites existing functions
One of my favorite gems
- CFAdmin action="surveillance"
- Allows you to see what runs on your server
- Returns an array with all running requests
- contains very interesting information
- all debugging information
- all variables
- CGI scope
- Request scope
- and a lot more
How about another CFAdmin gem
- CFAdmin action="reload"
- You know now that the complete configuration is stored in the lucee-web.xml.cfm and lucee-server.xml
- these are loaded when the server starts and whenever a change is made in the admin
- if you change the admin file directly (or copy it) reload it with the above code
Tips and tricks
Things that make your life as a Lucee dev easier or faster
Using CFDump
- first of all there are some nice attributes
- eval
- output = "debug"
- format = "simple" (for email & Outlook)
- showUDFs = "false"
- Just hover over any part and you'll see where the dump comes from
- Check out all the attributes under:
/lucee-server/context/library/tag/dump.cfc - Define the default attribute value like this:
- this.tag.cfdump.format="simple";
Lazy queries
- Normally when you pull a query, Lucee:
- Opens a connection to the database
- Executes the query on the DB
- Returns the data
- Converts the Java resultset into a Lucee Query
- Welcome Lazy queries. Now Lucee
- Opens a connection to the database
- Executes the SQL on the DB
- only returns the number of records (invisible for the user)
- Keeps the connection open while you browse through the records
Parallel threads in the each functions
- Usable with any each function
- Very useful when every operation is more time consuming
- Finishes when all threads are done
- by default uses 10 threads
- Not adviseable for fast operations (<5ms)
Using the class files
- Nice little gem regarding the class files
- can be used instead of the actual CFM file
- just needs to be named exactly as the original
- can be used to protect single files
- let's try it out
coding tips and tricks
- cfthread type task
- dynamic function calls
- getMetaData
- onRequest call even without the file existing
- tag default attributes
- trace action="follow"
- using returnvalues from functions as variables somefunction()[3]
Lucee undocumented
By Gert Franz
Lucee undocumented
- 3,027