Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция exec, запуск программы в background 
:(
    Опции темы
ilyalyu
Дата 10.4.2007, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



нужно запустить программу в background под windows и продолжить выполнение php-скрипта (то есть команда exec (shell_exec, etc) не должна дожидаться окончания выполнения программы). как вариант - запустить программу в background и выводить ее output в браузер. в настоящее время страница грузится 30 секунд, после чего выводится сообщение о превышении максимального времени выполнения скрипта.

пробовал разные варианты:

exec("program.exe");
exec("program.exe >null");
exec("cmd.exe /c program.exe");

то же с shell_exec

passthru("program.exe");

ничего не помогает smile

Это сообщение отредактировал(а) ilyalyu - 10.4.2007, 14:15
PM MAIL   Вверх
xolod
Дата 10.4.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

Репутация: 1
Всего: 13



Попробуйте так:
Код

<?php
    function daemonize($what) {
        chdir(dirname($what));
        pclose(popen('start /b '.$what, 'r'));
    }
    
    // Запуск в фоновом режиме proc.exe
    daemonize('d:\usr\proc.exe');
?>


У меня нет Microsoft Windows, тестировал через Apple BootCamp. Сработало. Но гарантия не 100%.

Это сообщение отредактировал(а) xolod - 10.4.2007, 22:41
PM MAIL   Вверх
ilyalyu
Дата 14.4.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Спасибо! Ваш метод подействовал smile

Оказалось также, что функцию popen можно использовать для последующего перенаправления output-а в браузер:

Код

$handle = popen('start /b program.exe', 'r');
$read = fread($handle, 2048);
echo $read;
pclose($handle);


Однако обнаружилась некоторая странность. Оказалось, что fread обрезает данные, выводимые программой. То есть программа выводит на экран, допустим, 500 символов, а в браузер из них попадает только 100 символов. При этом если через какое-то время (допустим 10 сек) программа выведет на экран еще данные, то они отобразятся в браузере. Может кто знает, чем объясняется такое странное поведение??
PM MAIL   Вверх
xolod
Дата 15.4.2007, 08:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 148
Регистрация: 24.5.2005
Где: Когда: Что:

Репутация: 1
Всего: 13



Попробуйте заменить чтение данных (fread) этим методом:
Код

$read = '';
while (!feof($handle)) {
    $buffer = fgets($handle, 4096);
    $read .= $buffer;
}

PM MAIL   Вверх
ilyalyu
Дата 15.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



не, чего-то fgets не помогает. я уже и proc_open попробовал. короче происходит следующее:

программа выводит блок 1.
проходит секунд 5.
программа выводит блок 2.
и т.д.

В это время в браузере:

Выводится начало блока 1.
проходит секунд 5.
Выводится блок 2.
проходит секунд 30.
Выводится конец блока 1.

Иными словами, данные выводятся в браузер не в той последовательности, в которой они выводились бы на экран. Вероятно, причина в том, что объем данных слишком большой (несколько сотен байтов).

Это сообщение отредактировал(а) ilyalyu - 15.4.2007, 16:27
PM MAIL   Вверх
ilyalyu
Дата 15.4.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.10.2006

Репутация: нет
Всего: нет



Похоже проблема разрешилась. В вызываемой программе надо было просто добавить flush(output)!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.