PHP: получить загрузку ЦП ImageMagick/GraphicsMagick

Есть ли в PHP способ зафиксировать использование ЦП каждым методом ImagaMagick/GraphicsMagick, который я выполняю? Использование памяти тоже было бы неплохо.

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

Неудачная попытка:

exec('convert a.jpg a.png');

$result = array();

// Loop until process is detected
do
{
    exec('ps -eo comm,%cpu,%mem | grep ' . "convert", $result);
}
while($result === array());

// Display the changing CPU and memory usage of the process
do
{
    print_r($result);
    exec('ps -eo comm,%cpu,%mem | grep ' . "convert", $result);
}
while($result !== array());

person StackOverflowNewbie    schedule 11.09.2010    source источник


Ответы (1)


Использование памяти должно заключаться в записи выходных данных memory_get_usage(true) и memory_get_peak_usage(true) до и после каждого вызова, который вы хотите измерить, а затем их вычитании.

Использование процессора, о котором я не уверен. В системах Unix это может включать выполнение exec() для получения вывода ps -ef | grep $phpPid, а затем его разбор. Вы можете получить $phpPid = getmypid();

person Fanis Hatzidakis    schedule 11.09.2010
comment
Как получить PID процесса преобразования (библиотека, которую я вызываю из PHP через exec())? Я думаю, что это использование ЦП меня интересует. - person StackOverflowNewbie; 11.09.2010
comment
Если это сам процесс php, то getmypid() даст вам идентификатор процесса. Если это отдельная библиотека, найдите имя ее двоичного исполняемого файла и grep для этого: ps -ef | grep $binaryName. - person Fanis Hatzidakis; 11.09.2010
comment
ps -ef не дал мне того, что мне нужно, но ps -eo comm,%cpu,%mem дал. Пытаясь последовать вашему предложению, я создал сценарий, который до сих пор у меня не работает. Мой оригинальный пост был отредактирован, чтобы показать вам, что я сделал. Вы видите, что я делаю неправильно? - person StackOverflowNewbie; 11.09.2010
comment
Хорошо, теперь я понимаю, что вы имеете в виду. exec() будет ждать завершения преобразования, поэтому вы не увидите этот процесс в ps впоследствии. Возможным решением в этом случае может быть запуск скриптом A отдельного скрипта B прямо перед exec(). Сценарий B может выполнять проверку ps так же, как вы, и сообщать о результатах в какое-либо совместно используемое пространство (например, в файл). - person Fanis Hatzidakis; 11.09.2010