Re: pcntl_fork?

From: Date: Tue, 31 Jan 2006 04:50:12 +0000
Subject: Re: pcntl_fork?
References: 1 2 3 4  Groups: php.general 
Request: Send a blank email to php-general+get-229513@lists.php.net to get a copy of this message
Chris wrote:
Hi Peter, If you can get it working can you send me a sample? Certainly... database connections must be CLEAN! Meaning, you should close them when they're no longer needed.
Additionally, each fork should open its own DB connection. My completed code: <? require_once('../private/sql.php'); require_once('include-crawl.php'); if (phpversion() > 5) { date_default_timezone_set('UTC'); } $pgconnectstring='dbname=' . returndbname() . ' user=' . returndbuser() . ' password=' . returndbpass() . ' host=redback.10mbit.biz'; $database = pg_connect($pgconnectstring); $pquery = "SELECT count(key) AS count FROM tvguide_channels WHERE crawl=true;"; $presult = pg_query($database,$pquery); $row = pg_fetch_object($presult,0); pg_close($database); $childcount = 0; $childrencount = $row->count; while($childcount < $childrencount) { $pid = pcntl_fork(); if ( $pid == -1 ) {
       die("Unable to fork\n");
} elseif ($pid == 0) {
       $childcount++;
       sleep(10);
       continue;
} else {
       $db = pg_connect($pgconnectstring);
             $cquery = "SELECT id FROM tvguide_channels WHERE crawl=true ORDER BY key ASC LIMIT 1 OFFSET ".$childcount.";";
       $cresult = pg_query($db, $cquery);
                   if ($cresult && (pg_num_rows($cresult) == 1)) {
           $row = pg_fetch_object($cresult,0);
                     //echo $childcount ." ". $row->id ." ". posix_getpid() ." ". posix_getppid() ."\n";
           tvxml_parsechannel($db,$row->id);
           pg_close($db);
       } else {
           echo $childcount ." ". pg_last_error($db) ."\n";
       }
             exit();
} } ?> Try this:
<?php declare(ticks=1); $time = time(); $childcount = 0; $childrencount = 10; while($childcount < $childrencount) {
        $pid = pcntl_fork();
        if ( $pid == -1 ) {
                die("error\n");
        }
        if ($pid == 0) {
                $childcount++;
                pcntl_wait($status);
        } else {
$connection_string = 'dbname=xxxx user=xxxx password=xxxx';
if (!$connection_result = pg_pconnect($connection_string)) {
       echo 'Unable to connect: ' . pg_last_error() . "\n";
       exit();
} echo "Connected ok\n";
                $qry = "select version() AS version";
                $result = pg_query($connection_result, $qry);
                if (!$result) {
                        echo "error: " . pg_last_error() . "\n";
                } else {
                        $row = pg_fetch_assoc($result);
                        echo $row['version'] . "\n";
                }
pg_close($connection_result);
                exit();
        }
} echo 'took ' . (time() - $time) . ' seconds' . "\n"; ?> IE: you were connecting to the DB too early, at a point where it wasn't needed.
On another note, my new script that forks uses approx 24mb of memory - a very nice cut down on its usage :D Regards, Peter Hoskin

« previous php.general (#229513) next »