25

I need to execute shell commands from controller , but not only for files inside the project , ex. system('rm /var/www/html/test.html') or system('sudo unzip /var/www/html/test.zip');

I call the function but nothing happen , any idea how to execute external shell commands from controller like removing one file in another directory?

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

3 Answers 3

48

If you're wanting to run commands from your PHP application I would recommend using the Symfony Process Component:

  1. Run composer require symfony/process

  2. Import the class in to your file with use Symfony\Component\Process\Process;

  3. Execute your command:

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

If you're using Laravel, you should be able to skip Step 1.


Alternatively, (if the process running php has the correct permissions) you could simply use PHP's unlink() function to delete the file:

unlink('/var/www/html/test.html');
 
Sign up to request clarification or add additional context in comments.

9 Comments

i tried this but Symfony Process executes commands only inside project directory , when I do $process = new Process(['rm', '/var/www/another_directory/test.html']) , it doesnt execute
@AnonS In that case I would imagine you have a permissions issue. What operating system are you using?
i am using linux
you were right , it was permission issue ,i gave it 755 and www-data and it works like charm , thanks
You don't need to install it, it's already included with Laravel. See stackoverflow.com/a/27857423/135101.
|
5

Use fromShellCommandline to use direct shell command:

use Symfony\Component\Process\Process;
use Symfony\Component\Process\Exception\ProcessFailedException;

$process = Process::fromShellCommandline('rm /var/www/html/test.html');
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

1 Comment

i have forgot $process= Process::fromShellCommandline('.....
3

I would do this with what the framework already provide:

1) First generate a command class:

php artisan make:command TestClean

This will generate a command class in App\Console\Commands

Then inside the handle method of that command class write:

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

Give your command a name and description and run:

php artisan list

Just to confirm your command is listed.

2) In your controller import Artisan facade.

use Artisan;

3) In your controller then write the following:

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

Please refer to the docs for further uses: https://laravel.com/docs/5.7/artisan#generating-commands

4 Comments

this will not work for my situation ,anyway thanks, good solution
@AnonS I think like Ross mentioned its a permission issue, maybe you should simply check what output you get from exec('rm /var/www/html/test.html', $output); var_dump($output); and share it with us
the output is empty
my bad that should of be exec('rm /var/www/html/test.html 2>&1', $output); var_dump($output);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.