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