Хранение временного имени файла и пути в переполнении стека

Я пытаюсь создать веб-интерфейс, который позволил бы пользователю запускать определенный фоновый скрипт в фоновом режиме, получать его содержимое и удалять временный файл, который использовался для хранения выходных данных. Пока у меня есть это:

<form method="POST">
<button type="submit" name="scan" class="btn btn-default">Run script</button>
</form>

<?php

if (isset($_POST['scan'])) {

$tmpfname = tempnam("/tmp", "SS-");
shell_exec('script.sh > '. $tmpfname .' &');
}

?>

<form method="POST">
<button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button>
</form>

<?php

if (isset($_POST['check-and-delete'])) {
if (shell_exec("pgrep <its process>") != '') {
echo 'Script is running';

} else {
echo 'Script is NOT running';

echo '<pre>'. file_get_contents($tmpfname) .'</pre>';
unlink($tmpfname);
}
}

Тем не менее, хотя все, кажется, работает в соответствии с планом, в конце концов, $tmpfname кажется пустым, что приводит к невозможности извлечь его содержимое и удалить его.

Это выглядит следующим образом:

  1. Клики пользователей Run script,
    • 1.1. TMP файл создан;
    • 1.2. Скрипт запускается и его вывод перенаправляется в файл tmp;
  2. Клики пользователей Check if script is running and delete the temporary file,
    • 2.1. Проверяется, запущен ли скрипт. Если скрипт все еще выполняется, ничего не делается, кроме эха;
    • 2.2. Если скрипт не запущен (завершен), он должен получить содержимое файла tmp и удалить его;

Проблема встречается в 2.2, Как я могу сохранить имя временного файла / полный путь постоянно?

0

Решение

Это должно уточнить, что я имел в виду, говоря: магазин $tmpfname в сеансе. Я не гарантирую, что этот код будет работать, могут быть и другие ошибки.

// always start sessions
session_start();

<form method="POST">
<button type="submit" name="scan" class="btn btn-default">Run script</button>
</form>

<?php

if (isset($_POST['scan'])) {

$tmpfname = tempnam(sys_get_temp_dir(), "SS-");
shell_exec('script.sh > '. $tmpfname .' &');
// store in session
$_SESSION['tmpfname'] = $tmpfname;
}

?>

<form method="POST">
<button type="submit" name="check-and-delete" class="btn btn-default">Check if script is running and delete the temporary file</button>
</form>

<?php

if (isset($_POST['check-and-delete'])) {
if (shell_exec("pgrep <its process>") != '') {
echo 'Script is running';

} else {
echo 'Script is NOT running';
// retrieve from session
$tmpfname = $_SESSION['tmpfname'];
echo '<pre>'. file_get_contents($tmpfname) .'</pre>';
unlink($tmpfname);
}
}
1

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

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

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