Php AJAX Steuerung

Autor: Christian Ahmer, erstellt: 18.09.2010, zuletzt geändert: 16.09.2014
Kategorien: Php, Javascript, Html, Ajax

Wenn man langwierige Abläufe via PHP steuern möchte, ist es sinnvoll, nicht ewig lange Skriptaufrufe zu verursachen. Es kann nämlich auf Seiten PHP / Apache zu Timeouts kommen, bei sehr lange offen gelassenen Verbindungen / Skriptaufrufen.

Besser ist es, AJAX zu verwenden, um einen langen Ablauf, als Beispiel sei einmal fiktiv ein Newsletterversand genannt. Angenommen, man hat 20000 Empfänger für einen Newsletter, so macht es wenig Sinn, ein PHP Skript so lange laufen zu lassen, bis alle Empfänger beschickt sind.
Man hat da nämlich kaum Einflußmöglichkeiten, um den Ablauf brauchbar zu steuern, z.B. zu pausieren, oder gar zu stoppen / weiter auszuführen.
Besser ist es, wenn man sich für eine Newsletterfunktionalität AJAX bedient. Es reicht ja, wenn man z.B. die ersten 50 Empfänger beschickt und dann wenn diese 50 Empfänger beschickt sind, von PHP aus ein OK an das Javascript sendet, um dann den Versand für die nächsten 50 Empfänger via JS anzustößt. Usw. bis irgendwann alle 20000 Empfänger bedient wurden.
Das macht natürlich summa summarum 400 AJAX Requests, aber dafür hat der Nutzer die Möglichkeit, jederzeit das Skript ordentlich anzuhalten.

Eine Methode so etwas zu relisieren, will ich hier einmal anhand einer einfachen PHP Beispieldatei Schemenhaft demonstrieren, hier wird sich einfach in der PHP Session ein aktueller Zustand gemerkt, und immer wenn der User einen Button drückt, dann erhöht sich via AJAX Aufruf ein Zähler in der PHP Session. Bis irgendwann ein Limit erreicht ist. Das wäre z.B. das Ende der Liste der Empfänger an die versendet werden muss.
Natürlich müsste man das Skript so abändern, dass das Javascript automatisch nachdem eine Antwort jeweils nach 50 versendeten Mails gekommen ist, wieder den Versand der nächsten 50 anstößt, es sei denn, der Nutzer hat z.B. einen Pause Button gedrückt o.ä.

Im folgenden sind hier PHP blau, Javascript rot und HTML grün dargestellt:

 

<?php
session_start();

if($_POST){
    if(!isset($_SESSION['cnt']))
        $_SESSION['cnt']=1;
    else
        $_SESSION['cnt']++;
        
    if($_SESSION['cnt'] >= 5)
        echo 'Hier ist dann Ende!';
    else
        echo $_SESSION['cnt'];
    die();
}
else {
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Ajaxtest</title>
<script type="text/javascript" src="jquery-1.4.2.min.js"></script>

<script type="text/javascript">
function getIt(){
    $.post('http://localhost/tests/ajax/',{val: 'hello'}  , function(data) {
        alert(data);
        //$('.result').html(data);
    });
}

$(document).ready(function() {
    // Binden an Klick auf Button
    $('#getmore').click(function() {
        getIt();
    });
});

</script>
</head>
<body>
Hier kommt was bei Klick:<br />
<div class="result"></div>
<input type="button" id="getmore" name="getmore" value="Klick mich!" />
</body>
</html>

<?php 
}?>