Я пытаюсь реализовать какую-то «многопроцессорность» в php для своей задачи. Задача состоит в проверке состояния каждого устройства в нашей сети.
Для этого я решил использовать looped exec
и он работает. Но я не знаю, работает ли это нормально или нет:
$command = "php scan_part.php $i > null &"; exec($command);
Это вызывает scan_part.php
столько раз, сколько мне нужно, но возникает вопрос: как я могу вычислить время, необходимое для выполнения всех моих scan_part.php
?
Пожалуйста, помоги мне, я застрял!
Используйте 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;
Рассмотрите возможность использования функции microtime()
. Пример №2 на этой странице полезен:
http://php.net/manual/en/function.microtime.php
EDIT: Этот подход не будет работать, поскольку, как указано в комментариях, этот процесс освещается в фоновом режиме. Я не могу предложить лучший подход.
scan_part.php
ли скрипт 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
.
Вы не можете запросить время для выполнения в обычной операционной системе (это системный вызов и обрабатывается ядром). Для этого вам нужно в реальном времени os.
Но вы можете рассчитать его по записи для каждого экземпляра, сколько времени потребовалось для запуска. Затем вычислите среднее значение для этого набора данных.
microtime может дать вам текущее время. Сделайте это так:
while(/** list proc */) { $starttime = microtime(); proc_open( /** some syntax here */); $endtime = microtime() - $starttime; //store time here }
Вы можете использовать microtime (), если вы хотите сравнить все приложение, которое вы также можете изучить в XDebug, оно даст вам подробные отчеты о производительности вашего приложения.
Для окон последняя версия Wampserver поставляется в комплекте с XDebug и webgrind. Для linux установка также довольно проста.