Intereting Posts
pcntl выполняет один и тот же код несколько раз, требуется помощь Как развернуть проект symfony без доступа к продукту SSH и CLI file_get_contents завершается с ошибкой «getaddrinfo failed: нет адреса, связанного с именем хоста» PHP PDO против стандартного теста производительности производительности mysqli Можно ли загрузить несколько ZIP-файлов с сервера в один ZIP-файл? PHP PDO sqlite: невозможно открыть базу данных Флажок внутри флажка в раскрывающемся списке Laravel 5 добавить результаты запроса в foreach к массиву Пользователи могут загружать видео на одном канале Youtube с аутентификацией или без нее Magento: взаимодействие с несколькими таблицами базы данных в одном модуле администратора Групповой скрипт Условный элемент внутри массива (…) Regex, чтобы получить float из строки увеличение временной задержки для входа в систему, чтобы остановить перебор, хорошая идея? Изменение переменных сеанса PHP с помощью файла include

Как я могу установить ограничение по времени на вызов `exec ()`?

Я пытаюсь сделать онлайн-судья написанным PHP. В настоящее время мой код выглядит так:

exec("gcc /var/www/qwerty.c -o /var/www/binary",$output,$returnval); print_r($output); exec("cat /var/www/qwe.txt | /var/www/binary",$output,$returnval); print_r($output); 

Тем не менее, я хочу, чтобы каждый процесс, порожденный exec выполнял не более 1 секунды. Я не уверен, как это сделать. set_time_limit () не работает

Я бы использовал функции proc_ предложенные @Adam Wright, но быстрой альтернативой Linux-подобным средам является использование команды timeout GNU перед вашей командой:

 // If it took more than 1 second, $returnval will got the exit code 124 exec('timeout 1 gcc /var/www/qwerty.c -o /var/www/binary', $output, $returnval); 

Вы можете использовать ulimit для этого:

 exec(" ( ulimit -t 1 ; gcc ... | /var/www/binary) "); 

Это, конечно, работает только в том случае, если процесс использует активное процессорное время, а не если он ожидает ввода-вывода бесконечно.

Это может быть достигнуто с proc_ семейства функций proc_ . Запустите процессы с помощью proc_open . Неоднократно опроса, используя proc_status (с небольшим сном между опросами) до тех пор, пока процесс не вернется или не пройдет 1 секунда. Если 1 секунда проходит без proc_status показывая, что процесс завершен, используйте proc_terminate (или proc_close ), чтобы убить его, и предпримите соответствующие действия.

Я не говорю, что нереста внешних процессов в PHP-скрипте – хорошая идея.