2012-04-24 3 views
4

У меня есть файл ехе, который имеет следующий код:Срок выполнения shell_exec

While (1)

Е ("привет \ п");

Я выполнения этого ехе через PHP, используя shell_exec

$ выход = shell_exec ('C: /Users/thekosmix/Desktop/hello.exe 2> & 1');

echo $ output;

теперь сценарий выполняется в течение очень долгого времени, пока я убить процесс из диспетчера задач, и это дает роковую ошибку:

(Фатальная ошибка: Разрешены памяти размером 134217728 байт исчерпаны (пытались выделить 133693440 байт) в C: \ xampp \ htdocs \ shell \ index.php в строке 7)

Я хочу, чтобы сценарий (или эта функция) выполнялся в течение заданного времени и печатал все выходные данные, генерируемые во время продолжительности не смертельная ошибка. set_time_limit() также не решает проблему.

ответ

3

Вы не можете сделать это из PHP - set_time_limit() проверяется только после выполнения каждой инструкции PHP. Под linux вы используете ulimit, но похоже, что вы используете Windows.

Вам необходимо либо модифицировать исполняемый файл hello.exe для создания тайм-аута, либо написать оболочку, которую вы вызываете из PHP, которая вызывает hello.exe и обрабатывает таймаут. На любом языке, который может легко развиваться, это тривиально.

+1

используя ulimit, как я могу решить свою проблему ?? Я новичок в Linux ... так что не знаю, как использовать ulimit ...! – thekosmix

+0

'ulimit -t 3' устанавливает текущий процесс только на 3 секунды времени процессора. этот процесс будет убит, когда этот срок достигнут. Помните, что это время процессора, а не в реальном времени. – Cal

+0

u означает, что я могу это сделать. shell_exec ('ulimt -t 3'); shell_exec ($ path_to_program); – thekosmix

0

Вы можете изменить сценарий, как так

while (shouldKeepRunning()) 

shouldKeepRunning может, в своей самой грубой форме, проверьте, существует ли определенный файл, чтобы определить, должен ли он продолжать работать. Затем вы просто создаете или удаляете файл, чтобы изящно закрыть скрипт. В linux для этого можно использовать обработчик сигнала, но не окна. В любом случае, вы понимаете.

Вы можете использовать тики, если внешний цикл while не достаточно гранулирован, без массивного модификации кода. http://php.net/manual/en/control-structures.declare.php

Смежные вопросы