Cgi and Database (stick to standards)
Sivakatirswami
katir at hindu.org
Sun Feb 10 17:19:57 EST 2008
Bernard Devlin wrote:
> I'm not sure what kind of database requirements you have. But in my
> tests using queries performing multiple joins on several tables
> containing between 1 million and 9 million rows each, Rev cgi
> completely blew away Java and relational databases:
>
> http://lists.runrev.com/pipermail/use-revolution/2008-January/106071.html
>
> If you need multi-user/multi-application update/insert access to the
> data, then Rev is probably not the right solution. For other
> situations, I would say don't dismiss Rev's native data structures
> without thorough testing of the speed differences when compared to a
> RDBMS.
>
> Bernard
>
>
>
We use shell calls to PostGresSql on our server... from inside Rev CGI's
...it's easy if you
know your SQL language... just build a query and send it to the dbase,
get the result.
Then you don't need to worry about drivers and paths to them ....
Sorry for long post, but since Rev CGI is so hot...
Here's a snippet (with finesse from Andre who is a wizard with format...)
for a standard insert query, your insert values (params here) are coming
in from the POST:
function insertEntry pUser, pCode, pTime, pDescr
put format("INSERT INTO event (user_id, event_code, event_time,
description) VALUES ('%s','%s','%s','%s');",pUser, pCode, pTime, pDescr)
into tSQLQuery
put tSQLQuery into url "file:/tmp/Verify.sql"
put format("psql -F $\'\\t\' yourDbase -f /tmp/Verify.sql") into
command_string
# run the SQL commands and send the results back to the calling program
set shellCommand to "/bin/sh"
put shell(command_string) after tSQLQueryResult
return tSQLQueryResult
end insertEntry
Note the little "trick" of writing the query to disk and then calling it
back by reading it into the SQL shell cmd.
You can also push unix style variables to shell like this:
put tWrappedMsg into tMsg
replace cr WITH "\n" in tMsg
put tMsg into $DailyHPIEmail
--put tMsg; exit to top
# Do shell stuff and send mail
set the shellcommand to "/bin/sh"
put "echo -e $DailyHPIEmail | sendmail -f hpi.list at hindu.org " & (fld
"to" of cd "staticText") into tCmd
this works on OSX with PostFix enabled for sending mail ...
But, we never bothered to try that for psql...or maybe we did but it
didn't work.. can't recall...anyway, the pattern of calling your query
from a file means you can keep nicely formated normal SQL queries in
files/libs (or on cards in stacks...) and you don't have to build them
run time in your CGI...they are easier to read, maintain and debug as
separate files...
Have fun...
and a bit of history:
FWIW: There were discussions a year or two ago about how robust this
solution could be without a "persistent Revolution process" someone
replied that he had been using Rev CGI where a new instance was called
each time. he said it scaled up to the millions of hits. No problems.
We only use Rev CGI on our server...
(well almost... PHP is also being called by XOOPS and PMWiki) there
are no persistent processes. a new instance is called for *every* GET
request for every page at http:// www.himalayanacademy.com. We use
include exec SSI's to bring in page chunks, and these trigger Rev CGI's
for *every* single page that is delivered..
<div id="linkList">
<!--#exec cgi="/cgi-bin/local_nav_include.cgi" -->
</div>
pulls in a unique set of side bar links depending on the "realm" where
the page lives
(anyone need that? email me off line)
and meanwhile also I have a custom 404 CGI and redirect that is
constantly firing to handle in coming redirects (mostly mapping short,
"sweet" URL's published in print to their real deep locations)
(I can also send you that too)
Meanwhile other CGI's are doing more robust stuff like processing Credit
card transactions and handling form submissions.... no problem... Now I
can't vouch for more than 30-50 instances a second... what would happen,
but we are in that range right now, Apache and the CPUs hardly blink...
and see no slow down whatsoever. I'm no expert but I think a persistent
Rev process will "die" on the first hard script error... so there are
advantages to just letting Apache load rev on every single call...watch
out for zombies ... if you don't close the cgi properly you can get hung
Rev CGI processes, but, because these are separate instances of Rev...
they don't terminate your web site... just slow it down as each zombie
starts eating the CPU speeds.. I once had up to 8 hung CGI processes
... Nothing "bad" happened... the sites were sluggish but functional
until I got back from a weekend and someone said "your site turned to
cold molasses" or worst case scenario.. I really blew it on a script for
one form and users are getting 404's for that one page only. Whereas if
your persistent Rev Process died and *all* your cgi's were tied to it.
then a single failure will bring down the entire framework for anything
but static HTML delivery... All pages using the "persistent processes"
will start returning errors... depending on how serious the problem is
(you have a wait or something blocking I think the whole engine
stops....) ... But, allowing Apache to call up a single instance of even
a "wonky" rev CGI (I can't figure out why some of them do not terminate
properly, but only sometimes......) for every POST or GET call and one
fails... the user hardly notices... he can just click "submit" a second
time and this time it works...
Go in to TOP and kill them and you are back in business... meanwhile
Apache keeps serving pages all the while... I've been cleaning out the
old "bad" cgi's and now we hardly ever see it...
Our web server uses 2 dual XEON processors so that's 4 CPU's on a
dedicated server...so that helps...if you are running on a shared
virtual space... not sure what happens. But someone observed that
today's CPU speeds far outstrip the network, hard disk I/O, and
Apache... so the "worry" about calling an instance of REvolution into
memory on every hit, is mostly theoretical... in fact, the CPU + REV
"engine" is way, way ahead of Apache, disk I/O and the outGoing pipe
speeds... no problem at all... and it is it's magnitudes faster than PHP
(and easier to code unless you are opting for canned CMS...) ....of
course, I'm sure there is a threshold, but I don't know what it would
be...disclaimer: if you are doing Gaussian Blurs in the background on
your web server.. all bets are off : point, obviously it depends on what
you are doing... But, we've been use Rev CGI for 9 years and MC before
that... no problems... its' wonderful...and only getting better!
More information about the use-livecode
mailing list