Как я могу выполнить внешний двоичный код из моего 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 и даже в таких веб-проектах, как правило, мне бы очень хотелось получить лучшее представление о «правильном» подходе к этой проблеме. Я уверен, что должен быть стандартный способ?
На самом деле я уже попробовал это, и это не сработало .. хотя бы вы представить себе, что должен. Когда-то я действительно задаюсь вопросом - почему я не получаю никакого файла? Он отправит echo в std io - i.e. Я могу видеть их в браузере, но он не записывает файл. –
@SamRedway, когда вы выполняете свою команду через терминал, записывает ли файл? –
Да, да. Он работает, как ожидалось, с терминала, что оставляет мне думать, что причина, по которой он ведет себя по-разному при вызове из клиента браузера, связана с контекстом, в котором работает этот процесс. В конечном счете, я думаю, что это, вероятно, неверный подход к проблеме, и я решил написать программу интерфейса между веб-приложением и двоичным файлом, который передает данные через файл. –