Re: Re: process creation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2009/1/23 Nathan Rixham <nrixham@xxxxxxxxx>

> bruce wrote:
>
>> A simple question (or so I thought).
>>
>> Does php allow an app to create/start a process/application that can
>> continue to run on its own, after the initiating program/app terminates?
>>
>> It appears that the spawning/forking functions might work, but the child
>> apps would be in a zombie status, and couldn't be killed by an external
>> program.
>>
>>
> you keep mentioning this zombie state; make sure that all you're child
> processes have an exit(); at the end or at the end of the code where they
> are finished; otherwise you get the xombies!
>
> also here is a very simple model you can follow that invariably works for
> me:
>
> this will run 10 worker threads:
>
> controller:
> <?php
> include './your.framework.php';
> for($icount=0;$icount<11;$icount++)  {
>    include './worker.php';
> }
> ?>
>
> worker:
> <?php
> $pid=pcntl_fork();
> if(!$pid) {
>    while(1) {
>        if($icount) {
>            $offset = $icount * 50;
>        } else {
>            $offset = 0;
>        }
>        $db = new mysql_handler( $connection );
>        $job_list = new job_list;
>        if( $jobs = $job_list->get($offset) ) {
>            foreach($jobs as $jdex => $job ) {
>                //do something with the job
>            }
>        } else {
>            sleep(10);
>        }
>    }
> } else {
>    echo "\ndaemon launcher done id $pid\n";
> }
> ?>

This would start more than 10 children. Children will continue on with for
loop after they do their work. As you advice that the children have an exit,
i assume that  you just overlooked it while writing this example. Also, a
wait on the children, at some point, gets rid of the zombies, as i see from
your code, there is no way you won't have zombie processes, unless the
parent exists, and then the zombies also disappear.

I hope i got it right, it's late here :)


>
> the above code is designed to run indefinately in a constant loop which
> polls a database for work to do
>
> this is just a very simple example, there are far more complex ways of
> doing it, keeping a track of how many processes you have, spawning new ones
> when you need them etc etc, but this i find works v well for me, the key is
> the $offset; getting jobs from a database and this literally is the offset
> used, so if you have say 200 emails to get and each script processes 50 at a
> time, only 4 of your threads are working, bump it up to 10000 and all of
> them work until the queue drops; the sleep(10) and the spawn process of
> about 1 per second ensures that you're polling every second so jobs are
> picked up quickly. it's a lot of functionality for so little code :)
>
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>


-- 
Torok, Alpar Istvan

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux