Persistent/keepalive-HTTP mit PHP-Curl-Bibliothek?
Bin ich mit einem einfachen PHP-Bibliothek zum hinzufügen von Dokumenten zu einem SOLR-index per HTTP.
Gibt es 3 Server beteiligt, derzeit:
- Die PHP-box läuft die Indizierung job
- Ein Feld Datenbank hält die Daten indiziert
- Der solr-box.
80 Dokumente/sec (von 1 Millionen Dokumente), ich bin zu bemerken, einen ungewöhnlich hohen interrupt-rate auf der Netzwerk-Schnittstellen auf dem PHP und solr-Boxen (2000/sec; was mehr ist, die Graphen sind nahezu identisch-wenn der interrupt-rate auf der PHP-box-spikes, die es auch spikes an den Solr-box), aber viel weniger auf das Datenbank Feld (300/s). Ich denke, das ist einfach, weil ich offen und Wiederverwendung eine einzelne Verbindung zum Datenbank-server, aber jeder einzelne Solr Anfrage ist derzeit die Eröffnung eines neuen HTTP-Verbindung über cURL, Dank der Möglichkeit der Solr-client-Bibliothek geschrieben.
So, meine Frage ist:
- Können cURL gemacht werden, um zu öffnen, eine keepalive-Sitzung?
- Was braucht es, um eine Verbindung wiederverwenden? - ist es so einfach wie die Wiederverwendung der cURL-handle resource?
- Muss ich irgendwelche speziellen cURL-Optionen? (z.B. force HTTP 1.1?)
- Gibt es irgendwelche Probleme mit cURL-keepalive-verbindungen? Das Skript läuft für Stunden zu einer Zeit; werde ich in der Lage sein, für eine einzelne Verbindung, oder muss ich mich in regelmäßigen Abständen verbinden?
Noch ein Hinweis, oft gibt es Optionen, die Sie benötigen, um je nachdem, was Sie tun und die server, die Sie herstellen. All dies ist sehr gut hier dokumentiert: uk3.php.net/manual/en/function.curl-setopt.php
Dieser Teil der FAQ ist relevant, wenn auch nicht sehr detailliert: curl.haxx.se/docs/faq.html#Can_I_perform_multiple_requests
Eine gotcha-ich lief in: wenn Sie etwas in der Größenordnung von 100.000 Anfragen über eine einzelne LOCKE Griff, mein Skript Treffer 512 MB Speicher-Nutzung; es ging nie über 60 MB, bevor ich begann die Wiederverwendung von verbindungen. Ich bin nun wieder alle 1000 Anfragen (was vermutlich öfter als nötig, aber selten genug, dass die Verbindung overhead sollte sehr klein sein)
Es gibt auch: CURLOPT_MAXCONNECTS - Die maximale Menge von persistenten verbindungen erlaubt sind. Wenn das limit erreicht ist, CURLOPT_CLOSEPOLICY wird verwendet, um zu bestimmen, welche Verbindung zu schließen.
InformationsquelleAutor Frank Farmer | 2009-06-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
cURL in der PHP-Dokumentation (curl_setopt) sagt:
Also:
InformationsquelleAutor Piskvor
Curl sendet den keep-alive-header standardmäßig, aber:
curl_init()
ohne Parameter.CURLOPT_URL
option zum übergeben der url auf die Kontextcurl_exec()
curl_close()
sehr einfaches Beispiel:
curl_setopt($context, CURLOPT_COOKIE, 'name=value');
zum Beispiel für meine Anfrage istcurl_setopt($context, CURLOPT_COOKIE, 'PHPSESSID=bl392rgi8q664l7faat33hfta4');
InformationsquelleAutor Richard Keizer
Auf dem server, auf den Sie zugreifen keep-alive " aktiviert sein muss und maximal keep-alive-requests angemessen sein sollte. Im Falle von Apache finden Sie die apache docs.
Müssen Sie wieder mit der gleichen cURL Kontext.
Beim konfigurieren der cURL Kontext, aktivieren Sie die " keep-alive mit timeout in der Kopfzeile:
Frank, ich habe gerade wieder getestet, mein code und es sieht auch standardmäßig aktiviert sein. Konnte nicht Schaden, es explizit zu tun, obwohl.
wissen Sie, wenn wir brauchen, um zu entfernen
curl_close($curlHandle);
um lebendig zu halten conn. ?ja, Sie haben, um es zu entfernen, wenn Sie Sie nennen
curl_close
wird die Verbindung geschlossenInformationsquelleAutor Oleg Barshay
Wenn Sie kümmern sich nicht um die Antwort der Anfrage, die Sie tun können Sie asynchron, aber Sie laufen die Gefahr der überlastung Ihrer SOLR-index. Ich bezweifle es aber, SOLR ist verdammt schnell.
Asynchrone PHP-Aufrufe?
InformationsquelleAutor Brent