Informationen zwischen 2 Skripten hin und her senden
Yahk
- php
0 telofon0 Felix Riesterer
0 Yahk
0 dedlfix
0 Sven Rautenberg
Hallo,
ich habe zwei PHP Skripte die nicht im Browser laufen(php-cli). Momentan bearbeitet das eine Skript etwas und speichert Informationen in eine mySQL Datenbank. Das zweite Skript wartet auf Änderungen an der Datenbank und arbeitet darauf.
Jetzt merke ich das das ganze extrem Server lastig werden kann. Bei anderen Programmsprachen wird das wohl ohne eine Datenbank geregelt... Gibt es da vielleicht eine alternative für PHP, denn Datenbanken und/oder Dateien als Zwischenspeicher zu verwenden ist mir zu langsam.
mfg
Yahk
Hi
Jetzt merke ich das das ganze extrem Server lastig werden kann. Bei anderen Programmsprachen wird das wohl ohne eine Datenbank geregelt... Gibt es da vielleicht eine alternative für PHP, denn Datenbanken und/oder Dateien als Zwischenspeicher zu verwenden ist mir zu langsam.
Mit Ajax kann man meines Wissens ein Skript "lauschen" lassen, und ein anderes "senden" lassen. Wie ein Server, der auch auf einem Port lauscht, und ein Client, der sendet (und danach zumindest ein "OK" empfängt). Aber meines Wissens geht das nur, wenn die Skripts auch im Browser angezeigt werden (ist bei dir ja nicht der Fall).
Wie machst du das momentan? Ich würde vorschlagen, dass du es (wenn möglich) mal mit einem Cronjob probierst, der alle 15 Minuten (je nach Bedarf) ein Skript anstößt, das die Datenbank abfrägt und bei Änderung "etwas" macht. Die Last lässt sich auch schon verringern, indem du dem Skript längere Perioden zuweist.
Gruß
telofon
wie gesagt eine Datei speichert einen Eintrag in MySQL und das andere Wartet auf einen Eintrag nur ist das viel zu Serverlastig und ich suche wie gesagt eine alternative um es schneller hinzukriegen.
... und das andere Wartet auf einen Eintrag
"Wartet auf einen Eintrag" ist zu schwammig. Was macht das Skript? In einer Endlosschleife die Datenbank abfragen (dann wüsste ich woher die Serverlast kommt)? Oder gibt es da etwas, was ich in dieser Thematik noch nicht kenne?
Was sagst du zu der Idee mit den Cronjobs?
Gruß
telofon
Was sagst du zu der Idee mit den Cronjobs?
Es durchsucht in einer endloschleife mit 10ms warte Zeit, die Datenbank nach neuen Eintragen. Cronjobs tuen eigentlich das selbe nur, dass dafür das aktuelle Skript abgebrochen wird und man viel länger auf Änderungen warten muss. Außerdem wird so keinerlei Informationen an ein anderes Skript geschickt, da ein Cronjob höchstens auf Dateiänderungen oder Datenbankänderungen reagieren kann.
Liebe(r) Yahk,
unter Umständen wäre es eine Lösung, wenn Dein PHP-Script einen Kommandozeilen-Browser (lynx?) starten könnte (mit shell_exec vielleicht), um so das andere PHP-Script aufrufen zu lassen. Ist so eine Lösung für Dich ein gangbarer Weg?
Liebe Grüße,
Felix Riesterer.
unter Umständen wäre es eine Lösung, wenn Dein PHP-Script einen Kommandozeilen-Browser (lynx?) starten könnte (mit shell_exec vielleicht), um so das andere PHP-Script aufrufen zu lassen. Ist so eine Lösung für Dich ein gangbarer Weg?
Das würde in diesen Fall ja garnicht helfen, weil das durch das Skript ausgeführte Skript keine Informationen an das noch laufenende Skript senden kann und das mehrfach und wenn sein muss zeitgleich.
Hi!
ich habe zwei PHP Skripte die nicht im Browser laufen(php-cli). Momentan bearbeitet das eine Skript etwas und speichert Informationen in eine mySQL Datenbank. Das zweite Skript wartet auf Änderungen an der Datenbank und arbeitet darauf.
Du must schon etwas genauer beschreiben, was du vorhast, damit man ein Gefühl dafür entwickeln kann, was konkret man selbst als Lösungsweg hätte nehmen wollen.
Jetzt merke ich das das ganze extrem Server lastig werden kann. Bei anderen Programmsprachen wird das wohl ohne eine Datenbank geregelt... Gibt es da vielleicht eine alternative für PHP, denn Datenbanken und/oder Dateien als Zwischenspeicher zu verwenden ist mir zu langsam.
Viele Wege führen nach Rom. Da gibt es das Prinzip Port öffnen und lauschen und der andere sagt darüber Bescheid. Da gibt es die Möglichkeit, das Dateisystem zu überwachen und bei Änderung benachrichtigt zu werden, also ohne selbst ständig nachzuschauen (ob das mit PHP geht, weiß ich nicht, ich hatte noch nicht das Bedürfnis und noch nicht danach geforscht). Das DBMS selbst kann über einen Trigger aktiv werden, wenn es um datenverändernde Dinge geht.
Lo!
Also es gibt bestimmte Skripte, bei dem es praktisch wäre sowas zu machen, deshalb habe ich das nicht weiter ausgeführt.
Skript A soll immer laufen auf dem Server, mit einer endloschleife. Skript B soll jetzt Informationen an Skript B senden. Das kann Text sein ne Datei oder einfach nur ein Wert wie eine Zahl. Da Skript B aber unterumständen sehr sehr viele Datensendet, wäre eine mySQL Datenbank, die diese Werte zwischenspeichert etwas serverlastig. Den Skript B speichert einen Wert oder eine Information in der Datenbank und Skript A muss jede paar Sekunden überprüfen ob es einen neuen Wert gibt und muss in unterumständen auch noch umschreiben usw. Deshalb wäre eine direkte Methode pratisch bei der Skript A auf eine Information wartet, die von Skript B gesendet wird. Das ganze könnte man sich als "Server und Client" oder "Server zu Server und Client" vorstellen.
Die Idee mit dem Port wäre da wohl die richtige Richtung, hast du da vielleicht mehr Informationen, wie ein PHP Skript "port listing" machen kann? Und wäre das dann annähernd so schnell wie ein normales "Client - Server" System? Das Skript A muss auf mehrere Anfragen schnellstmöglich reagieren können.
mfg
Yahk
Hi!
Die Idee mit dem Port wäre da wohl die richtige Richtung, hast du da vielleicht mehr Informationen, wie ein PHP Skript "port listing" machen kann?
Da musst du dich mit Sockets beschäftigen. Grundlegende Beispiele und Funktionsbeschreibungen sind im Handbuch und weiteres sicher im Netz zu finden.
Und wäre das dann annähernd so schnell wie ein normales "Client - Server" System? Das Skript A muss auf mehrere Anfragen schnellstmöglich reagieren können.
Ich kenne mich da nicht genau aus. Man kann das threadbasiert machen, indem man zu jeder neu ankommenden Verbindung einen neuen Thread startet. Das geht wohl aber mit PHP nicht. Aber wenn ich mich recht erinnere, musst du dein Hauptaugenmerk neben der Verbindungswunschannahme auch auf socket_select() lenken. Das ruft man auf und es kommt zurück, wenn es etwas interessantes auf den Sockets zu berichten gibt.
Lo!
Moin!
Jetzt merke ich das das ganze extrem Server lastig werden kann. Bei anderen Programmsprachen wird das wohl ohne eine Datenbank geregelt... Gibt es da vielleicht eine alternative für PHP, denn Datenbanken und/oder Dateien als Zwischenspeicher zu verwenden ist mir zu langsam.
Du willst eine Job-Queue haben. Dazu gibts natürlich diverse Lösungen.
Eine, die mir gerade über den Weg gelaufen ist (ich hab sie nur mal angeschaut, nicht ausprobiert): Gearman - für PHP gibts dazu eine passende Extension, die man installieren muss. Details in diesem Blogposting.
- Sven Rautenberg