In HTML PHP Skript im Hintergrund ausführen?
Ich bin Anfänger und möchte die PHP Datei die ich geschrieben hab in einer HTML Datei im Hintergrund ausführen.
HTML Datei:
<form method="post" action="saveText.php">
<label>
<textarea id="Text" class="textfeld" cols="50" rows="10" name="text" maxlength="250" style="resize: none;" placeholder="Stellen sie hier eine Frage oder gehen sie Wieder..."></textarea>
</label><br>
<input id="Kontakt" type="submit" value="Speichern"/>
</form>
PHP Datei:
<?php
if ($_POST["text"] == "") {
echo "Bitte geben sie einen Text an";
} else {
if (isset($_POST["text"])) {
$data = $_POST["text"];
$handler = fopen("Kontakt/Test.txt", "a");
fwrite($handler, "{");
fwrite($handler, $data);
fwrite($handler, "}" . "\n");
fclose($handler);
}
?>
Geht das?
Was meinst Du mit "im Hintergrund ausführen"..? o_O
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 {
// ...
}
Wenn ich mir die Frage so anschaue, befürchte ich, dass dein b)-Code ein paar Nummern zu hoch ist :)
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
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....
Dann brauchst du JS was diesen Ajax Request auf der Formularseite realisiert. Zum Beispiel mit jQuery hier eine Anleitung: https://noobis.de/jquery-formular-senden/
ich möchte das es nicht die PHP Seite lädt sondern nur das Skript ausführt und auf der selben Seite bleibt