Re: berkeley db + php + locking
| From: | Christopher Jones | Date: | Fri, 17 Nov 2006 00:04:31 +0000 |
| Subject: | Re: berkeley db + php + locking | ||
| References: | 1 | Groups: | php.db |
| Request: | Send a blank email to php-db+get-42694@lists.php.net to get a copy of this message | ||
Chris,
I've emebedded inline an answer from George Feinberg from the
Sleepycat team.
Chris
Chris Peiffer wrote:
I'm having trouble getting php working with db4 so that it does correct write-locking in an apache webserver environment (where there are potentially many applications writing at once.) The first thing I did: I compiled the db4 package from sleepycat/oracle and configured it into php. (Using the --with-db4=/usr/local/BerkeleyDB.4.4 directive to php's configure.) With this the php binary is linked to the Berkeley libs, and one can use those libs through the standard php dba_* API, by opening db resources with the db4 handler, like this: $dbres = dba_open($filename, 'wd', 'db4'); This works for accessing, creating and writing files. However, it doesn't handle write locking properly. If two procs both call dba_open with a write lock, they both get the lock. Whover closes the resource first gets its values written to the file. This is not the correct behavior... you can't have a true mutex unless one of them blocks on the open when the write lock is taken up by the other. I found this page, which (poorly) documents the native php API for Berkeley db: http://www.oracle.com/technology/documentation/berkeley-db/db/ref/ext/php.html From within the db distribution tree I installed their php extension, db4.so (by running phpize, configure, make, make install within the php_db4 directory under the db src.) I can get their samples to run, but the samples don't deal with write locking at all. The documentation is maddening, because most of it has to be inferred from the C API documentation. I'm finding it very hard to get any kind of error reports or logs out of the thing. This page suggests a scenario that I want: simple multiple reader / single writer access to a suite of db4 files: http://www.oracle.com/technology/documentation/berkeley-db/db/ref/cam/intro.html However, it says "You must specify DB_INIT_CDB and DB_INIT_MPOOL to DB_ENV->open." When I try to do this in php I get failure where the standard db->open succeeds. However, I can't figure out why. Similarly, cursor operations fail. Does anybody know of any good examples of using db4 and php?If you want to use DB_INIT_CDB, the syntax for the open call is: $env->open("path_to_environment", DB_INIT_CDB|DB_INIT_MPOOL|DB_CREATE); One note on the Berkeley DB PHP API -- it is not a wrapper of the complete API. It only implements a subset of the methods for any of the classes. If any are missing, and there is no work around, they can be requested. The Berkeley DB OTN Forum is the best place to talk about these issues, as it's monitored by the team. It's here:
http://forums.oracle.com/forums/forum.jspa?forumID=271The Db4Env class is particularly sparse, but that is because nearly all of its configuration can be emulated using a configuration file, rather than API. See the documentation on the DB_CONFIG configuration file here: http://www.oracle.com/technology/documentation/berkeley-db/db/ref/env/db_config.html George
Specifically, with locking? Is there any way to get db_strerror working? Is there at least a better documented API than the Oracle one? (As an example of how crappy it is, it omits the "put" method from class Db4 but that method does in fact exist within the library.) Thank you for any help you can offer. I have searched the web and the archives of this list but I couldn't find much.-- Christopher Jones, Oracle Email: Christopher.Jones@oracle.com Tel: +1 650 506 8630 Blog: http://blogs.oracle.com/opal/