[英]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.