In HTML PHP Skript im Hintergrund ausführen?

PeterP58  13.04.2022, 14:50

Was meinst Du mit "im Hintergrund ausführen"..? o_O

GodGamer21854 
Fragesteller
 13.04.2022, 14:54

Das es auf der HTML Seite bleibt und nicht auf die PHP Seite Wechselt.

4 Antworten

a) Entferne das action-Attribut und binde den PHP-Code in der selben Datei ein, in der auch dein Formular steht. Diese muss logischerweise die Endung .php bkommen.

Das Formular würde die Daten dann an die selbe Adresse schicken. Ein Neuladen der Seite würde allerdings ebenfalls stattfinden.

b) Verschicke die Daten via JavaScript. Im Vergleich zur vorherigen Lösung wird bei dieser Methodik die Seite nicht neu geladen.

Gib dem Formular dafür eine ID. Das action-Attribut kann erneut entfernt werden.

<form id="my-form" method="post">
  <!-- ... -->
</form>
<script>
  /* JavaScript ... */
</script>

Im JavaScript-Code holst du dir das Formular und hängst einen Handler an dessen submit-Event:

const form = document.getElementById("my-form");
form.addEventListener("submit", evt => {
  evt.preventDefault();

  const formData = new FormData(form);
  const querystring = new URLSearchParams(formData);

  fetch("URL to your PHP file ...", { method: "post", body: querystring })
    .then(response => response.text())
    .then(data => { /* do something with response ... */ })
    .catch(error => console.error(error));
});

In diesem Handler werden die Formulardaten geholt und via Fetch an das PHP-Skript geschickt. Das, was du im PHP-Code (via echo/print/...) zurückschickst, wird aufgefangen und in data gespeichert. Du kannst das Feedback also in JavaScript weiterverarbeiten.

PS.: Deine if-else-Prüfung macht noch nicht so viel Sinn.

Ob es den Eintrag text überhaupt gibt, kannst du mit isset prüfen. Erst danach wäre der Inhalt zu bewerten. Oder du erledigst beides auf einmal mit empty:

if (empty($_POST['text'])) {
  // ...
}
else {
  // ...
}

Palladin007  13.04.2022, 17:17

Wenn ich mir die Frage so anschaue, befürchte ich, dass dein b)-Code ein paar Nummern zu hoch ist :)

1

ERSTELLEN SIE EIN KOMMANDOZEILEN-SKRIPT

1a-Hintergrund.php
<?php
// (A) NUR KOMMANDOZEILE!
if (isset($_SERVER["REMOTE_ADDR"]) || isset($_SERVER["HTTP_USER_AGENT"]) || !isset($_SERVER["argv"])) {
 exit("Bitte führen Sie dieses Skript von der Befehlszeile aus");
}

 

// DIESES DUMMY-SKRIPT ERSTELLT EINE DUMMY-TEXT-DATEI

// ABER SIE TUN, WAS AUCH IMMER IN IHREM EIGENEN PROJEKT ERFORDERLICH IST...

file_put_contents("dummy.txt", "Hintergrundskript ausgeführt um " . date("Y-m-d H:i:s"));

Dies sollte selbsterklärend sein, beginnen Sie mit der Erstellung Ihres „Hintergrundprozessskripts“. Dies kann alles sein, was Sie tun möchten – einige Zahlen zerkleinern, langwierige Scans durchführen oder umfangreiche Berichte erstellen. Für dieses einfache Beispiel erstellen wir einfach eine dummy.txt-Datei auf dem Server.

 

 

FÜHREN SIE DAS HINTERGRUNDSKRIPT AUS

1b-run.php
<?php
// (A) ABSOLUTE PATH TO BACKGROUND SCRIPT
$script = __DIR__ . DIRECTORY_SEPARATOR ."1a-background.php";

// (B) RUN BACKGROUND SCRIPT
// NOTE: PHP_OS_FAMILY IS AVAILABLE IN PHP 7.2+ ONLY
switch (strtolower(PHP_OS_FAMILY)) {
  // (B1) UNSUPPORTED OS
  default:
    echo "Unsupported OS";
    break;
 
  // (B2) WINDOWS
  case "windows":
    echo "Windows";
    pclose(popen("start /B php $script", "r"));
    break;
 
  // (B3) LINUX
  case "linux":
    echo "Linux";
    exec("php $script > /dev/null &");
    break;
}

Wie führen wir 1a-background.php „im Hintergrund“ aus? Wir erstellen ein PHP-Skript, um ein PHP-Skript in der Befehlszeile auszuführen. Ja, greifen Sie einfach auf 1b-run.php zu und prüfen Sie, ob die Datei dummy.txt auf dem Server generiert wird.

P.S. Stellen Sie sicher, dass PHP die Berechtigung zum Ausführen der Befehle hat, sonst schlägt dies fehl.

 

DAS POTENZIELLE PROBLEM & PRÄVENTION

Diese Methode funktioniert, aber es gibt ein potenzielles Problem, wenn ungeduldige Benutzer den Reload-Button viele Male spammen. Das erzeugt mehrere Instanzen des Hintergrundskripts und kann den Server zum Absturz bringen. Es ist besser, einige „Kontrollen und Sperren“ einzubauen, ein einfacher Trick, den ich verwende:

Generieren Sie eine Dummy-lock.txt, wenn die Hintergrundverarbeitung beginnt.

lock.txt am Ende löschen.

Ausführen des Hintergrundskripts nicht zulassen, wenn die Sperre vorhanden ist – if (file_exists("lock.txt")) { exit("Already Running"); }

Wenn es nicht funktioniert werde ich einen weiteren Code für Sie Schreiben

Mit freundlichen Gruß

Narufumi

Woher ich das weiß:eigene Erfahrung

klar. warum sollte des nicht gehen. entweder du schreibst den php-text in die gleiche seite rein, wo des formular steht, verweist auch auf sich selbst im formular - oder du machst ne andere datei - musst halt dann wieder zurückspringen...


Wie jetzt "im Hintergrund"?

Entder du schickst das Formular ganz normal über einen Button an das Script, dann hat das wenig mit "im Hintergrund" zu tun. Oder meinst Du, es soll per Ajax geladen werden? Dann brauchst du dafür entsprechendes JS auf der Formularseite....