PHP родительский / дочерний тайминг - PullRequest
1 голос
/ 31 декабря 2011

Я работаю над приложением, которое позволит мне войти на удаленный сервер telnet и отслеживать статистику. Проблема заключается в том, что у сервера telnet минимальная частота обновления составляет 10 секунд, а частота обновления незначительно меняется в зависимости от нагрузки на сервер (сам отчет имеет эту частоту обновления, а не сервер). Мне нужно, чтобы интерфейс этой системы обновлялся чаще, чем каждые 10 секунд (минимум 5 секунд). Я в некоторой степени смог добиться этого путем разветвления, но в итоге время синхронизировалось (это постепенный процесс, который, я полагаю, связан с нагрузкой на удаленный сервер).

Дочерний код: (я удалил довольно много кода, касающегося того, как приложение входит в систему и получает доступ к отчету, но в основном это нажатие клавиш через 7 меню, чтобы перейти на страницу, которая обновляется - я могу включить при необходимости ):

// 1 - Telnet Handshaking and initial screen load
$sHandshaking = '<IAC><WILL><OPT_BINARY><IAC><DO><OPT_BINARY><IAC><WILL><OPT_TSPEED><IAC><SB><OPT_TSPEED><IS>38400,38400<IAC><SE>';
// 2-4 - Keypresses to get to report (login, menus, etc. - Removed)

// Loop and cache
while(1){
    //  4 - View Report
    $oVT100->listen(); 
    $reference = $temp;
    $screen = $oVT100->getScreenFull();
    if(empty($screen)){
        Failed:
        echo "FAILED";
        file_put_contents($outFile,array('html'=>"<div class=\"header\"><font color='red'>Why are things always breaking?!<font color='red'></div>"));
        goto restartIt; // If screen does not contain valid report, assume logout and start at top
    }else{
        $screen = parseReport($oVT100->getScreenFull());
        $temp = json_decode($screen);
        // Check old report file, if different save, else sleep a bit
        $currentFile = file_get_contents($outFile);
        if($screen !== $currentFile){
            file_put_contents($outFile,$screen);
            sleep(5);
        }else{
            sleep(1);
            //usleep(500000);
        }
    }
}

Как видно из приведенного выше дочернего кода, он входит в систему, а затем бесконечный цикл в отчете. Затем он записывает экран в файл кэша (если он отличается от существующего файла). В качестве грязного решения проблемы обновления я написал родительский элемент для fork:

$pids = array();

for($i = 0; $i < 2; $i++) {
    sleep(5);
  $pids[$i] = pcntl_fork();

  if(!$pids[$i]) {
    require_once(dirname(__FILE__).'/checkQueue.php');
    exit();
  }

}

for($i = 0; $i < 2; $i++) {
  pcntl_waitpid($pids[$i], $status, WUNTRACED);
}

Я сразу заметил смещение времени, и мне пришлось породить трех детей вместо двух, чтобы они не превышали 5 секунд; но сроки работали в течение нескольких дней. В конце концов, все дети обновляли файл одновременно, и мне пришлось перезапустить родителя. Что было бы лучшим решением для контроля дочерних процессов, чтобы поддерживать интервал обновления менее пяти секунд?

[EDIT] Это не текущий журнал, это файл, который содержит текущую статистику вызовов для колл-центра. Данные в файле кэша должны быть не менее 5 секунд в любое время, но в конечном итоге все дочерние элементы синхронизируются и записывают в журнал почти в одно и то же время. Проблема на самом деле не в локальном файле, а в несоответствии времени отклика удаленного сервера, что в конечном итоге приводит к тому, что дочерние процессы одновременно получают свой отчет.

1 Ответ

0 голосов
/ 31 декабря 2011

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

$currentFile = file_get_contents($outFile);
if($screen !== $currentFile){
    if(time()-filemtime($outFile) > 2){
        file_put_contents($outFile,$screen);
        sleep(5);
    }else{
        echo "Failed, sleeping\r";
        sleep(2);
    }
}else{
    sleep(1);
    //usleep(500000);
}

В основном, я проверяю время записи файла в кеш-файл, и если оно меньше 2 секунд назад, сплю и повторяю цикл. Я немного надеялся, что в родительском приложении будет решение, но думаю, это сработает ...

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