Запуск внешнего приложения

Тема в разделе "PHP", создана пользователем ocheretko, 18 июн 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. ocheretko

    ocheretko Постоялец

    Регистр.:
    28 фев 2009
    Сообщения:
    112
    Симпатии:
    50
    Здравствуйте. Подскажите пожалуйста, как запустить внешнее приложение, и не ждать завершения его работы, а продолжить выполнение скрипта?
     
  2. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    например в фоновом режиме через командную строку

    skript.php
    PHP:
    <?
    //параметры из командной строки
    $par1 $_SERVER['argv']['1']; 
    $par2 $_SERVER['argv']['2']; 
    $output shell_exec("ffmpeg -i ".$par1." 2>&1");
    file_put_contents($par2$output);
    ?>
    а скрипт запуска
    PHP:
    //запуск скрипта в фоновом режиме windows - "> nul", unix - ">/dev/null &"
    exec("/usr/local/bin/php /home/ffmpeg/skript.php file.mp4 log1.txt >/dev/null &");
     
    ocheretko нравится это.
  3. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    перед запуском скрипта надо вызвать nohup

    PHP:
    //запуск скрипта в фоновом режиме windows - "> nul", unix - ">/dev/null &"
    exec("nohup /usr/local/bin/php /home/ffmpeg/skript.php file.mp4 log1.txt > /dev/null &");
     
  4. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    В виндоус это возможно? Из под пхп запустить экзешник и чтоб пхп не дожидаясь его завершения продолжал работать?
    PHP:
    // запускаем долгую программу program.exe
    shell_exec('start program.exe');
    // продолжаем работать не ожидая окончания program.exe
    echo 'continue with work';
     
  5. polyetilen

    polyetilen Заблокирован

    Регистр.:
    10 авг 2006
    Сообщения:
    814
    Симпатии:
    474
    в windows напрямую не получится, но можно по другому запустить, например зарегистрировать команду или запуск программы в планировщик задач.
    Запустить cmd и управлять с командой at - покажет список задач, или тот же список в control panel -> scheduled tasks

    список команд
    http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/at.mspx?mfr=true

    Этот скрипт через минуту после запуска запустит команду netstat и сохранит список соединений в файл c:\log.txt
    PHP:
    <?
    $start_time date('H:i'strtotime('+1 minute'));
    echo 
    $start_time;
    $output shell_exec('at '.$start_time.' cmd /c "netstat > c:\log.txt"');
    echo 
    $output;
    ?>
    програма запускается через start, тогда такой скрипт запустит калькулятор на следующей минуте
    PHP:
    <?
    $start_time date('H:i'strtotime('+1 minute'));
    echo 
    $start_time;
    $output shell_exec('at '.$start_time.' cmd /c "start c:\windows\system32\calc.exe"');
    echo 
    $output;
    ?>
    планировщик задач запускает программы в фоновом режиме, значит окна запущенной программы не будет видно, а если надо чтоб показывало программу юзеру (разрешить команде или программе взаимодействовать с пользователем) то добавить параметр задачи /interactive.

    Такой скрипт покажет калькулятор на следующей минуте после запуска скрипта
    PHP:
    <?
    $start_time date('H:i'strtotime('+1 minute'));
    echo 
    $start_time;
    $output shell_exec('at '.$start_time.' /interactive cmd /c "start c:\windows\system32\calc.exe"');
    echo 
    $output;
    ?>
    без дополнительных параметров задачи выполняются один раз и удаляются из планировщика автоматически.
     
    latteo нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    В своих консольных скриптах под win использую:
    PHP:
    pclose(popen('start parser.php''r')); // Откроет файл с результатами в связанной программе, продолжив при этом работу скрипта!
    Вместо parser.php подставляй имя программы или файл, который необходимо открыть в связанной с ним программе.

    Добавлено через 7 минут
    А вот вопрос волнующий меня: необходим пример кода общающегося с запущенным приложением. Например: запуск telnet в нем выполнение команды -> передача результатов в php -> обработка -> выполнение еще одной команды и т.д. ...
    В теории тот же proc_open() надо использовать, а на практике реализовать не получилось пока. Помогите люди умные кто чем может, а? :)
     
  7. satih

    satih

    Регистр.:
    19 сен 2008
    Сообщения:
    429
    Симпатии:
    710
    перерыл довольно много гугля, пока не вышел через какой-то форум на ответ на самом же сайте пхп :) незаметил его, хотя там показывали в нескольких комментах.

    PHP:
    $WshShell = new COM("WScript.Shell");
    $oExec $WshShell->Run($cmd0false);
    unlink($WshShell$oExec);
     
Статус темы:
Закрыта.