Ich möchte eine einfache GET-Anfrage an ein anderes Skript auf einem anderen Server senden. Wie mache ich das?
In einem Fall muss ich nur ein externes Skript anfordern, ohne dass eine Ausgabe erforderlich ist.
make_request('http://www.externalsite.com/script1.php?variable=45'); //example usage
Im zweiten Fall muss ich die Textausgabe erhalten.
$output = make_request('http://www.externalsite.com/script2.php?variable=45');
echo $output; //string output
Um ehrlich zu sein, möchte ich nicht mit CURL herumspielen, da dies nicht wirklich die Aufgabe von CURL ist. Ich möchte auch nicht http_get verwenden, da ich nicht über die PECL-Erweiterungen verfüge.
Würde fsockopen funktionieren? Wenn ja, wie mache ich das, ohne den Inhalt der Datei einzulesen? Gibt es keinen anderen Weg?
Vielen Dank an alle
Aktualisieren
Ich sollte hinzufügen, im ersten Fall möchte ich nicht warten, bis das Skript etwas zurückgibt. Wie ich verstehe, wartet file_get_contents () darauf, dass die Seite vollständig geladen wird usw.?
quelle
Antworten:
file_get_contents
wird tun was du willstBearbeiten: Eine Möglichkeit, eine GET-Anforderung auszulösen und sofort zurückzukehren.
Zitiert von http://petewarden.typepad.com/searchbrowser/2008/06/how-to-post-an.html
Öffnen Sie dazu einen Socket, lösen Sie eine Get-Anfrage aus, schließen Sie den Socket sofort und kehren Sie zurück.
quelle
curl_post_async
und sogar positive Stimmen zu erhalten ...So funktioniert die Antwort von Marquis sowohl mit POST- als auch mit GET-Anforderungen:
quelle
ssl://hostname
statt nur aufrufenhostname
.In Bezug auf Ihr Update möchten Sie nicht warten, bis die gesamte Seite geladen ist. Ich denke,
HEAD
Sie suchen nach einer HTTP- Anfrage.get_headers sollte dies tun - ich denke, es fordert nur die Header an, daher wird nicht der gesamte Seiteninhalt gesendet.
"PHP / Curl: HEAD Request dauert auf einigen Websites sehr lange" beschreibt, wie man a
HEAD
Anforderung mit PHP / Curl ausgeführt wirdWenn Sie die Anforderung auslösen und das Skript überhaupt nicht aufhalten möchten, gibt es verschiedene Möglichkeiten unterschiedlicher Komplexität.
"wget -O /dev/null $carefully_escaped_url"
- dies ist plattformspezifisch und Sie müssen wirklich vorsichtig sein, wenn Sie Parameter in den Befehl einbindenquelle
Das tust du nicht. PHP bietet zwar viele Möglichkeiten zum Aufrufen einer URL, bietet jedoch keine sofort einsatzbereite Unterstützung für asynchrone / Thread-Verarbeitung pro Anforderungs- / Ausführungszyklus. Jede Methode zum Senden einer Anforderung für eine URL (oder eine SQL-Anweisung oder eine usw.) wartet auf eine Antwort. Sie benötigen eine Art sekundäres System, das auf dem lokalen Computer ausgeführt wird, um dies zu erreichen (googeln Sie nach "PHP Job Queue").
quelle
Ich würde Ihnen eine gut getestete PHP-Bibliothek empfehlen: Curl-Easy
quelle
Wenn Sie eine Linux-Umgebung verwenden, können Sie den Befehl exec des PHP verwenden, um die Linux-Curl aufzurufen. Hier ist ein Beispielcode, der einen asynchronen HTTP-Beitrag erstellt.
Dieser Code benötigt keine zusätzlichen PHP-Bibliotheken und kann den http-Beitrag in weniger als 10 Millisekunden abschließen.
quelle
quelle
getstatus()
oderwaitSend()
oder aufrufen könnenwaitResult()
. Auf diese Weise kann der Aufrufer ein vollständig asynchrones Verhalten erhalten, indem er in einer Schleife aufruft, um zu überprüfen, ob Ergebnisse vorliegen, und wenn nicht, mit der anderen ausgeführten Aufgabe fortzufahren. Hmm, jetzt möchte ichTask
von .net nach PHPInteressantes Problem. Ich vermute, Sie möchten nur einen Prozess oder eine Aktion auf dem anderen Server auslösen, aber es ist Ihnen egal, was die Ergebnisse sind, und Sie möchten, dass Ihr Skript fortgesetzt wird. Es gibt wahrscheinlich etwas in cURL, das dies bewirken kann, aber Sie sollten in Betracht ziehen
exec()
, ein anderes Skript auf dem Server auszuführen, das den Aufruf ausführt, wenn cURL dies nicht kann. (Normalerweise möchten die Benutzer die Ergebnisse des Skriptaufrufs, daher bin ich mir nicht sicher, ob PHP den Prozess nur auslösen kann.) Mit könnenexec()
Sie einwget
oder sogar ein anderes PHP-Skript ausführen , mit dem die Anforderung gestellt wirdfile_get_conents()
.quelle
Sie sollten besser Nachrichtenwarteschlangen anstelle der empfohlenen Methoden verwenden. Ich bin sicher, dass dies eine bessere Lösung sein wird, obwohl es etwas mehr Arbeit erfordert als nur das Senden einer Anfrage.
quelle
lass mich dir meinen Weg zeigen :)
benötigt nodejs auf dem Server installiert
(Mein Server sendet 1000 https Get-Anfrage dauert nur 2 Sekunden)
url.php:
urlscript.js>
quelle
Für mich ist die Frage über asynchrone GET - Anforderung ist erschienen , weil ich mit Situation getroffen , als ich tun müssen Hunderte von Anfragen zu erhalten und beschäftigen Ergebnisdaten auf jede Anforderung und jede Anfrage dauert erhebliche Millisekunden auszuführen , dass führt zu Minuten (!) Von total mit einfach ausführen
file_get_contents
.In diesem Fall war es ein sehr hilfreicher Kommentar von w_haigh bei php.net zur Funktion http://php.net/manual/en/function.curl-multi-init.php
Hier ist meine aktualisierte und bereinigte Version, in der viele Anfragen gleichzeitig gestellt werden. In meinem Fall entspricht dies dem "asynchronen" Weg. Vielleicht hilft es jemandem!
Es ist einfach, dies neu zu schreiben, um POST oder andere Arten von HTTP (S) -Anfragen oder beliebige Kombinationen davon zu verarbeiten. Und Cookie-Unterstützung, Weiterleitungen, http-auth usw.
quelle
Versuchen:
Dies funktioniert NICHT als Apache-Modul. Sie müssen CGI verwenden.
quelle
Ich fand diesen interessanten Link für die asynchrone Verarbeitung (Anfrage anfordern).
Askapache
Darüber hinaus können Sie eine asynchrone Verarbeitung durchführen, indem Sie eine Nachrichtenwarteschlange wie beispielsweise Beanstalkd verwenden.
quelle
Hier ist eine Anpassung der akzeptierten Antwort zum Ausführen einer einfachen GET-Anforderung.
Wenn der Server eine URL neu schreibt, funktioniert dies nicht. Sie müssen einen voll ausgestatteten http-Client verwenden.
quelle
Nur ein paar Korrekturen an den oben genannten Skripten. Das Folgende funktioniert für mich
quelle
Niemand scheint Guzzle zu erwähnen , einen PHP-HTTP-Client, der das Senden von HTTP-Anforderungen erleichtert. Es kann mit oder ohne arbeiten
Curl
. Es kann sowohl synchrone als auch asynchrone Anforderungen senden.quelle
Basierend auf diesem Thread habe ich dies für mein Codeigniter-Projekt gemacht. Es funktioniert gut. Sie können jede Funktion im Hintergrund bearbeiten lassen.
Ein Controller, der die asynchronen Aufrufe akzeptiert.
Und eine Bibliothek, die die asynchronen Aufrufe ausführt
Diese Methode kann aufgerufen werden, um jedes model :: method () im 'Hintergrund' zu verarbeiten. Es werden variable Argumente verwendet.
quelle
Vorschlag: Formatieren Sie eine FRAMESET-HTML-Seite, die beispielsweise 9 Frames enthält. Jeder Frame erhält eine andere "Instanz" Ihrer myapp.php-Seite. Parallel dazu werden 9 verschiedene Threads auf dem Webserver ausgeführt.
quelle
Für PHP5.5 + ist mpyw / co die ultimative Lösung. Es funktioniert so, als wäre es tj / co in JavaScript .
Beispiel
Angenommen, Sie möchten die Avatare mehrerer GitHub-Benutzer herunterladen. Die folgenden Schritte sind für jeden Benutzer erforderlich.
<img class="avatar" src="...">
und fordere es an (GET IMAGE)---
: Warten auf meine Antwort...
: Warten auf andere Antworten in parallelen FlüssenViele berühmte
curl_multi
Skripte bieten uns bereits die folgenden Abläufe.Dies ist jedoch nicht effizient genug. Möchten Sie wertlose Wartezeiten reduzieren
...
?Ja, mit mpyw / co ist es sehr einfach. Weitere Informationen finden Sie auf der Repository-Seite.
quelle
Hier ist meine eigene PHP-Funktion, wenn ich POST zu einer bestimmten URL einer beliebigen Seite mache ....
Beispiel: * Nutzung meiner Funktion ...
quelle
Versuchen Sie diesen Code ....
Bitte vergessen Sie nicht, die CURL PHP-Erweiterung zu aktivieren.
quelle
CURLOPT_TIMEOUT_MS
zB 100 Millisekunden einstellen, anstattCURLOPT_TIMEOUT
in Sekunden und mindestens 1 Sekunde - für eine schnellere Ausführung.Dies funktioniert gut für mich, leider können Sie die Antwort von Ihrer Anfrage nicht abrufen:
Es funktioniert sehr schnell, es werden keine rohen TCP-Sockets benötigt :)
quelle