Запустите файл.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']);
Я знаю, что это немного поздно, но я не могу добавить комментарий (поскольку он является новым участником), но для исправления проблемы в 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
чтобы узнать это.