Запустите файл.sh, используя exec Laravel PHP

Я пытаюсь запустить файл.sh, который будет импортировать файл Excel в мою базу данных. Оба файла находятся в одном каталоге внутри общей папки. По какой-то причине команда exec не выполняется или не возникает никакой ошибки.

.sh файл colde:

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

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

В моем php файле я пробовал следующее:

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

А также:

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

Примечание: я могу напрямую выполнить sh-файл из gitbash, однако я хочу, чтобы это было сделано с помощью функции в контроллере Laravel. Я использую ОС Windows.

4 ответа

Решение

Вы можете использовать Process Component Symfony, который уже находится в 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();

Все эти ответы уже устарели, вместо этого используйте (Symfony 4.2 или выше):

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

Или же

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

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

Я знаю, что это немного поздно, но я не могу добавить комментарий (поскольку он является новым участником), но для исправления проблемы в Windows "sh" не распознается как внутренняя или внешняя команда, работающая программа или командный файл." Мне пришлось изменить новый процесс с:

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

использовать следующий синтаксис:

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

Единственная проблема в том, что при загрузке на сервер Linux его нужно будет изменить на вызов sh.

Надеюсь, что это поможет любому, кто столкнулся с этой проблемой, следуя принятому ответу в Windows.

В Symfony 5.2.0 , который используется Laravel 8.x (такой же, как текущая версия Symfony 6.0 , используемая Laravel 9.x), вам нужно указать shкоманда и ваш аргумент, в вашем случае:

      use Symfony\Component\Process\Process;

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

Система найдет folder_name/file_name.shот твоего /publicпапку (если она выполняется из URL-адреса), если вы хотите использовать другой рабочий каталог, укажите, что во втором Processпараметр.

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

И /usr/bin/shиногда имеют разные места для каждого пользователя, но это место по умолчанию. Тип whereis shчтобы узнать это.

Другие вопросы по тегам