Мне нужно выполнять команды оболочки из контроллера, но не только для файлов внутри проекта, например. система('РМ /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-приложения, я бы рекомендовал использовать Компонент процесса Symfony:
Запустите composer require symfony/process
Импортируйте класс в свой файл с use Symfony\Component\Process\Process;
Выполните вашу команду:
$process = new Process(['rm', '/var/www/html/test.html']);
$process->run();
Если вы используете Laravel, вы можете пропустить шаг 1.
В качестве альтернативы (если процесс, выполняющий php, имеет правильные разрешения), вы можете просто использовать функцию PHP развязать() для удаления файла:
unlink('/var/www/html/test.html');
@AnonS В этом случае я полагаю, что у вас проблема с разрешениями. Какую операционную систему ты используешь?
я использую линукс
вы были правы, это была проблема с разрешением, я дал ему 755 и www-данные, и это работает как шарм, спасибо
Вам не нужно его устанавливать, он уже включен в Laravel. См. stackoverflow.com/a/27857423/135101.
@TylerCollier Вы абсолютно правы. При этом кто-то может найти ответ на что-то подобное, кто не использует Laravel. Я пытался написать этот ответ, чтобы применить его к PHP в целом (не только к Laravel).
@Rwd, вы могли бы упомянуть об этом, как в ссылке, которую я предоставил. В противном случае кто-то, использующий Laravel, может установить его без необходимости, как это сделал я.
@TylerCollier Да, я могу. Сталкиваетесь ли вы с какими-либо проблемами (за исключением сообщения о возможном конфликте во время composer update)?
@Rwd Нет, когда я устанавливал его отдельно, проблем не было, но я думаю, как вы намекаете, это повышает вероятность возникновения конфликтов позже.
Я бы сделал это с тем, что уже предоставляет фреймворк:
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 Я думаю, как Росс упомянул, что это проблема с разрешением, может быть, вам следует просто проверить, какой вывод вы получаете от exec('rm /var/www/html/test.html', $output); var_dump($output);, и поделиться им с нами.
вывод пустой
мой плохой, это должен быть exec('rm /var/www/html/test.html 2>&1', $output); var_dump($output);
я пробовал это, но Symfony Process выполняет команды только внутри каталога проекта, когда я делаю $process = new Process(['rm', '/var/www/another_directory/test.html']), он не выполняется