RE: spawning a process that uses pipes - doesn't terminatewhen webpage download is canceled

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

 



hi robert.,,

now you've got me curious..

you state...

-Use something else to pass the data back to the user... popen() comes to
-mind or proc_open(). Then disable auto abort on user disconnect via
-ignore_user_abort(). Then after sending periodic data chunks, check the
-user connection status via connection_aborted(). If your script finds
-that the user has aborted, then kill all the processes in the pipeline
-from the PHP script before finally aborting the PHP script itself.

but if the user is using a browser session... which has a web server
connection... are you siggesting that the server app spawns off a child
process via the popen, and that the child somehow connects to the existing
browser session??

walk through the psuedo logic/flow of this if you don't mind.. i must be
missing something..

thanks


-----Original Message-----
From: Robert Cummings [mailto:robert@xxxxxxxxxxxxx]
Sent: Sunday, May 31, 2009 8:16 PM
To: flint
Cc: PHP-General List
Subject: Re:  spawning a process that uses pipes - doesn't
terminatewhen webpage download is canceled


On Sun, 2009-05-31 at 08:52 -0500, flint wrote:
> sent this before, don't know if it went through... someone please reply if
> it went, even if they don't know answer?...
>
> so here's the scenario..
>
> I have a site that uses php with a database to offer sound files to
> users using streaming methods.
>
> the request page has options, allowing the user to modify the sound
> file in various ways, before having it sent to them
>
> Here's the problem:
>
> The method i'm using to feed the data to the user is to run the source
> file through various piped commands, with the resulting audio being
> dumped to stdout, and then using passthru in php to get that data to
> the enduser.
>
> here's an example, for serving an MP3 with its pitch/speed changed by sox:
>
> passthru("lame --quiet --decode \"" . $in_file . "\" - | " .
>              "sox -V -S -t wav - -t wav - speed " . $speed_factor . " | "
.
>              "lame --quiet " . $lame_params . " - -");
>
> This works just fine, except the problem is if the end user aborts the
> transfer (e.g. stops playback in the media player, cancels download of
> the mp3, whatever) then it leaves behind both the sox process and the
> decoder LAMe process along with the sh that's running them. the only
> process that exits is the final encoding lame process. If the sound
> file runs to completion, everythign exits properly.
>
> But this obviously means enough "cancelling" of downloads means the
> server ends up with a huge batch of stuck processes! And I even tried
> simply killing the 'host' sh process, and the lame and sox processes
> remain anyway. The only way I've been able to deal with this is
> manually killing the lame and sox processes directly.
>
> is there any way I can make this work, such so that if the user
> cancels the transfer, all relavent processes are killed rather than
> just the single process that's feeding output into php?

Use something else to pass the data back to the user... popen() comes to
mind or proc_open(). Then disable auto abort on user disconnect via
ignore_user_abort(). Then after sending periodic data chunks, check the
user connection status via connection_aborted(). If your script finds
that the user has aborted, then kill all the processes in the pipeline
from the PHP script before finally aborting the PHP script itself.

Cheers,
Rob.
--
http://www.interjinn.com
Application and Templating Framework for PHP


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[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