Hallo, liebe Tutorialisten!
Ich habe ein Problem, mit dem ich leider nicht fertig werde. Die Lösung dafür ist schon halb fertig, allerdings weiß ich nicht, ob es vielleicht einen weitaus einfacheren Ansatz gibt.
Aber nun zu meinem Problem: Und zwar nutze ich für ein Web-Projekt die eBay-Api. Diese limitiert die Anzahl der Aufrufe auf insgesamt 18 Requests gleichzeitig, allerdings benötige ich für jede Suche sehr viele Api-Calls (teilweise mehrere 100 gleichzeitig). Ich habe mir bereits eine Funktion gebaut, die diese Anzahl Requests mittels curl_multi relativ schnell abarbeiten kann, dabei aber immer höchstens 18 Calls gleichzeitig "am Laufen" hat.
Klingt soweit eigentlich ganz gut, aber was ist nun, wenn 2 (oder noch mehr) User gleichzeitig eine Suche durchführen? Dann gäbe es einen Zeitpunkt, in dem ich 36 oder mehr Calls gleichzeitig durchführen würde. Dies führt zum einen zu einer Verlangsamung der Gesamtmenge der Requests, und zum anderen bei zu häufigen "Missbrauch" zwangsläufig zum Ausschluss aus dem eBay Developers Program.
Daher habe ich mir folgende Lösung überlegt, und wüsste jetzt gern, ob das so weiter geführt werden kann, oder evtl. völliger Humbug ist: Ich schreibe die Daten zu den ganzen Calls einfach in eine SQL-Tabelle, und lasse sie von einem Script (im folgenden einfach makeCalls.php genannt) abarbeiten, welche die Ergebnisse dann in eine weitere Tabelle schreibt. Dieses Script darf allerdings immer nur einmal gleichzeitig ausgeführt werden, daher wird in einer weiteren Tabelle vermerkt, ob es schon läuft. Wenn ja, wird es garnicht erst aufgerufen. Nun habe ich allerdings das Problem, dass das aufrufende Script schließlich immer darauf warten muss, dass makeCalls.php fertig wird, und das ist Mist, denn das erste Script wird durch eine Ajax-Anfrage vom Client sufgerufen, und soll so schnell wie möglich Daten zurückliefern, die der Client dringend braucht. Dieser kontaktiert dann wiederum über Ajax einmal in der Sekunde ein weiteres Script, das den Status (einfach eine Zahl zwischen 0 und 100%) zurückgibt, wie groß der Anteil der Calls ist, die schon durchgeführt wurden. Der Client ruft dann bei 100% ein weiteres Script auf, welches die gewünschten Ergebnisse des Api-Calls ausgibt. Wenn nun aber gerade viel los ist auf der Website, kann es ewig dauern, bis makeCalls.php fertig ist, daher keine Statusabfrage und keine Daten. Gibt es daher irgendeine Möglichkeit in PHP, ein Script, das auf dem gleichen Server liegt, aufzurufen ohne die Antwort abwarten zu müssen? In der Doku über curl oder fsockopen konnte ich leider nichts finden.
Der Königsweg ist das allerdings nicht, daher poste ich hier auch mal meine anderen Lösungsansätze:
1. makeCalls.php als cronjob laufen lassen, allerdings halte ich es für Ressourcenverschwendung, alle 100ms eine Datenbankabfrage zu machen, die mit sehr großer Wahrscheinlichkeit ohnehin nichts hergibt.
2. Das ganze über den Client laufen lassen. Ich nutze das Script, welches makeCalls.php aufruft, sozusagen für einen REST-Webdienst, den der Client über Ajax in Anspruch nimmt. Der könnte erst das erste Script aufrufen. Wenn dieses dann fertig geladen hat, also die Tabelleneinträge komplett vorgenommen hat, ruft der Client makeCalls.php auf. Mit Ajax ist es ja ganz einfach, asynchrone Anfragen auszuführen, bei denen man die Antwort garnicht erst abwarten muss. Dies ist meiner Meinung nach die einfachste Lösung, hat aber den Nachteil, dass sehr viel vom Client abhängt, und auf diesen verlasse ich mich nur sehr ungern.
Und nun, zu guter letzt noch das, was ich mir eigentlich vorstellen würde, aber - wie bereits erwähnt - keine Ahnung habe, wie es umzusetzen sein könnte: Script_1.php ruft makeCalls.php auf, und gibt, ohne auf die Antwort zu warten. sofort die gewünschten Daten an den Client weiter. makeCalls.php sieht in der SQL-Tabelle nach, ob es schon läuft und macht sich, wenn nicht, an die Ausführung der Api-Calls. Durch den Cleint erfolgen dann die Statusabfrage, sowie der Download der gewünschten Ergebnisse des Api-Calls, aber dafür habe ich schon eine Lösung.
Aber natürlich ist dieser Lösungsansatz nicht in Stein gemeißelt. Wenn ihr bessere Vorschläge habt, nur her damit. Vielleicht ist die Lösung auch ganz einfach, nur seh ich den Wald vor lauter Bäumen nicht.
So, das wars. Ich hoffe, der Text war nicht zu lang oder zu kompliziert oder beides und mein Problem einigermaßen verständlich.
PS: Wie ihr an meinem Beitrag wahrscheinlich erkennen könnt, bin ich noch ein ziemlicher Anfänger auf dem Gebiet, also tut bei euren Antworten bitte so, als würdet ihr eurer Oma erklären, worum es geht.
Ich habe ein Problem, mit dem ich leider nicht fertig werde. Die Lösung dafür ist schon halb fertig, allerdings weiß ich nicht, ob es vielleicht einen weitaus einfacheren Ansatz gibt.
Aber nun zu meinem Problem: Und zwar nutze ich für ein Web-Projekt die eBay-Api. Diese limitiert die Anzahl der Aufrufe auf insgesamt 18 Requests gleichzeitig, allerdings benötige ich für jede Suche sehr viele Api-Calls (teilweise mehrere 100 gleichzeitig). Ich habe mir bereits eine Funktion gebaut, die diese Anzahl Requests mittels curl_multi relativ schnell abarbeiten kann, dabei aber immer höchstens 18 Calls gleichzeitig "am Laufen" hat.
Klingt soweit eigentlich ganz gut, aber was ist nun, wenn 2 (oder noch mehr) User gleichzeitig eine Suche durchführen? Dann gäbe es einen Zeitpunkt, in dem ich 36 oder mehr Calls gleichzeitig durchführen würde. Dies führt zum einen zu einer Verlangsamung der Gesamtmenge der Requests, und zum anderen bei zu häufigen "Missbrauch" zwangsläufig zum Ausschluss aus dem eBay Developers Program.
Daher habe ich mir folgende Lösung überlegt, und wüsste jetzt gern, ob das so weiter geführt werden kann, oder evtl. völliger Humbug ist: Ich schreibe die Daten zu den ganzen Calls einfach in eine SQL-Tabelle, und lasse sie von einem Script (im folgenden einfach makeCalls.php genannt) abarbeiten, welche die Ergebnisse dann in eine weitere Tabelle schreibt. Dieses Script darf allerdings immer nur einmal gleichzeitig ausgeführt werden, daher wird in einer weiteren Tabelle vermerkt, ob es schon läuft. Wenn ja, wird es garnicht erst aufgerufen. Nun habe ich allerdings das Problem, dass das aufrufende Script schließlich immer darauf warten muss, dass makeCalls.php fertig wird, und das ist Mist, denn das erste Script wird durch eine Ajax-Anfrage vom Client sufgerufen, und soll so schnell wie möglich Daten zurückliefern, die der Client dringend braucht. Dieser kontaktiert dann wiederum über Ajax einmal in der Sekunde ein weiteres Script, das den Status (einfach eine Zahl zwischen 0 und 100%) zurückgibt, wie groß der Anteil der Calls ist, die schon durchgeführt wurden. Der Client ruft dann bei 100% ein weiteres Script auf, welches die gewünschten Ergebnisse des Api-Calls ausgibt. Wenn nun aber gerade viel los ist auf der Website, kann es ewig dauern, bis makeCalls.php fertig ist, daher keine Statusabfrage und keine Daten. Gibt es daher irgendeine Möglichkeit in PHP, ein Script, das auf dem gleichen Server liegt, aufzurufen ohne die Antwort abwarten zu müssen? In der Doku über curl oder fsockopen konnte ich leider nichts finden.
Der Königsweg ist das allerdings nicht, daher poste ich hier auch mal meine anderen Lösungsansätze:
1. makeCalls.php als cronjob laufen lassen, allerdings halte ich es für Ressourcenverschwendung, alle 100ms eine Datenbankabfrage zu machen, die mit sehr großer Wahrscheinlichkeit ohnehin nichts hergibt.
2. Das ganze über den Client laufen lassen. Ich nutze das Script, welches makeCalls.php aufruft, sozusagen für einen REST-Webdienst, den der Client über Ajax in Anspruch nimmt. Der könnte erst das erste Script aufrufen. Wenn dieses dann fertig geladen hat, also die Tabelleneinträge komplett vorgenommen hat, ruft der Client makeCalls.php auf. Mit Ajax ist es ja ganz einfach, asynchrone Anfragen auszuführen, bei denen man die Antwort garnicht erst abwarten muss. Dies ist meiner Meinung nach die einfachste Lösung, hat aber den Nachteil, dass sehr viel vom Client abhängt, und auf diesen verlasse ich mich nur sehr ungern.
Und nun, zu guter letzt noch das, was ich mir eigentlich vorstellen würde, aber - wie bereits erwähnt - keine Ahnung habe, wie es umzusetzen sein könnte: Script_1.php ruft makeCalls.php auf, und gibt, ohne auf die Antwort zu warten. sofort die gewünschten Daten an den Client weiter. makeCalls.php sieht in der SQL-Tabelle nach, ob es schon läuft und macht sich, wenn nicht, an die Ausführung der Api-Calls. Durch den Cleint erfolgen dann die Statusabfrage, sowie der Download der gewünschten Ergebnisse des Api-Calls, aber dafür habe ich schon eine Lösung.
Aber natürlich ist dieser Lösungsansatz nicht in Stein gemeißelt. Wenn ihr bessere Vorschläge habt, nur her damit. Vielleicht ist die Lösung auch ganz einfach, nur seh ich den Wald vor lauter Bäumen nicht.
So, das wars. Ich hoffe, der Text war nicht zu lang oder zu kompliziert oder beides und mein Problem einigermaßen verständlich.
PS: Wie ihr an meinem Beitrag wahrscheinlich erkennen könnt, bin ich noch ein ziemlicher Anfänger auf dem Gebiet, also tut bei euren Antworten bitte so, als würdet ihr eurer Oma erklären, worum es geht.