使用exec在Laravel PHP中运行.sh文件

3
我正在尝试运行一个.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');

注意:我可以直接从Git Bash执行sh文件,但我想要在Laravel控制器中使用函数执行它。我使用的是Windows操作系统。
4个回答

12

你可以在Laravel中使用已经集成的Symfony流程组件 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();

谢谢,但现在我遇到了一个错误: 退出代码:1(一般错误)

输出:

错误输出:

'sh' 不是内部或外部命令,也不是可运行的程序或批处理文件。
- Saurav
@Saurav 这很奇怪,gitbash是sh.exe,通常应该作为Windows可执行文件运行。 - apokryfos
当我在使用GitBash时,使用命令sh fullpath/filename.sh可以正常运行,但是在尝试从Laravel中运行时却返回错误。 - Saurav
好的,这是Windows系统,服务器上一切都运行得非常完美。谢谢你们两位。 - Saurav
很高兴能帮助你! - Alessandro Minoccheri
显示剩余2条评论

5

嗨,我刚试了你提供的两种解决方案,但好像什么也没发生。我试图执行一个创建 .txt 文件的 .sh 文件,但没有收到任何错误或类似的提示。(我的 .sh 文件在主项目文件夹中,所以我尝试了 ['/comp.sh']、['comp.sh'] 和完整路径)。你有什么想法吗? - Alex UnLimited

2

我知道这有点晚了,但由于我是新成员,无法添加评论,但为了解决在Windows中出现的问题“'sh'不被识别为内部或外部命令、可操作的程序或批处理文件”,我不得不更改新进程:

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

使用以下语法:

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

唯一的问题是,当上传到Linux服务器时,需要更改为调用sh。
希望这能帮助那些在Windows中遇到这个问题的人。

1
在 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来找到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接