Both shell_exec()
and exec()
do the job - until they don't.
If your command crash for some reason, you won't know - shell_exec()
and exec()
don't throw Exceptions. They just fail silently. 😱
So, here is my solution to encounter this problem:
use Symfony\Component\Process\Process; class ShellCommand { public static function execute($cmd): string { $process = Process::fromShellCommandline($cmd); $processOutput = ''; $captureOutput = function ($type, $line) use (&$processOutput) { $processOutput .= $line; }; $process->setTimeout(null) ->run($captureOutput); if ($process->getExitCode()) { $exception = new ShellCommandFailedException($cmd . " - " . $processOutput); report($exception); throw $exception; } return $processOutput; } }
It utilises Symfony's Process (which comes out of the box to Laravel). ✨
With this way, I can throw a custom exception, log the command and the output to investigate, report it to my logs to investigate, etc.
No more failing silently 😇
Hope you like this little piece! If you do, please give it a ❤️
Top comments (5)
Thank you so much!
Simple use Laravel Processes:
laravel.com/docs/10.x/processes
Thanks!
Thanks Where to keep this file in project?
In a smaller project, I'd create a "app/Helpers" directory