samizdat has asked for the wisdom of the Perl Monks concerning the following question:

Fellow Monks of great Perlness:

After the recent discussion on templating, I've decided this old code-dawg needs new tricks. So, I've installed Embperl and decided that Apache::Session::Memcached would make me never want to PHP again. My first impression is that mod_perl+Embperl is really superior to PHP, with a lot of helpful extensions that will make web-wonking a treat. This particular app doesn't need the speed of memcached, but I have other apps that will, so I'd like to get it running.

So, for your perusal, here's the beginning of index.epl, and the error that it produces:
[* use Apache; use Apache::Session::Memcached; my %session; tie %session, 'Apache::Session::Memcached', undef, { 'Servers' => ['127.0.0.1:20000'], 'NoRehash' => 1, 'Readonly' => 0, 'Debug' => 1, 'CompressThreshold' => 10_000, }; *] <HTML> <HEAD> ...
[728]ERR: 24: Error in Perl code: Can't locate object method "TIEHASH" + via package "Apache::Session::Memcached" at /var/web/root/index.epl +line 10. [728]ERR: 24: index.epl(1): Error in Perl code: Apache/1.3.33 (Unix) mod_perl/1.29 PHP/5.0.0a6-alexdupre HTML::Embperl + 1.3.6 [Thu Mar 3 06:49:48 2005]
I've looked through the docs on Apache::Session, Cache::Memcached, and memcached itself, but it doesn't function. I did try changing the syntax of the hash from the original example in Apache::Session::Memcached to the above, which has quotes around the keys and has the Servers line be an anon array ref, but neither functions properly in the embperl context. The above, however, does function in raw perl; ther only thing I changed was adding
#!/usr/bin/perl use warnings;
and stripping out the HTML. I get a message on console giving me back a session ID. I've also tried using the bracket-minus form as opposed to bracket-asterisk; no diff.

Thanks in advance!

Replies are listed 'Best First'.
Re: embperl and Apache::Session::Memcached
by perrin (Chancellor) on Mar 03, 2005 at 14:43 UTC
    I hope you're not putting anything in your session that you care about losing. Memcached is lossy storage, i.e. it will lose everything if the daemon hits a bug or the machine has problems. It also silenty drops things after it hits the size limit you set. It's intended to be a cache, not a database.
      Also, too, let me say that besides being well aware of the transient nature of RAM (I write code to analyze data on raw die from Teradyne testers for a living, these days!), as I stated, I'm interested in why the code doesn't work.

      Spending a few cycles finding out why something doesn't work leads to greater understanding of the process. I suspect that the answer to my Server Internal Error is in the raw newness of my embperl understanding and is unrelated to the use of memcached specifically.
      I'm only using it for between-form per-session data, of course. In my real-world apps, MySQL does the database work.

      Should the machine fail, or be rebooted, or whatever, of course it will be lost, but then, so will the webserver. As for hitting the limit of the cache, that can be monitored. Of course!