statt AJAX/js clientseitig => php serverseitig


rernanded

Erfahrenes Mitglied
Hallo
wie könnte ich die folgende Funktion (=clientseitig per AJAX/js(s.u.)) stattdessen server-seitig ausführen lassen? Per node.js? Oder auch per php, so dass ich die entsprechende php-Seite per cronjob einmal täglich/wöchentlich/monatlich aufrufen kann.

MONI

HTML:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<button id="button">los</button>
<div id="info"></div>
<script>
var time=3000;
var ende=1000;
function php_aufrufen(id,ende){
       if(id<=ende){
           $.ajax({
               type: 'POST',
               url: 'wow.php',
               data: {id:id},
               success: function(data){
                  setTimeout(function(){
                       id++;
                     $('#info').html(data)
                     php_aufrufen(id,ende);
                    },time);
               },
               error:function(err){
                      console.log('Fehler beim aufrufen = '+err)  
               }
           });
       }
}

document.getElementById('button').addEventListener('click',function(){
      php_aufrufen(0,ende);
})
</script>
</body>
</html>
 

basti1012

Erfahrenes Mitglied
per cronjob ist das kein problem.
Es gibt auch online Anbieter die Cronjobs anbieten.

Du kannst dir ja auch ein selber bauen.
Du machst dir ein Php Script fertig was du in deiner Webseite einbindest.
Beim ersten Besucher des Tages läßt du das Script anschubsen.
Speicherst das Datum und läßt diesen Tag keinen aufruf des Scriptes zu.
Am nächsten Tag machst du das gleiche und so weiter.
So ungefähr
PHP:
<?php
   error_reporting(-1);
   ini_set('display_errors', true);
   $file='cronhelper.txt';
   $r=file_get_contents($file);
   $heute=date('Y-m-d');
   //echo "Last Upate am  $r";
   if($r!=$heute){
       echo "cron gestartet";
       include('wow.php');
       file_put_contents($file, $heute);
   }else{
       echo "cron lief heute schon mal";
   }
?>
in cron.txt steht nur das Datum
Code:
2020-04-28
cron.txt kann man auch mit der Datenbank ersetzen
Ob das so der richtige Weg ist weiß ich nicht , würde mich aber auch mal interesieren.( funktioniert aber gut )
 

rernanded

Erfahrenes Mitglied
Danke Basti, aber meine obige Funktion in AJAX/js wird damit nicht gestartet/ausgeführt. Ich brauche eine alternative Funktion in php damit diese auf meinem Server läuft und die man sicherlich mit Deinem cron-script starten kann.
MONI
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
wie oft soll dein Ajax Script den laufen ?
Sollen da alle 3000 id's durchlaufen ?
Was passiert den in wow.php ?
Das kann man bestimmt auch ohne ajax machen und nur mit Php und dann währe ein Cron der das Php Script einmal anschubst kein problem
 

rernanded

Erfahrenes Mitglied
Das Script soll einmal am Tag laufen. Teils auch nur einmal in der Woche, im Monat.
Alle 3.000 IDs sollen durchlaufen. Ich weiß das dauert und deshalb will ich ja eine Serverlösung, denn die Ajax-Lösung ist ja bereits von Dir (anderer Thread), aber sie erweist sich leider als problematisch, weil meine Internetverbindung nicht stabil ist(auf dem Land). Ich hab da zwar hin und wieder mal draufgeguckt und händisch was erledigt, aber nun die wow.php entsprechend erweitert.
Deshalb die Serverlösung, der Server läuft stabil rund um die Uhr.
In der wow.php werden Datenbankinhalte aufgerufen, die je nach Inhalt neu sortiert werden und ergänzt werden. Es handelt sich u.a. um alte Datenbestände die laufend mal aufgefrischt werden müssen weil sich zB Gesetze geändert haben.
 

ComFreek

Mod | @comfreek
Moderator
Dann implementier die 3000er-Schleife komplett serverseitig anstatt auf 3000 Requests an den Server zu bauen.
 

rernanded

Erfahrenes Mitglied
Hallo Basti ich kann Dir nicht alles "senden", weil es firmenintern ist.
Hier aber mal ein Beispiel für eine von mehreren wow.php bei der es darum geht alte Websites auf unseren Firmenservern und denen von Kunden abzurufen und zu kontrollieren, was drinsteht und ev. abmahnfähig sein könnte und was nach neuesten Gesetzen geändert werden muß. Ausserdem werden die Verlinkungen(relative, absolute Pfade, ...) geprüft. Ebenso keywords und description in den meta tags ... Insgesamt muß ich zZ über 90.000 Seiten prüfen.

Einiges habe ich bereits händisch gemacht und einiges geht per CMS. Es gibt aber so viele alte Seiten die eben einer derartigen Prozedur bedürfen. Die will man nicht löschen weil bei google usw. gelistet.
Lass uns also bitte nicht diskutieren dass man alles viel besser machen könnte. Weiß ich. Nun ist es aber so und ich hab das Problem. Muß wegen Corona zuhause arbeiten(Homeoffice) und die Verbindung ist Mist.

MONI

PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<?php
error_reporting(0);

$host = "localhost";
$port = "3306";
$username = "";
$password = "";
$dbname = "";

$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");

$id = $_POST["id"];

$statement = $pdo->prepare(" SELECT * FROM server13_websites WHERE id = $id ");

$statement->execute();

$result = $statement->fetchAll();

         foreach ($result as $row) {
            echo $row["id"]."<br />".$row["url"]."<br /><br />";
        }

$urlwow = $row["url"];
$quelltext = file_get_contents($urlwow);
    //echo $quelltext;
echo "<hr></hr>";
$tags = get_meta_tags($urlwow);
    //echo $tags['keywords'];
echo "<hr></hr>";
    //echo $tags['description'];
echo "<hr></hr>";
$wow_a = file_get_html($urlwow);
    foreach($wow_a->find('a') as $element1)
          //echo $element1->href.'<br />';



usw.
usw. Prüfungen und Änderungen
usw.



$sql = "INSERT INTO server13_wesites_new (url,quelltext,keywords,description,links) VALUES ('$url','$quelltext','$keywords','$description','$links')";

$result = $connection->query($sql);

$connection->close();
?>
</body>
</html>
 
Zuletzt bearbeitet:

rernanded

Erfahrenes Mitglied
Ja das mag sein, es hat aber nur interne Verwendung. Danke für den Hinweis.
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Wenn du jetzt alle Sicherheitsbedenken und verbesserungen zur Seite legst und das Script ja auch nicht in der Öffentlichkeit erreichbar ist , könntest du doch mal nee Schleife rumlegen.
Wenn das da oben deine wow.php ist würde ich das so versuchen.
PHP:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<?php
error_reporting(0);
$host = "localhost";
$port = "3306";
$username = "";
$password = "";
$dbname = "";
$idstart=0;//Start id
$idende=10;// Ende id
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");

for($id=$idstart;$id<=$idende;$id++){
   $statement = $pdo->prepare(" SELECT * FROM server13_websites WHERE id = $id ");
   $statement->execute();
   $result = $statement->fetchAll();
   foreach ($result as $row) {
      echo $row["id"]."<br />".$row["url"]."<br /><br />";
   }
   $urlwow = $row["url"];
   $quelltext = file_get_contents($urlwow);
   //echo $quelltext;
   echo "<hr></hr>";
   $tags = get_meta_tags($urlwow);
   //echo $tags['keywords'];
   echo "<hr></hr>";
   //echo $tags['description'];
   echo "<hr></hr>";
   $wow_a = file_get_html($urlwow);
   foreach($wow_a->find('a') as $element1){
          //echo $element1->href.'<br />';
  }
  //usw.
  //usw. Prüfungen und Änderungen
  //usw.
  $sql = "INSERT INTO server13_wesites_new (url,quelltext,keywords,description,links) VALUES ('$url','$quelltext','$keywords','$description','$links')";
  $result = $connection->query($sql);
}
$connection->close();
?>
</body>
</html>
Währe jetzt meine Idee.
Andere Idee währe deine Datenbank Code zu ändern ( zb WHERE id<3000 ) dann mit schleife weiter usw..

Warte aber erstmal was die anderen sagen bevor du da irgendwelche versuche machst
 

rernanded

Erfahrenes Mitglied
Ich versuch mal die Schleife und meld mich. Danke Basti. Dein obiges cron-Script könnte ich zum Anstossen nutzen??? Vllt. kannst Du dazu noch Tipps geben wie ich denn tageweise ev. auch bestimmte Uhrzeiten berücksichtigen könnte. Hatte mal was mit H:i:s probiert aber bisher fehlgeschlagen. Danke vorab.
 

basti1012

Erfahrenes Mitglied
Das selbstgebaute ( cron Script ) funktioniert auch nur wenn das einer aufruft.
Wenn du das in deiner Homepage einbindest und zb 1000 Besucher am Tag hast könntest du das auch um eine bestimmte Zeit laufen lassen ( falls die Seite dann einer aufruft ).,

Kannst du bei dir keine richtigen cronjobs laufen lassen ?
 

rernanded

Erfahrenes Mitglied
Cronjobs sind kein Problem, Dein cron-script funktioniert auch bei mir. Dass mit der Schleife leuchtet mir jedoch nicht ein.
$idstart=0;// Start id
$idende=10;// Ende id
for($id=$idstart;$id<=$idende;$id++){
}
Ich weiß zwar was grundlegend gemeint ist, aber es gibt keinen Ansatz wie die id's nacheinander in Zeitabständen aufgerufen werden. In der clientseitigen AJAX-Scriptversion gibt es dazu ja die settimeout-Funktion.
 

basti1012

Erfahrenes Mitglied
setinterval gibt es da nicht.
Brauchst du das den ?
So wie es jetzt ist rufst du wow.php im Browser auf und er läuft von id 1 bis id 10 durch.
Das wird nicht mal eine Sekunde dauern.

Wenn du aber ein setinterval brauchst und jedes Ergebniss erst sehen willst ( wie im ersten Beitrag ) bevor die nächste Id aufgerufen wird , wird das wohl so nicht gehen weil Php keinen setInterval hat oder setTimeout
 

rernanded

Erfahrenes Mitglied
Aber Du weisst schon, dass es einer gewissen Zeitspanne bedarf bis all die Funktionen bis zum INSERT abgearbeitet wurden. Insofern hast Du recht wenn es nur Millisekunden dauert bis die Schleife durch ist, das führt aber nicht dazu dass INSERT vollständig für jeden Datensatz abgearbeitet wird.
Ich brauche irgendwie mindestens drei Sekunden pro Datensatz. Deshalb dachte ich ja es wäre mit Cronjobs möglich. Ist es aber wohl nicht. Eine Möglichkeit wäre noch das AJAX/js von Dir in node.js zu packen. Ich kläre gerade ob wir node.js auf dem Server laufen haben oder wie es da drauf kommt.

Ich hab die Schleife mal besser in eine eigene php gepackt, es wurde zu unübersichtlich. Das was ich nun händisch per Klick alle drei Sekunden auf "los" machen könnte soll eben automatisch auf dem Server erfolgen.
PHP:
<?php
error_reporting(0);

$idstart=1;
$idende=10;

for($id=$idstart;$id<=$idende;$id++){

echo "<form method=\"POST\" action=\"wow.php\">";
echo "<input type=\"text\" name=\"id\" value=\"$id\">";
echo "<input type=\"submit\" value=\"los\">";
echo "</form>";

}
?>
</body>
</html>
 
Zuletzt bearbeitet:

basti1012

Erfahrenes Mitglied
Ich glaube jetzt brauch es einen Php Profi weil ich kann das nicht erklären.

Ich denke das es so wäre.
In der for Scheleife wird in der Datenbank nach id 1 gesucht und ausgegeben.
Durchläuft deine functionen und danach wird INSERT ausgeführt.
Dann geht die Schleife weiter mit ID 2.

Mach die for Schleife weg und rufe eine Function auf die die Id immer ein höher macht wenn INSERT Positiv wahr
Irgendwie so
PHP:
<?php
error_reporting(0);
$host = "localhost";
$port = "3306";
$username = "";
$password = "";
$dbname = "";
$idstart=0;//Start id
$idende=10;// Ende id
$pdo = new PDO("mysql:host=$host;port=$port;dbname=$dbname", "$username", "$password");

function lauf($idstart,$idende){
   if($idstart<$idende){
        $statement = $pdo->prepare(" SELECT * FROM server13_websites WHERE id = $idstart");
        $statement->execute();
        $result = $statement->fetchAll();
        foreach ($result as $row) {
           echo $row["id"]."<br />".$row["url"]."<br /><br />";
        }
        $urlwow = $row["url"];
        $quelltext = file_get_contents($urlwow);
        //echo $quelltext;
        echo "<hr></hr>";
        $tags = get_meta_tags($urlwow);
        //echo $tags['keywords'];
        echo "<hr></hr>";
        //echo $tags['description'];
        echo "<hr></hr>";
        $wow_a = file_get_html($urlwow);
        foreach($wow_a->find('a') as $element1){
               //echo $element1->href.'<br />';
        }
        //usw.
        //usw. Prüfungen und Änderungen
        //usw.
        $sql = "INSERT INTO server13_wesites_new (url,quelltext,keywords,description,links) VALUES ('$url','$quelltext','$keywords','$description','$links')";
        $result = $connection->query($sql);
        if($result){
            $idstart++;
            lauf($idstart,$idende)
        }
    }else{
       echo "Fertig : Von $idstart bis $idende durchgelaufen";
   }
}
lauf($idstart,$idende)
$connection->close();
?>
Ich würde es so versuchen.
Ich halte mich jetzt hier raus.
Hoffe das sich jetzt einer von den Php Profis einschaltet der dir das besser erklären ,bzw zeigen kann.
Oder Wege zeigt an die wir noch nicht gedacht haben
 

Sempervivum

Erfahrenes Mitglied
rernanded hat gesagt.:
Deshalb dachte ich ja es wäre mit Cronjobs möglich. Ist es aber wohl nicht.
Doch, ist es und ich habe es schon praktiziert. Jedenfalls wenn ich richtig verstehe, was Du vorhast.
Du musst die ID speichern und von Aufruf zu Aufruf des Skriptes durch den Cronjob weiterschalten bzw. erhöhen. Pro Aufruf des Skriptes durch den Cronjob wird die ID gelesen, die Operationen für diese ID durchgeführt, die ID weitergeschaltet und wieder gespeichert. Beim nächsten Aufruf des Skriptes dann das selbe für die neue ID gemacht bis alle abgearbeitet sind.
 
Zuletzt bearbeitet:

rernanded

Erfahrenes Mitglied
@basti: Danke. Aber ich denke so gehts nicht weiter.
@Sempervivum: Genauso denke ich es mir. Aber beim Lesen einiger Posts zu dem Thema quer durchs Netz stösst man nicht auf Angaben die Mut machen mit cronjobs eine Lösung zu finden.
Hast Du denn eine cron-script-Grundidee wie ich drangehen könnte, einen solchen Cronjob habe ich bisher nie angefertigt, lediglich dazu abundzu entsprechende Anbieter beauftragt?
Die notwendige Oberfläche um den/die cronjob/s anzulegen habe ich.

Und vllt. kann man auch zusätzlich sleep(); benutzen.?!
 
Zuletzt bearbeitet:

Neue Beiträge