【问题标题】:How to execute external shell commands from laravel controller?如何从 laravel 控制器执行外部 shell 命令?
【发布时间】:2019-01-19 10:14:38
【问题描述】:

我需要从控制器执行 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')

【问题讨论】:

    标签: php linux laravel shell controller


    【解决方案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');
     
    

    【讨论】:

    • 我试过了,但是 Symfony Process 只在项目目录中执行命令,当我执行 $process = new Process(['rm', '/var/www/another_directory/test.html']) 时,它不执行
    • @AnonS 在那种情况下,我想你有权限问题。您使用的是什么操作系统?
    • 我正在使用 linux
    • 你是对的,这是权限问题,我给了它 755 和 www-data,它就像魅力一样,谢谢
    • 你不需要安装它,它已经包含在 Laravel 中。见stackoverflow.com/a/27857423/135101。
    【解决方案2】:

    我会用框架已经提供的东西来做这个:

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

    php artisan make:command TestClean
    

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

    然后在那个命令类的句柄方法里面写:

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

    给你的命令一个名字和描述然后运行:

    php artisan list
    

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

    2) 在您的控制器中导入 Artisan 外观。

    use Artisan;
    

    3) 在您的控制器中,然后编写以下内容:

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

    请参阅文档以了解更多用途: https://laravel.com/docs/5.7/artisan#generating-commands

    【讨论】:

    • 这对我的情况不起作用,无论如何谢谢,很好的解决方案
    • @AnonS 我想罗斯提到它是一个权限问题,也许你应该简单地检查你从exec('rm /var/www/html/test.html', $output); var_dump($output); 得到的输出并与我们分享
    • 输出为空
    • 我的错应该是exec('rm /var/www/html/test.html 2>&1', $output); var_dump($output);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    相关资源
    最近更新 更多