php-watcher icon indicating copy to clipboard operation
php-watcher copied to clipboard

Laravel Octane appears to be restarted twice

Open spawnia opened this issue 4 years ago • 8 comments

Hi, thanks for this project 👋

I am trying to use this project as a lightweight alternative to chokidar for restarting Laravel Octane: https://laravel.com/docs/8.x/octane#watching-for-file-changes

When updating a watched file, it appears the process is restarted twice:

www-data@nemo-api:~$ vendor/bin/php-watcher artisan --arguments=octane:start --watch=app

[PHP-Watcher] 0.5.2
[PHP-Watcher] watching: app
[PHP-Watcher] starting `php artisan octane:start`
⠛
   INFO  Server running…

  Local: http://127.0.0.1:8000

  Press Ctrl+C to stop the server


[PHP-Watcher] restarting due to changes...
[PHP-Watcher] starting `php artisan octane:start`
[PHP-Watcher] starting `php artisan octane:start`

In Process.php line 170:
                              
  Process is already running  
                              

watch [-w|--watch [WATCH]] [-e|--ext [EXT]] [-i|--ignore [IGNORE]] [--exec [EXEC]] [--delay [DELAY]] [--signal [SIGNAL]] [--arguments [ARGUMENTS]] [--config [CONFIG]] [--no-spinner] [--] <script>

If you need to reproduce this locally, a plain Laravel install with Octane should do:

  • https://laravel.com/docs/8.x/installation
  • https://laravel.com/docs/8.x/octane#installation

spawnia avatar Sep 08 '21 17:09 spawnia

Had this issue with our own code with graceful shut downs. I.e. the watcher does not wait for the app to shutdown. Fixed & re-released this with this commit.

Not sure about the maintenance status of this project so will keep it maintained in our fork until there is clearance.

fritz-gerneth avatar Jan 24 '22 10:01 fritz-gerneth

@fritz-gerneth I would like to try your solution. It appears you changed the package name in your fork, but it is not available from packagist. How can I install it?

Also, perhaps you can try and post a PR to this project. There does not seem to be much activity, but that might just be because the project is somewhat finished - it is a simple utility after all, and apart from major new PHP versions and bug fixes, it should not need much maintenance.

spawnia avatar Jan 24 '22 10:01 spawnia

It is now posted to packagist. Either install from packagist or use the phar file (which we use over here). As there were more fixes than this single one it's not a single PR. Will split up & cherry pick if there is activity from the maintainer

fritz-gerneth avatar Jan 24 '22 11:01 fritz-gerneth

Thank you @fritz-gerneth, installing with composer require --dev funct-gmbh/php-watcher worked.

Restarting now works, but it appears a bit imperfect - there is a message telling me the app crashed when I simply change whitespace in a file to trigger a reload:

root@59d2aec7e8b2:/var/www# vendor/bin/php-watcher artisan --arguments=octane:start --watch=app

[PHP-Watcher] 1.0.0
[PHP-Watcher] watching: app
[PHP-Watcher] starting `php artisan octane:start`
⠏
   INFO  Server running…

  Local: http://127.0.0.1:8000

  Press Ctrl+C to stop the server

[PHP-Watcher] app crashed - waiting for file changes before starting...

[PHP-Watcher] restarting due to changes...
[PHP-Watcher] starting `php artisan octane:start`
⡇
   INFO  Server running…

  Local: http://127.0.0.1:8000

  Press Ctrl+C to stop the server

spawnia avatar Jan 24 '22 11:01 spawnia

Weird stuff.. It doesn't do that for me but restarts with the proper message... That'd mean artisan would quit with a non-zero code. Could you check the exit code (echo $?) when starting the process manually & terminate it kill -INT $PID ?

( I also pushed v1.0.1 to include the code on app crash )

fritz-gerneth avatar Jan 24 '22 11:01 fritz-gerneth

The process exits with code 137 after terminating it with kill -INT. The output of the updated version confirms that:

[PHP-Watcher] app crashed (137) - waiting for file changes before starting...

What exact command are you using to watch octane?

spawnia avatar Jan 24 '22 13:01 spawnia

Not using Laravel but for ReactPHP directly (i.e. php-watcher src/index.php) but in general this should work with every script/language). Not knowing the intrinsics I do not know why artisan would return with a 137 code (which it apparently does even without the php-watcher infront). Might be a topic for the laravel community :)

fritz-gerneth avatar Jan 24 '22 19:01 fritz-gerneth

It appears that Octane generally does not fail gracefully on SIGTERM, see https://github.com/laravel/octane/issues/469

spawnia avatar Jun 28 '22 16:06 spawnia