Re: Starting a background process and reporting failure if applicable
| From: | Stefan A. | Date: | Tue, 18 Aug 2020 03:40:24 +0000 |
| Subject: | Re: Starting a background process and reporting failure if applicable | ||
| References: | 1 2 3 4 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-327294@lists.php.net to get a copy of this message | ||
Additionally you can also look at libraries such symfony/process
https://symfony.com/doc/current/components/process.html#running-processes-asynchronously
On Tue, Aug 18, 2020 at 5:28 AM Stefan A. <acid24@gmail.com> wrote:
> A somewhat hacky way to do it, would be like this
>
> exec('(nohup php sleeps_nonexist.php > /tmp/tt 2>&1; echo $?) &',
> $output,
> $status);
>
> then instead of checking the $status variable, you would check the $output
> which in this case would have the value '1' at index 0 or the value '0' if
> the command executed successfully.
>
> I don't know how reliable this is.
>
> On Mon, Aug 17, 2020 at 9:23 PM Paul M Foster <paulf@quillandmouse.com>
> wrote:
>
>> On Mon, Aug 17, 2020 at 02:51:58PM -0400, Tedd Sperling wrote:
>>
>> >
>> >
>> > > On Aug 17, 2020, at 9:14 AM, Jānis Elmeris <janis.elmeris@lv.lv>
>> wrote:
>> > >
>> > > Hello!
>> > >
>> > > I would like to start a PHP script in the background from within
>> another PHP script. I would like to monitor all error cases properly.
>> > >
>> > > Is there an easy way to see if that background script was started
>> successfully? The background script would write its errors into an error
>> log that I'm monitoring. But what about starting the script itself?
>> > >
>> > > I'm trying to start a background script like this:
>> > >
>> > > exec('nohup php sleeps.php > /tmp/tt 2>&1 &', $output,
>> > > $status);
>> > > error_log('execute_shell: ' . var_export(['status' =>
>> > > $status,
>> 'output' => $output], true));
>> > > exec('nohup php sleeps_nonexist.php > /tmp/tt 2>&1 &',
>> > > $output,
>> $status);
>> > > error_log('execute_shell: ' . var_export(['status' =>
>> > > $status,
>> 'output' => $output], true));
>> > >
>> > > The first
exec runs all right in the background
>> > > (asynchronously).
>> > > The second one behaves in exactly the same way ($status ===
>> > > 0),
>> even though file "sleeps_nonexist.php" does not exist.
>> > >
>> > > Running in the command line manually, this would give status
>> > > 0:
>> > > nohup php sleeps.php > /tmp/tt 2>&1
>> > > echo $?
>> > >
>> > > This would give status 1:
>> > > nohup php sleeps_nonexist.php > /tmp/tt 2>&1
>> > > echo $?
>> > >
>> > > Regards,
>> > > Janis
>> >
>> >
>> > Janis:
>> >
>> > Look at header — it’s much simpler.
>> >
>> > For example, I often use it to start another script from within a
>> script, like so:
>> >
>> > if ($auth == 0)
>> > {
>> > // send user to log on page
>> > header('Location:log-on.php');
>> > exit();
>> > }
>> >
>>
>> Yeah, but header doesn't run asynchronously does it? Plus, even if the
>> "header" script returns, that exit() call will abort the parent script.
>>
>> Paul
>>
>> --
>> Paul M. Foster
>> http://noferblatz.com
>> http://quillandmouse.com
>>
>