linux — PHP: прекращение вывода файла журнала в реальном времени в браузер / передача команд процессам / доступ к другим страницам с помощью скрипта php

Я пытаюсь создать интерактивный веб-сайт, который может открывать игровые серверы и останавливать их для личного использования (и некоторых близких друзей). Я пытаюсь запустить сервер на моей машине с Linux, выводить результаты в реальном времени из файла журнала в браузер и иметь возможность остановить процесс и вывод. Я сталкиваюсь с проблемой, при которой вывод загружается, но когда я нажимаю на кнопку, чтобы остановить скрипт server / php, он будет продолжать ждать появления другой строки. Как только отображается другая строка, все работает нормально, процесс завершается на компьютере с Linux и сценарий php останавливается. В настоящее время я вынужден зайти в мой Linux-пакет и добавить что-то в файл журнала, чтобы остановить выполнение сценария и завершить процессы сервера.

Что я могу сделать, чтобы удовлетворить эти потребности? Я также заметил, что я не могу получить доступ к какой-либо другой странице во время работы сценария php, есть ли исправление для этого? Ниже приведены некоторые вещи, которые я попробовал. Мне также нужно иметь возможность передавать команды процессу для управления сервером через веб-браузер. Я использую веб-сервер apache2.

Пример 1:

    <?php
session_start();
if (isset($_POST['test'])) {
shell_exec('pkill -f ./starbound_server');
$continueLoop = false;
}
?>
<!DOCTYPE html>
<head>
</head>
<body>

<form method="post">
<p>
<button name="test">Run ctl+c</button>
</p>
</form>
<?php
if (!isset($_POST['test'])) {
shell_exec('cd /home/steam/steaamcmd/STEAM/starbound/linux64/ && ./starbound_server > /var/www/html/sb.txt &');
//shell_exec('ping 192.168.0.20 > sb.txt &');
set_time_limit(0);
}
//$file = fopen('test.txt', 'r') or die("UNABLE TO OPEN");
//echo nl2br(fread($file, filesize("test.txt")));

function follow($file) {
$continueLoop = true;
$size = 0;
while ($continueLoop) {
clearstatcache();
$currentSize = filesize($file);
if ($size == $currentSize) {
sleep(.3);
continue;
}

$fh = fopen($file, "r");
fseek($fh, $size);

while ($d = fgets($fh)) {
echo "$d <br>";

}

fclose($fh);
$size = $currentSize;

if (isset($_POST['test'])) {
$continueLoop = false;
}

//if (!isset($firstRun)) {
//    echo "<br><br>First Run<br><br>";
//    $firstRun = "ran";
//}
flush();
ob_flush();
}
}

if (!isset($_POST['test'])) {
follow("/var/www/html/sb.txt");
} else {
echo "Processes terminated";
}
?>

Пример 2:

<?php
session_start();
if (isset($_POST['test'])) {
flush();
ob_flush();
shell_exec('pkill -f ./starbound_server');
$continueLoop = false;
}

?>
<!DOCTYPE html>
<head>
</head>
<body>

<form method="post">
<p>
<button name="test">Run ctl+c</button>
</p>
</form>

<?php
if (!isset($_POST['test'])) {
shell_exec('cd /home/steam/steaamcmd/STEAM/starbound/linux64/ && ./starbound_server > /var/www/html/sb.txt &');
$handle = popen("tail -f /var/www/html/sb.txt 2>&1", 'r');
while(!feof($handle)) {
flush();
ob_flush();
$buffer = fgets($handle);
echo "$buffer\n";
echo "TEST";
flush();
ob_flush();
}
pclose($handle);

} else {
shell_exec("echo 'end' >> /var/www/html/sb.txt");
echo "closed";
}

?>

Пример 3:

<!DOCTYPE html>
<head>
</head>
<body>
<?php

$cmd = "cd /home/steam/steaamcmd/STEAM/starbound/linux64/ && ./starbound_server";
$descriptorspec = array(
0 => array("pipe", "r"),   // stdin is a pipe that the child will read from
1 => array("pipe", "w"),   // stdout is a pipe that the child will write to
2 => array("pipe", "w")    // stderr is a pipe that the child will write to
);
flush();
ob_implicit_flush(true);
ob_end_flush();
$process = proc_open($cmd, $descriptorspec, $pipes, realpath('./'), array());
echo "<pre>";
if (is_resource($process)) {
while ($s = fgets($pipes[1])) {
print $s;
flush();
}
}
echo "</pre>";
proc_close($process);
?>


</body>

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]