Есть консольный скрипт (1), который при запуске пишет в базу свой PID полученный функцией getmypid()
И другой скрипт (2), который проверяет запущен ли процесс с заданным PID, для этого он использует команду вида:
tasklist /FI "PID eq 12348" | find "php.exe"
Исполняется команда через shell_exec
где 12348 - PID нужного процесса
Так вот в чём вопрос, если выполнить эту команду в консоли руками, то всё работает, процесс находится.
А сам скрипт выводит пустую строку:
public static function isProcessRunning($pid)
{
$windowsCommand = 'tasklist /FI "PID eq ' . $pid . '" | find "php.exe"';
$linuxCommand = "ps --pid " . $pid . " | grep php | grep " . $pid;
$command = $windowsCommand;
if (static::isLinuxOS()) {
$command = $linuxCommand;
}
$output = shell_exec($command);
var_dump($command);
var_dump($output);
return !empty(trim($output));
}
В чём может быть проблема?
PS:
Если писать так, или вообще без аргументов
<?php
var_dump(trim(shell_exec('tasklist /FI "PID eq 492"')));
?>
то всё работает так
Особенности запуска таких функций как shell_exec, exec, system в том что они пытаются сбросить буфер вывода, что при запуске из браузера приводит к потере данных. Поэтому их в данном случае использовать нельзя.
Это ошибка №1.
Запускаем процессы так:
$handle = popen($command, 'r');
$output = stream_get_contents($handle);
pclose($handle);
return $output;
Ошибка №2 заключалась в том что дополнительные команды Windows типа find или же просто tasklist могут выдавать надписи на русском языке (потому что система у меня русская) и использование trim выдавало неожиданные результаты. Необходимо использовать другие функции обработки строк и поиска совпадений.
Итоговая, правильная функции лежит тут: https://github.com/s4urp8n/common
Можно ли IIS настроить так, чтобы, например, один и тот же запрос кешировался минут на 10 и пользователю возвращался сохраненный HTML вместо нового...