php exec как рассчитать время? - PullRequest
2 голосов
/ 06 июня 2011

Я пытаюсь реализовать какую-то «многопроцессорность» в php для моей задачи.Задача - проверить состояние каждого устройства в нашей сети.

Для этого я решил использовать петлю exec, и она работает.Но я не знаю, работает ли он нормально или нет:

$command = "php scan_part.php $i > null &";
exec($command);

Это вызывает scan_part.php столько раз, сколько мне нужно, но вопрос: как я могу рассчитать время, необходимое для всех моих scan_part.php должно быть выполнено?

Пожалуйста, помогите мне, я застрял!

Ответы [ 5 ]

6 голосов
/ 06 июня 2011

Используйте proc_open для запуска вашего скрипта вместо exec. Proc_open позволяет дождаться завершения процесса через proc_close, который ожидает завершения программы.

$starttime = microtime(true);
$processes = array();
// stdin, stdout, stderr- take no input, save no output
$descriptors = array(
    0 => array("file", "/dev/null", 'r'),
    1 => array("file", "/dev/null", 'w'),
    2 => array("file", "/dev/null", 'w'));

while ($your_condition)
{
    $command = "php scan_part.php $i"; // no pipe redirection, no background mark
    $processes[] = proc_open($command, $descriptors, $pipes);
}

// proc_close will block until the program terminates or will return immediately
// if the program has already terminated
foreach ($processes as $process)
    proc_close($process);
$endtime = microtime(true);

$delta = $endtime - $starttime;
1 голос
/ 06 июня 2011

Выводит ли сценарий scan_part.php что-либо, что ожидает / принимает вызывающий сценарий в качестве ввода? Если нет, вы можете использовать /usr/bin/time для расчета времени выполнения скрипта scan_part:

exec('/usr/bin/time /usr/bin/php scan_part.php &');

Это возвращает что-то вроде этого:

0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 4192maxresident)k
0inputs+0outputs (0major+318minor)pagefaults 0swaps

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

С другой стороны, если scan_parts обычно не производит вывод, и вы можете / будете изменять его, тогда обернуть содержимое scan_parts парой вызовов microtime(true) и вывести разницу будет проще.

$start = microtime(true);
.... do the core of scan_parts here
echo microtime(true) - $start; // output the runtime here
exit();

Это дает вам ОДНО значение времени для возврата, избавляя вас от затрат на анализ /usr/bin/time.

1 голос
/ 06 июня 2011

Вы не можете запросить время для выполнения в нормальной операционной системе (это системный вызов и обрабатывается ядром). Для этого вам понадобится операционная система реального времени.

Но вы можете рассчитать по записи для каждого экземпляра, сколько времени потребовалось для запуска. Чем рассчитать среднее значение по этому набору данных.

Microtime может дать вам текущее время. Сделайте это так:

while(/** list proc */)
{
$starttime = microtime();
proc_open( /** some syntax here */);
$endtime = microtime() - $starttime;
//store time here
}
1 голос
/ 06 июня 2011

Рассмотрите возможность использования функции microtime(). Пример №2 на этой странице полезен:

http://php.net/manual/en/function.microtime.php

РЕДАКТИРОВАТЬ: Этот подход не будет работать, потому что, как указано в комментариях, процесс запускается в фоновом режиме. Я не могу предложить лучший подход.

0 голосов
/ 06 июня 2011

Вы можете использовать microtime (), если вы хотите провести тестирование целого приложения, вы также можете посмотреть на XDebug, он предоставит вам подробные отчеты о производительности вашего приложения.

Для Windows последняя версия Wampserver поставляется с XDebug и webgrind.Для Linux установка также довольно проста.

См .: http://code.google.com/p/webgrind/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...