[英]Run .sh file using exec Laravel PHP
我正在尝试运行一个 .sh 文件,它将一个 excel 文件导入我的数据库。 这两个文件都在公用文件夹内的同一目录中。 由于某种原因,exec 命令没有被执行,也没有任何错误发生。
.sh 文件冷:
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');
注意:我可以直接从 gitbash 执行 sh 文件,但是我希望它使用 Laravel 控制器中的函数来完成。 我正在使用 Windows 操作系统。
你可以使用已经在 Laravel http://symfony.com/doc/current/components/process.html中的 Symfony 进程组件
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 中遵循公认答案时遇到此问题的任何人有所帮助。
在 Laravel 8.x 使用的Symfony 5.2.0中(与 Laravel 9.x 使用的当前Symfony 版本 6.0相同),您需要指定sh
命令和您的参数,在您的情况下:
use Symfony\Component\Process\Process;
$process = new Process(['/usr/bin/sh', 'folder_name/file_name.sh']);
$process->run();
系统将从您的/public
文件夹中找到folder_name/file_name.sh
(如果它从 url 执行),如果您想使用另一个工作目录,请在第二个Process
参数中指定。
$process = new Process(['/usr/bin/sh', 'folder_name/file_name.sh'], '/var/www/app');
并且/usr/bin/sh
有时对每个用户都有不同的位置,但这是默认位置。 输入whereis sh
来找出它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.