如何从 laravel 控制器执行外部 shell 命令?

2022-08-30 23:00:15

我需要从控制器执行shell命令,但不仅对于项目内部的文件,例如system('rm /var/www/html/test.html')或system('sudo unzip /var/www/html/test.zip');

我调用了函数,但什么也没发生,任何想法如何从控制器执行外部shell命令,就像删除另一个目录中的一个文件一样?

system('rm /var/www/html/test.html');
//or
exec('rm /var/www/html/test.html')

答案 1

如果你想从你的PHP应用程序运行命令,我建议你使用Symfony Process Component

  1. composer require symfony/process

  2. 将类导入到您的文件中use Symfony\Component\Process\Process;

  3. 执行您的命令:

    $process = new Process(['rm', '/var/www/html/test.html']);
    
    $process->run();
    

如果您使用的是Laravel,则应该能够跳过步骤1。


或者,(如果运行php的进程具有正确的权限),您可以简单地使用PHP的unlink()函数来删除文件:

unlink('/var/www/html/test.html');
 

答案 2

我会用框架已经提供的内容来做到这一点:

1) 首先生成一个命令类:

php artisan make:command TestClean

这将在 App\Console\Commands 中生成一个命令类

然后在该命令类的句柄方法中写入:

@unlink('/var/www/html/test.html');

为命令指定名称和说明并运行:

php artisan list

只是为了确认您的命令已列出。

2)在您的控制器中导入工匠立面。

use Artisan;

3) 在控制器中写入以下内容:

Artisan::call('test:clean');

有关进一步的用途,请参阅文档:https://laravel.com/docs/5.7/artisan#generating-commands


推荐