Saurav
Saurav

Reputation: 363

Run .sh file using exec Laravel PHP

I am trying to run a .sh file that will import a excel file to my database. Both files are in same directory inside the public folder. For some reason the exec command isn't being executed or neither any error occurs.

.sh file colde:

IFS=,
while read column1  
      do
        echo "SQL COMMAND GOES HERE"

done < file.csv | mysql --user='myusername' --password='mypassword' -D databasename;
echo "finish"

In my php file i have tried following:

$content = file_get_contents('folder_name/file_name.sh');
echo exec($content);

And:

shell_exec('sh /folder_name/file_name.sh');

Note: I can directly execute the sh file from gitbash however I want it to be done using function in Laravel controller. I'm using windows OS.

Upvotes: 4

Views: 22241

Answers (4)

TheArKa
TheArKa

Reputation: 329

In Symfony 5.2.0 that used by Laravel 8.x (same as current Symfony Version 6.0 used by Laravel 9.x), you need to specify the sh command and your argument, in your case:

use Symfony\Component\Process\Process;

$process = new Process(['/usr/bin/sh', 'folder_name/file_name.sh']);
$process->run();

The system will find folder_name/file_name.sh from your /public folder (if it executed from a url), if you want to use another working directory, specify that in the second Process parameter.

$process = new Process(['/usr/bin/sh', 'folder_name/file_name.sh'], '/var/www/app');

And the /usr/bin/sh sometimes have a different place for each user, but that is a default one. Type whereis sh to find it out.

Upvotes: 1

Alexander Kim
Alexander Kim

Reputation: 18382

All of these answers are outdated now, instead use (Symfony 4.2 or higher):

$process = Process::fromShellCommandline('/deploy.sh');

Or

$process = new Process(['/deploy.sh']);

https://symfony.com/doc/current/components/process.html

Upvotes: 5

CloudSPRT
CloudSPRT

Reputation: 33

I know this is a little late but I can't add a comment (due to being a new member) but to fix the issue in Windows " 'sh' is not recognized as an internal or external command, operable program or batch file." I had to change the new process from:

$process = new Process('sh /folder_name/file_name.sh');

to use the following syntax:

$process = new Process('/folder_name/file_name.sh');

The only problem with is that when uploading to a Linux server it will need to be changed to call sh.

Hope this helps anyone who hit this issue when following the accepted answer in Windows.

Upvotes: 2

Alessandro Minoccheri
Alessandro Minoccheri

Reputation: 35963

you can use Process Component of Symfony that is already in Laravel http://symfony.com/doc/current/components/process.html

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

$process = new Process('sh /folder_name/file_name.sh');
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

Upvotes: 12

Related Questions