live выполнить команду git на PHP - PullRequest
0 голосов
/ 02 июня 2019

Я пытался клонировать репозиторий с помощью PHP, поэтому вывод показывает только

cloning into project-name? и не показывать мне следующее сообщение типа

remote: перечисление объектов

удаленный: подсчет объектов

получающий объект 19% (591/3095), 5,06 МиБ | 1024,00 КиБ / с

git SS

вот моя функция для выполнения живой команды

ob_implicit_flush(true);ob_end_flush();

function liveExecuteCommand($cmd)
{

    // while (@ ob_end_flush()); // end all output buffers if any

    $proc = popen("$cmd 2>&1 ; echo Exit status : $?", 'r');

    $live_output     = "";
    $complete_output = "";

    while (!feof($proc))
    {
        $live_output     = fread($proc, 4096);
        $complete_output = $complete_output . $live_output;
        echo "$live_output";
        // @ flush();
    }

    pclose($proc);

    // get exit status
    preg_match('/[0-9]+$/', $complete_output, $matches);

    // return exit status and intended output
    return array (
                    'exit_status'  => intval($matches[0]),
                    'output'       => str_replace("Exit status : " . $matches[0], '', $complete_output)
                 );
}

и затем я вызываю функцию:

liveExecuteCommand('git clone https://username:password@gitlab.com/example/project.git');

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 05 июля 2019

Вам необходимо использовать переключатель --progress.

Из справочной страницы git-clone (1) :

Состояние прогресса отображается в стандартном потоке ошибок по умолчанию когда он подключен к терминалу, если не указан параметр -q. Этот флаг форсирует состояние прогресса, даже если стандартный поток ошибок не направлен на терминал.

Вы должны запустить git clone так:

liveExecuteCommand('git clone --progress https://username:password@gitlab.com/example/project.git');

Проблема:

  1. Когда вы запускаете git clone в своей оболочке, вы подключены к терминалу, и эти буферизованные потоки работают хорошо (вы можете видеть движущиеся счетчики и т. Д. Как интерактивный интерфейс)
  2. Когда ваш код запускается через PHP, он не подключен к терминалу, и поэтому этот вид вывода будет полным мусором (то есть: множество строк обновлений счетчиков, пока он не достигнет 100% и т. Д.)

Вы можете обойти это, используя некоторые хаки. Один из них устанавливает expect, который также предоставляет unbuffer, который может решить эту проблему.

liveExecuteCommand('unbuffer git clone --progress https://username:password@gitlab.com/example/project.git');

Кроме того, проверьте, поможет ли вам обернуть echo "$live_output" в echo nl2br($live_output), если вы будете печатать на веб-странице.

...