You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Rodney Broom <rb...@Desert.NET> on 2001/06/25 23:54:29 UTC
Persistant data accross processes
Hi all,
I'd like a way to store complex data structures across Apache processes. I've looked at Apache::DBI for an example: my tests say that he has to create a new dbh for every process. I've looked at IPC::Shareable, but it has to copy data. Meaning that I can only have a certain amount of complexity to my data structures.
Thoughts?
---
Rodney Broom
Programmer: Desert.Net
Re: Persistant data accross processes
Posted by Joshua Chamas <jo...@chamas.com>.
> Rodney Broom wrote:
>
> Hi all,
>
> I'd like a way to store complex data structures across Apache processes. I've looked at Apache::DBI for an example: my tests say that he has to
> create a new dbh for every process. I've looked at IPC::Shareable, but it has to copy data. Meaning that I can only have a certain amount
> of complexity to my data structures.
>
I you like MLDBM, I created MLDBM::Sync for the purpose
of using in Apache like environments. MLDBM::Sync creates
a file locking wrapper around underlying dbms like DB_File,
GDBM_File, or SDBM_File.
Try the bench/bench_sync.pl on your platform for some comparison
numbers. Below are the numbers I get on my platform,
Linux PIII-450x2
--Josh
_________________________________________________________________
Joshua Chamas Chamas Enterprises Inc.
NodeWorks <- Web Link Checking Huntington Beach, CA USA
http://www.nodeworks.com 1-714-625-4051
=== INSERT OF 50 BYTE RECORDS ===
Time for 100 writes + 100 reads for SDBM_File 0.15 seconds 12288 bytes
Time for 100 writes + 100 reads for MLDBM::Sync::SDBM_File 0.17 seconds 12288 bytes
Time for 100 writes + 100 reads for GDBM_File 3.30 seconds 18066 bytes
Time for 100 writes + 100 reads for DB_File 4.32 seconds 20480 bytes
=== INSERT OF 500 BYTE RECORDS ===
Time for 100 writes + 100 reads for SDBM_File 0.18 seconds 771072 bytes
Time for 100 writes + 100 reads for MLDBM::Sync::SDBM_File 0.58 seconds 110592 bytes
Time for 100 writes + 100 reads for GDBM_File 3.42 seconds 63472 bytes
Time for 100 writes + 100 reads for DB_File 4.32 seconds 81920 bytes
=== INSERT OF 5000 BYTE RECORDS ===
(skipping test for SDBM_File 1024 byte limit)
Time for 100 writes + 100 reads for MLDBM::Sync::SDBM_File 1.39 seconds 1850368 bytes
Time for 100 writes + 100 reads for GDBM_File 4.63 seconds 832400 bytes
Time for 100 writes + 100 reads for DB_File 5.73 seconds 839680 bytes
=== INSERT OF 20000 BYTE RECORDS ===
(skipping test for SDBM_File 1024 byte limit)
Time for 100 writes + 100 reads for MLDBM::Sync::SDBM_File 4.83 seconds 8304640 bytes
Time for 100 writes + 100 reads for GDBM_File 4.65 seconds 2063912 bytes
Time for 100 writes + 100 reads for DB_File 6.48 seconds 2068480 bytes
=== INSERT OF 50000 BYTE RECORDS ===
(skipping test for SDBM_File 1024 byte limit)
Time for 100 writes + 100 reads for MLDBM::Sync::SDBM_File 12.86 seconds 16192512 bytes
Time for 100 writes + 100 reads for GDBM_File 5.68 seconds 5337944 bytes
Time for 100 writes + 100 reads for DB_File 6.87 seconds 5345280 bytes
Re: Persistant data accross processes
Posted by darren chamberlain <dl...@users.sourceforge.net>.
Rodney Broom <rb...@Desert.NET> said something to this effect on 06/25/2001:
> Hi all,
>
> I'd like a way to store complex data structures across Apache
> processes. I've looked at Apache::DBI for an example: my tests
> say that he has to create a new dbh for every process. I've
> looked at IPC::Shareable, but it has to copy data. Meaning that
> I can only have a certain amount of complexity to my data
> structures.
>
> Thoughts?
Apache::Session, currently at 1.53. Here's an except from the
perldoc:
Sharing data between Apache processes
When you share data between Apache processes, you need to decide
on a session ID number ahead of time and make sure that an object
with that ID number is in your object store before starting you
Apache. How you accomplish that is your own business. I use the
session ID "1". Here is a short program in which we use
Apache::Session to store out database access information.
use Apache;
use Apache::Session::File;
use DBI;
use strict;
my %global_data;
eval {
tie %global_data, 'Apache::Session::File', 1,
{Directory => '/tmp/sessiondata'};
};
if ($@) {
die "Global data is not accessible: $@";
}
my $dbh = DBI->connect($global_data{datasource},
$global_data{username}, $global_data{password})
|| die $DBI::errstr;
undef %global_data;
#program continues...
As shown in this example, you should undef or untie your session
hash as soon as you are done with it. This will free up any
locks associated with your process.
Is this what you are looking for?
(darren)
--
Make no laws whatever concerning speech, and speech will be free; so soon
as you make a declaration on paper that speech shall be free, you will have
a hundred lawyers proving that "freedom does not mean abuse, nor liberty
license"; and they will define and define freedom out of existence.
-- Voltarine de Cleyre
Re: Persistant data accross processes
Posted by Olivier Poitrey <rs...@rhapsodyk.net>.
I'm working on two modules that can help you to do this job. There names are
Apache::SharedMem and Apache::Cache. You can find them on :
ftp://ftp.rhapsodyk.net/pub/devel/perl/
thx to report bugs to me
----- Original Message -----
From: "Rodney Broom" <rb...@Desert.NET>
To: <mo...@apache.org>
Sent: Monday, June 25, 2001 11:54 PM
Subject: Persistant data accross processes
Hi all,
I'd like a way to store complex data structures across Apache processes.
I've looked at Apache::DBI for an example: my tests say that he has to
create a new dbh for every process. I've looked at IPC::Shareable, but it
has to copy data. Meaning that I can only have a certain amount of
complexity to my data structures.
Thoughts?
---
Rodney Broom
Programmer: Desert.Net
Re: Persistant data accross processes
Posted by Joachim Zobel <nc...@netcologne.de>.
At 14:54 25.06.2001 -0700, you wrote:
>Hi all,
>
>I'd like a way to store complex data structures across Apache processes.
>I've looked at Apache::DBI for an example: my tests say that he has to
>create a new dbh for every process. I've looked at IPC::Shareable, but it
>has to copy data. Meaning that I can only have a certain amount of
>complexity to my data structures.
We are using Data::Dumper to put the data structures as TEXT into a MySQL
table, where they can retrieved via an id.
This is pretty fast for low to medium traffic and has the advantage that
the data is persistent (restarting apache won't zap the carts) and human
readable (debugging is easy).
Hth,
Joachim
--
"... ein Geschlecht erfinderischer Zwerge, die fuer alles gemietet werden
koennen." - Bertolt Brecht - Leben des Galilei