2015-03-14 3 views
0

Как я могу выполнить внешний двоичный код из моего php-кода, без страницы, ожидающей возврата значения до его отправки?Правильный способ запуска двоичного файла в отдельном процессе без возвращаемого значения

Позвольте пояснить. У меня есть веб-приложение, которое должно выполнять некоторые довольно интенсивные задачи процессора, такие как много файлов ввода-вывода среди других вещей. Я хочу, чтобы мой пользователь мог инициировать свою задачу из графического интерфейса в своем браузере, но затем я хочу, чтобы моя программа передала задачу отдельному файлу на моем сервере, поэтому моему пользователю не нужно сидеть и ждать всей работы быть сделано, и рисковать времени из его/ее связь и т.д.

Позвольте мне показать вам простой пример того, что я пробовал:

index.php

<?php 
    echo "This is a test run for an eternal program: <br><br>"; 
    echo shell_exec("hello"); 

    //ok so we can run executables from php script YAY .. but what about if they are long programs? 
    //If my script is waiting for a return value surely the connection will time out? 

    echo "<br><br>"; 
    echo shell_exec("long_run"); //Waits for return value as expected. Further more it 
            //just does not do the file IO 

?> 

привет

#!/usr/bin/php5 

<?php 
    echo "hello"; 
?> 

long_run

#!/usr/bin/php5 

<?php 
    $f = fopen("time.txt","a"); 
    $i = 1; 

    while ($i < 10) { 
     sleep(2); 
     echo $i . "<br>"; 
     fwrite($f, $i . " "); 
     $i++; 
    } 

    fclose($f); 
?> 

Примечание: Я написал long_run пример в PHP для последовательности в действительности моя программа является бинарной и должна взаимодействовать с PHP, что мой фактический сайт написан с.

Я рассмотрел решение своей проблемы, просто предоставив инструкции сохранения PHP в файл, который мой бинар может сканировать на регулярной основе и действовать. Я думаю, что такого рода интерфейс был бы достаточно лёгким для его реализации, но как человек с ограниченным опытом работы на PHP и даже в таких веб-проектах, как правило, мне бы очень хотелось получить лучшее представление о «правильном» подходе к этой проблеме. Я уверен, что должен быть стандартный способ?

ответ

0

Вы можете достичь этого, выполнив команду в фоновом режиме, только добавив & к команде, которую вы хотите запустить.

Он будет работать двоичный файл в отдельном процессе без возвращаемого значения

<?php 
    shell_exec("yourcommand &"); // It will run the 'yourcommand' in backgournd 
    .... // All further operations will be executed right after the shell exec without waiting for it return value 
+0

На самом деле я уже попробовал это, и это не сработало .. хотя бы вы представить себе, что должен. Когда-то я действительно задаюсь вопросом - почему я не получаю никакого файла? Он отправит echo в std io - i.e. Я могу видеть их в браузере, но он не записывает файл. –

+0

@SamRedway, когда вы выполняете свою команду через терминал, записывает ли файл? –

+0

Да, да. Он работает, как ожидалось, с терминала, что оставляет мне думать, что причина, по которой он ведет себя по-разному при вызове из клиента браузера, связана с контекстом, в котором работает этот процесс. В конечном счете, я думаю, что это, вероятно, неверный подход к проблеме, и я решил написать программу интерфейса между веб-приложением и двоичным файлом, который передает данные через файл. –