Как выполнять команды через PHP?

Я пытаюсь конвертировать видео в MP4 с помощью FFMPEG. У меня настроено так:

.
.
private $ffmpegPath;

public function __construct($con) {
    $this->con = $con;
    $this->ffmpegPath = realpath("ffmpeg/bin/ffmpeg.exe");
}
.
.
public function convertVideoToMp4($tempFilePath, $finalFilePath){
    $cmd = "$this->ffmpegPath -i $tempFilePath $finalFilePath 2>&1";

    $outputLog = array();
    exec($cmd, $outputLog, $returnCode);

    if ($returnCode != 0){
        foreach ($outputLog as $line){
            echo $line."<br>";
            return false;
        }
    }

    return true;
}

И в браузере я получаю следующую ошибку: «C:\xampp\htdocs\Thinksmart First Sprint» не распознается как внутренняя или внешняя команда».

В моем конструкторе я настроил его, чтобы дать мне реальный путь, и я подозреваю, что это то, что он делает в командной строке:

C:/xampp/htdocs/Thinksmart FIrst Sprint/ffmpeg/bin/ffmpeg.exe -i (имя временного файла) (имя файла, которое я хочу)

И это должно работать, но я не знаю, почему это не будет. Любые идеи? Это мой первый опыт работы с конвертацией видео.

когда у вас есть пробелы в пути\каталоге, вам нужно указать его в кавычках

user10051234 29.01.2019 23:13

@tim Насколько я знаю, realpath() вернет корневой каталог файла. Например, даже если ваш файл находится на рабочем столе, он будет называться C:/users/username/desktop/filename. Так что в моем случае он уже будет говорить C:/xampp/htdocs/Thinksmart First Sprint/ffmpeg/bin/ffmpeg.exe, но части лестницы 3 не появляются в строке

SuperSimplePimpleDimple 29.01.2019 23:18

Цитата: $cmd = '"'.$this->ffmpegPath.'" -i $tempFilePath $finalFilePath 2>&1'; Я думаю, что в Windows работают только двойные кавычки. Вам нужно указать $tempFilePath $finalFilePath, если в них также могут быть пробелы.

AbraCadaver 29.01.2019 23:19

Затем он говорит: "".$this->ffmpegPath"' не распознается как внутренняя или внешняя команда, я клянусь, что сделал с этим языком...

SuperSimplePimpleDimple 29.01.2019 23:23

Я добавил кавычки вокруг него с комбинацией «и», и он все равно выдает ошибку.

SuperSimplePimpleDimple 29.01.2019 23:24

Переменные не раскрываются в одинарных кавычках, поэтому вам нужно их переключать и объединять с помощью .. Попробуйте тот, что в ответе.

AbraCadaver 29.01.2019 23:28
Стоит ли изучать 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 и хотите разрабатывать...
0
6
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Как видите, пробелы в вашей команде используются для разделения аргументов. Поэтому, если в пути есть пробелы, вам нужно заключить весь путь в кавычки, чтобы оболочка/процессор знал, что они не являются разделителями, а являются одним аргументом:

$cmd = $cmd = '"' . $this->ffmpegPath . '" -i $tempFilePath $finalFilePath 2>&1';

Что приведет к примерно такой команде:

"C:/xampp/htdocs/Thinksmart First Sprint/ffmpeg/bin/ffmpeg.exe" -i C:/path/to/file1 C:/path/to/file2 2>&1

Я думаю, что в Windows работают только двойные кавычки. Вам нужно указать $tempFilePath и $finalFilePath, если в них также могут быть пробелы.

Так что я не должен использовать реальный путь? Если я разверну это веб-приложение, то я зайду на сервер и настрою путь к файлу для каждого сервера, на котором я его разверну? Что, если я использую серверы Linux? Я не хочу показаться грубым, просто хочу спросить, хоть это и звучит грубо. Буквально только любопытство. Как я уже сказал, я новичок во всем преобразовании видео, и я редко использую эти команды exec() в глобальной области (за пределами корневого каталога приложения).

SuperSimplePimpleDimple 29.01.2019 23:32

Я ничего не говорил о неиспользовании realpath. $thi->ffmpegPath в ответе от вашего $this->ffmpegPath = realpath("ffmpeg/bin/ffmpeg.exe");

AbraCadaver 30.01.2019 16:51

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