Я работаю над приложением, которое позволит мне войти на удаленный сервер 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 секунд в любое время, но в конечном итоге все дочерние элементы синхронизируются и записывают в журнал почти в одно и то же время. Проблема на самом деле не в локальном файле, а в несоответствии времени отклика удаленного сервера, что в конечном итоге приводит к тому, что дочерние процессы одновременно получают свой отчет.