Я пытаюсь создать интерактивный веб-сайт, который может открывать игровые серверы и останавливать их для личного использования (и некоторых близких друзей). Я пытаюсь запустить сервер на моей машине с 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>
Задача ещё не решена.
Других решений пока нет …