On Sat, 2009-01-24 at 00:22 +0200, Török Alpár wrote: > as i said it's hate here, and i might be wrong but consider the following : > > for($icount=0;$icount<11;$icount++) > { > $iPid = pcntl_fork(); > $iChildrenCount = 0; > if ($iPid == 0) > { > // child > echo ("child $icount\n"); > } > else > { > // parrent > } > } > > this is essential what you do in your example? If so, this code does not > start 10 children. It starts more. > > 2009/1/23 Nathan Rixham <nrixham@xxxxxxxxx> > > > Török Alpár wrote: > > > >> 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 :) > >> > >> > >> > > lol the script will only run 10 children, and as mentioned directly below, > > it is designed to run forever - the example doesn't fit the exact needs, but > > following bruces earlier posts this may be a model he can follow. I'm aware > > it could be fleshed out with much more code and error handling, but it's > > just a little model to get one started :) > > > > regards torak and hope you're well! > > > > > > 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 > >>> > >>> > >>> > >> > >> > > > > I think possibly you want to execute a new script of non-PHP origin? In which case, using exec() and calling a script with an & (meaning to run in the background) and passing output to /dev/null should do the trick. Ash www.ashleysheridan.co.uk -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php