Как выполнять команды внешней оболочки с контроллера laravel?

Мне нужно выполнять команды оболочки из контроллера, но не только для файлов внутри проекта, например. система('РМ /var/www/html/test.html') или система('sudo разархивировать /var/www/html/test.zip');

Я вызываю функцию, но ничего не происходит, есть идеи, как выполнять команды внешней оболочки из контроллера, например, удаление одного файла в другом каталоге?

system('rm /var/www/html/test.html');
//or
exec('rm /var/www/html/test.html')
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
15
0
29 279
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите запускать команды из своего PHP-приложения, я бы рекомендовал использовать Компонент процесса Symfony:

  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('/var/www/html/test.html');
 

я пробовал это, но Symfony Process выполняет команды только внутри каталога проекта, когда я делаю $process = new Process(['rm', '/var/www/another_directory/test.html']), он не выполняется

AnonS 19.01.2019 14:40

@AnonS В этом случае я полагаю, что у вас проблема с разрешениями. Какую операционную систему ты используешь?

Rwd 19.01.2019 17:00

я использую линукс

AnonS 19.01.2019 22:04

вы были правы, это была проблема с разрешением, я дал ему 755 и www-данные, и это работает как шарм, спасибо

AnonS 20.01.2019 16:19

Вам не нужно его устанавливать, он уже включен в Laravel. См. stackoverflow.com/a/27857423/135101.

Tyler Collier 11.03.2021 20:09

@TylerCollier Вы абсолютно правы. При этом кто-то может найти ответ на что-то подобное, кто не использует Laravel. Я пытался написать этот ответ, чтобы применить его к PHP в целом (не только к Laravel).

Rwd 23.05.2021 10:08

@Rwd, вы могли бы упомянуть об этом, как в ссылке, которую я предоставил. В противном случае кто-то, использующий Laravel, может установить его без необходимости, как это сделал я.

Tyler Collier 24.05.2021 07:04

@TylerCollier Да, я могу. Сталкиваетесь ли вы с какими-либо проблемами (за исключением сообщения о возможном конфликте во время composer update)?

Rwd 24.05.2021 08:39

@Rwd Нет, когда я устанавливал его отдельно, проблем не было, но я думаю, как вы намекаете, это повышает вероятность возникновения конфликтов позже.

Tyler Collier 24.05.2021 18:05

Я бы сделал это с тем, что уже предоставляет фреймворк:

1) Сначала создайте класс команды:

php artisan make:command TestClean

Это создаст класс команд в App\Console\Commands.

Затем внутри метода handle этого командного класса напишите:

@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 19.01.2019 14:44

@AnonS Я думаю, как Росс упомянул, что это проблема с разрешением, может быть, вам следует просто проверить, какой вывод вы получаете от exec('rm /var/www/html/test.html', $output); var_dump($output);, и поделиться им с нами.

Eden Reich 19.01.2019 18:28

вывод пустой

AnonS 19.01.2019 22:04

мой плохой, это должен быть exec('rm /var/www/html/test.html 2>&1', $output); var_dump($output);

Eden Reich 20.01.2019 03:00

Другие вопросы по теме