Hey Dwight,
After getting your first e-mail, I started adding the PEAR::DB persistent
connection code. Unfortunately, it yielded the same results that I was
getting before.
At a hunch, I created a second proof-of-concept script that uses the mysql_*
functions in the PHP base. For each of these, I set the $new_link parameter
in the mysql_connect() function to "true". As it turns out, the primary $db
link that was originally created in the parent process *is* destroyed when
the first child process closes -- this makes sense, however. If I re-create
that thread after spawning all the child processes, though, it works
beautifully!
So it looks like this is a bug with PEAR::DB in handling persistent
connections across forked processes. I'll go ahead and file it with the
PEAR::DB folk and include the two scripts in the bug request.
Again, thanks for your help! It was really beneficial to have a second set
of eyes and a sounding board for getting through this problem.
In case anyone wants the second proof-of-concept script:
<?php
# Database table definition
# -------------------------
# CREATE TABLE `logs` (
# `message` VARCHAR(128) NOT NULL
# );
/* Create the initial database connection for the parent process */
$db = mysql_connect('localhost', 'test', 'test', true);
mysql_select_db('testdb', $db);
/* Perform a DB update */
mysql_query("INSERT INTO `logs` (`message`) VALUES ('Started parent
process')", $db);
/* Create the child processes */
$childPids = array();
for ( $i = 0; $i < 5; $i++ ) {
$pid = pcntl_fork();
if ( $pid == -1 ) {
die("\nUnable to fork!\n");
} else if ( $pid ) {
/* Parent process */
echo "Child process $pid created\n";
array_push($childPids, $pid);
} else {
/* Child process */
$myPid = posix_getpid();
/* Create a new database connection for the child process */
$db2 = mysql_connect('localhost', 'test', 'test', true);
mysql_select_db('testdb', $db2);
mysql_query("INSERT INTO `logs` (`message`) VALUES ('Child
process $myPid started')", $db2);
/* Add some latency for testing purposes */
sleep(5);
mysql_query("INSERT INTO `logs` (`message`) VALUES ('Child
process $myPid ended')", $db2);
exit;
}
}
$db3 = mysql_connect('localhost', 'test', 'test', true);
mysql_select_db('testdb', $db3);
/* Wait for the children to finish */
foreach ( $childPids as $pid ) {
$msg = "Parent process waiting on child process $pid";
echo $msg . "\n";
mysql_query("INSERT INTO `logs` (`message`) VALUES ('$msg')", $db3);
pcntl_waitpid($pid, $status);
$msg = "Parent process detected child process $pid is finished";
echo $msg . "\n";
mysql_query("INSERT INTO `logs` (`message`) VALUES ('$msg')", $db3);
}
mysql_query("INSERT INTO `logs` (`message`) VALUES ('Parent process is
finished')", $db3);
?>
Thanks!
Chris
On 4/23/07 10:43 AM, "Dwight Altman" <[EMAIL PROTECTED]> wrote:
> To use a PEAR::DB persistent connection, try
> $db = DB::connect($dsn, TRUE);
> or
> $db = DB::connect($dsn, true);
>
> Googled for "pear::db persistent connection" and got
> http://vulcanonet.com/soft/?pack=pear_tut
>
>
> Regards,
> Dwight
>
>> -----Original Message-----
>> From: Dwight Altman [mailto:[EMAIL PROTECTED]
>>
>> Where in your code does it say you are using persistent connections?
--
PHP Database Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php