У меня есть такая проблемма. На сервер отправляется *.pas файл, вкотором содержиться текст программы. Далее с помощью команды exec("fpc main.pas") компилирую файл в *.exe. Далее я запускаю этот exe файл( exec("start main.exe") ). Я сделал тестовою Pascal программу, выполнение которой превышает 0.5 сек. Что мне нужно сделать, чтобы сервер отправлял ответ о превышенном лимите времени, если это действительно случилось.
Заглавие надо было сменить "ограничение времени выполнения внешней программы", а то я уже подумал, вроде форум по php, причём тут паскаль
В php запустить выполнение .pas файла в фоновом процессе, потом запустить цикл длительностью 0.5 сек, который каждые N ms будет проверять состояние фонового процесса. Если при проверке состояния оказывается, что процесс выполнен, прервать цикл и вернуть сообщение об успешном выполнении. Если цикл завершился самостоятельно, вернуть сообщение о таймауте.
PHP: <?php // я на винде, поэтому для теста пингую несуществующий ip с задержкой 5 сек. $cmd = 'ping 192.168.0.255 -n 1 -w 5000 > nul'; $process = proc_open($cmd, [], $pipes); if(!is_resource($process)) { exit('не получилось запустить процесс'); } $timeout = .5; // секунды $time_start = time(); while(time() < $time_start + $timeout) { $status = proc_get_status($process); if(false === $status['running']) { // процесс выполнился до таймаута exit('ок'); } usleep(100000); // спать 100 мс, чтобы освободить процессор } exit('таймаут');
То есть вместо $cmd='ping 192.168.0.255 -n 1 -w 5000 > nul'; прописать $cmd='ping file.exe -n 1 -w 5000 > nul'; --- Добавлено --- у меня file.exe находиться в той же директории что и скрипт
Скорее всего твой файл запускается и сразу же падает по ошибке, поэтому при проверке статуса php видит, что процесс уже завершен. Я правильно понимаю, что выполнение main.pas создает main.exe? Что возваращает exec('main.pas')?
У меня ошыбка. Вместо exec('main.pas') должно быть exec( "fpc main.pas" ). Эта команда создает main.exe. Но все равно не работает
А теперь Главный Вопрос: Автор, что ты пытаешься сделать-то? И зачем тебе паскаль из пыхи дергать? Может быть, найдутся более правильные решения, если ты полностью сформулируешь задачу, а не то, как ты ее решаешь?
Мне нужно чтобы пользователь отправлял на сервер решение задачи, а сервер проверял проходит ли задача по тестах
Тебе нужно понять, что возвращает твой процесс. Для этого немного поменяй вызов proc_open: PHP: $process = proc_open($cmd, [ 0 => [ 'pipe', 'r' ], 1 => [ 'file', './stdout.log', 'a' ], 2 => [ 'file', './stderr.log', 'a' ], ], $pipes); В файлах stdout.log или stderr.log будет информация об ошибке.
в файле stderr.log пишет: "." не является внутренней или внешней командой, исполняемой программой или пакетным файлом.