[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вызов внешних программ.
nadir-ua
Мне необходи использовать ampl (язык алгебраического моделирования) для оптимизации экономических задач.
Сайт разработчика ampl.com.

Вообщем есть exe файл. Через который осущ управление ampl, в консольном режиме.
Для начала хотел бы сделать вот такую страничку http://ampl.com/TRYAMPL/startup.html на ней идет через cgi, но я хотел бы сделать используя php.



Спустя 4 минуты, 9 секунд (29.12.2009 - 00:15) glock18 написал(а):
выбирай любую
exec, shell_exec, system, passthru

Спустя 12 минут, 4 секунды (29.12.2009 - 00:27) nadir-ua написал(а):
Цитата (glock18 @ 28.12.2009 - 21:15)
выбирай любую
exec, shell_exec, system, passthru

А уравлять им получиться.
Я имею ввиду посылать запрос, и получать ответ решение?
И через какие переменные окрыжения это можно сделать?

Спустя 5 минут, 55 секунд (29.12.2009 - 00:33) glock18 написал(а):
для этого можно использовать именованные пайпы

http://ru2.php.net/manual/en/function.popen.php

отсюда и дальше

Спустя 23 часа, 10 минут, 48 секунд (29.12.2009 - 23:44) nadir-ua написал(а):
Первый же вызов
$handle = popen('c:\Soft\amplcml\ampl.exe', 'r');
Привел к зависанию
Что делаю не так.

В диспечере задач появл процесс ampl.exe.

Спустя 4 минуты, 50 секунд (29.12.2009 - 23:49) nadir-ua написал(а):
Может надо настроить php.
открыть права на запуск

Спустя 28 минут, 19 секунд (30.12.2009 - 00:17) nadir-ua написал(а):
$handle =popen('start c:\Soft\amplcml\\ampl.exe', 'r');
запускает файл


но управлять я им не могу.

Как мне посылать запросы, и получать ответы.
Если можно по подробнее. т.к с php знаком не давно

Спустя 4 часа, 5 минут, 49 секунд (30.12.2009 - 04:23) VolCh написал(а):
Цитата (nadir-ua @ 29.12.2009 - 00:27)
Цитата (glock18 @ 28.12.2009 - 21:15)
выбирай любую
exec, shell_exec, system, passthru

А уравлять им получиться.
Я имею ввиду посылать запрос, и получать ответ решение?
И через какие переменные окрыжения это можно сделать?

А как он работает, как запросы принимает и как отдает? это сервер, слушающий порт/сокет, интерактивная среда, работающая со stdin/stdout, утилита командной строки, принмающая и выдающая файлы, или, может вообще GUI приложение smile.gif
Цитата
Если можно по подробнее. т.к с php знаком не давно

Тут проблема, скорее всего, не в PHP, а в том, как этим процессом управлять из командной строки, PHP тут постольку поскольку

Спустя 4 часа, 13 минут, 45 секунд (30.12.2009 - 08:36) glock18 написал(а):
nadir-ua
по обычный функциям чтения из файла (потока). по ссылке все есть, читай.

Спустя 1 час, 5 минут (30.12.2009 - 09:41) nadir-ua написал(а):
Цитата (VolCh @ 30.12.2009 - 01:23)
А как он работает, как запросы принимает и как отдает? это сервер, слушающий порт/сокет, интерактивная среда, работающая со stdin/stdout, утилита командной строки, принмающая и выдающая файлы, или, может вообще GUI приложение smile.gif



Я так думаю что утилита командной строки.
Черный экран, ждет ввода команд
ampl:

Спустя 16 минут, 17 секунд (30.12.2009 - 09:58) nadir-ua написал(а):
ampl.exe
user posted image

sw.exe
user posted image

Спустя 33 минуты, 40 секунд (30.12.2009 - 10:31) VolCh написал(а):
Вот что нашел:
Цитата
Under Unix, MS-DOS or Microsoft Windows, you would execute AMPL by use of the system procedure, as in these examples:

system("ampl &ltcut.run");
system("ampl &ltcut.run &gtcut.out");

The argument to system can be anything one would type on a command line. Most commonly, an input file (cut.run above) contains a series of AMPL commands that read model and data input, invoke solvers, and write results to files. This arrangement does not provide for results to be passed back directly to your program; following the call to system, your program must get the results by reading a file that AMPL has written.

Спустя 4 дня, 11 часов, 25 минут, 51 секунда (4.01.2010 - 21:57) nadir-ua написал(а):
Сделал так скопировал в system32 ampl.exe, чтобы можно было запускать без пути.

$last_line = system("ampl", $retval);
// Printing additional info
echo $retval;

Вывод результата не происходит. Страница ни как не может загрузиться.
После того как убиваю процесс ampl загрузка страницы останавливается.

Вчем может буть ошибка?

Спустя 18 минут, 5 секунд (4.01.2010 - 22:15) glock18 написал(а):
nadir-ua
ну сказали же, надо запустить программу и "слушать" ее. надо еще читать мануал, а не просто юзать функции, которые дают.

подключаешься по popen к файлу. fwrite - отправляешь данные туда, fread - получаешь. ну и подобные функции.

Спустя 17 минут, 16 секунд (4.01.2010 - 22:33) nadir-ua написал(а):
glock18

$filename = "c:\Soft\amplcml\ampl.exe";
$handle = popen('c:\Soft\amplcml\ampl.exe', 'w');
fwrite($handle, 'solver;');
echo fread($handle,filesize($filename));

Результат нулевой(


Спустя 18 минут, 33 секунды (4.01.2010 - 22:51) glock18 написал(а):
proc_open вместо popen

Спустя 9 минут, 27 секунд (4.01.2010 - 23:01) nadir-ua написал(а):
fread($handle, 2096);

проблема не решена

Спустя 20 минут, 23 секунды (4.01.2010 - 23:21) glock18 написал(а):
nadir-ua
дк, решай. мне повторять что ли, что надо самостоятельно анализировать? что надо разбираться, что лично мне не очень то в общем интересно "не работает" ли у тебя. когда ситуацию можешь проанализировать и дать мне нормальные, адекватные данные, тогда мне это будет интересно. пока вижу только человека, который хочет. просто хочет, но ничего не делает для этого сам. вперед.

Спустя 11 часов, 22 минуты, 20 секунд (5.01.2010 - 10:43) nadir-ua написал(а):
Вынужден обратиться еще раз.
Файл ampl.exe не решает задачи, не может запустить решатель. (Cannot invoke cplex: no such program.)

Есть файл sw.exe, который запускает решатели. Но, я не могу его использовать в php.
При замене proc_open("c:\Soft\amplcml\sw.exe", $descriptorspec, $pipes);

Открывается окно sw и страница виснет.
Sw.exe выглядит так:

Спустя 2 минуты, 28 секунд (5.01.2010 - 10:46) nadir-ua написал(а):
user posted image

Спустя 54 минуты, 43 секунды (5.01.2010 - 11:40) nadir-ua написал(а):
Нашел рабочий apml.exe, но при вызове из php не работает. Ошибка Cannot invoke minos: no such program.

Minos-это отдельный exe файл.

Спустя 1 час, 17 минут, 40 секунд (5.01.2010 - 12:58) VolCh написал(а):
nadir-ua
тот код, который я цитировал работает?

Спустя 6 минут, 7 секунд (5.01.2010 - 13:04) nadir-ua написал(а):
Вот код который работает
[code]
$descriptorspec = array(
0 => array("pipe", "r"), // stdin это канал, из которого потомок будет читать
1 => array("pipe", "w"), // stdout это канал, в который потомок будет записывать
2 => array("file", "c:\Soft\amplcml\error-output.txt", "a"), // stderr это файл для записи
);
$process = proc_open("c:\Soft\amplwarez\ampl.exe", $descriptorspec, $pipesa);

if (is_resource($process)) {
// $pipes выглядит теперь примерно так:
// 0 => записываемый дескриптор, соединённый с дочерним stdin
// 1 => читаемый дескриптор, соединённый с дочерним stdout
// Любой вывод ошибки будет присоединён к /tmp/error-output.txt

//fwrite($pipes[0], "data c:\Soft\amplcml\models\et.dat \n");
//fwrite($pipes[0], "data ds.dat");


// if (!$_GET['name'])
//{
//fwrite($pipesa[0], $_GET['data']);

//}
fwrite($pipesa[0], "option solver minos;\n");

fwrite($pipesa[0], "model c:\Soft\amplcml\models\steel.mod;\n");
fwrite($pipesa[0], "data c:\Soft\amplcml\models\steel.dat;\n");
fwrite($pipesa[0], "solve; \n");
fclose($pipesa[0]);

while(!feof($pipesa[1])) {
echo "<b>" . fgets($pipesa[1], 1024) . "<b>";
}
//fclose($pipesa[0]);
fclose($pipesa[1]);

// Важно, чтобы вы закрыли любые каналы до вызова
// proc_close, чтобы исключить тупиковую блокировку
$return_value = proc_close($process);

echo "<br>command returned $return_value\n";
}

Спустя 5 часов, 36 минут, 30 секунд (5.01.2010 - 18:41) nadir-ua написал(а):
проблема решена!!!


Закинул все в system32
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.