Задать вопрос
@Sad_Bro
На темной стороне.

Как не ждать ответа консольной команды при запуске ее из php?

Добрый день
со страницы отправляется ajax запрос, на стороне сервера запускается из php команда, пусть будет ping
exec('ping 1.1.1.1 -c 100 >buffer &');

План построчно при помощи ajax читать файл вывода команды и отдавать пользователю. Но не смотря на то что в конце команды стоит '&'. все равно php ждет когда команда выполнится полностью и на это время 'зависает'. Как это победить? я не большой специалист в linux
  • Вопрос задан
  • 4295 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 4
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Decadal
@Decadal
попробуйте так:
exec('ping 1.1.1.1 -c 100 >buffer 2>/dev/null &');
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
exec('/usr/bin/nohup /bin/ping 1.1.1.1 -c 100 >buffer 2>/dev/null &');
Ответ написан
@Sad_Bro Автор вопроса
На темной стороне.
После бессонной ночи возвращаюсь к битве)

я не понимаю что я не так делаю.
есть примитивный клиент
function buttonRunClick(node)
{
    $('button.run_current').addClass('disabled'); //disable after click
    //search index row for adding new tr for container
    $(node).closest('tr').after('<tr id="progress_container"><td colspan="4"><div>progress container after run test</div></td></tr>');


    $.ajax({
        type: "GET",
        url: "/run_current",
        data: { id: node.tagName }
    }).done(function( msg ) {
        alert( "Data Saved: " + msg );
    });
}


метод контроллера
все варианты что я опробовал

1
public function runCurrent()
    {
        $process = new Process('ping 8.8.8.8 -c 10 >/home/dmtry/buff &');
        $process->start();

        return 'done';
    }


2
//запуск shell скрипта в котором 
     // #!/bin/bash
    // sleep20s

        Proc_Close (Proc_Open("~/ping.sh --foo=1 &", Array (), $foo));
        return 'done'


3

exec ('/usr/bin/nohup ping 8.8.8.8 -c 10 >buffer 2>/dev/null &');
    //или 
    exec ('/usr/bin/nohup ping 8.8.8.8 -c 10 >/dev/null 2>/dev/null &');
   //или 
   system('ping 8.8.8.8 -c 10 >buffer 2>/dev/null &');
   //или 
 $cmd = 'ping 8.8.8.8 -c 10';
 $outputfile = '/home/dmtry/buff';
 $pidfile = '/home/dmtry/pid';
 exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));
        return 'done'


во всех случаях скрипт запускается и на этом все, ждем когда он прошагает, потом отдает return.
пробовал перед exec($cmd) делать echo ''; он даже не запускается, каким то образом exec все равно выполняется первым.
Система ubuntu 14.04 lts. php7.

update!

Наконец получил то что надо, возможно костыльно, но работает,
помог совет отсюда stackoverflow.com/questions/14555971/php-exec-back...

exec("screen -d -m -S my_php_session csv.php $file $user", $output);

UPDATE

Возникли проблемы с перенаправляением вывода
Как перенаправить вывод команды в файл? поэтому screen тоже не подошел.
Но вот еще одно аналогичное решение, короче по записи и не создает дополнительного процесса screen и с перенаправлением потока нет проблем
exec("tmux -c 'ping 192.168.1.1 -c 10 >~/buff &'")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы