Die schnellere alternative zu file_get_contents()
Derzeit bin ich mit file_get_contents() zu übermitteln die Daten an ein array von Websites, aber nach der Ausführung der Seite bekomme ich diesen Fehler:
Fatal error: Maximum execution time von 30 Sekunden überschritten
Alles, was ich wirklich will, das Skript zu starten laden Sie die Webseite, und dann verlassen. Jede Webseite kann bis zu 5 Minuten zum laden voll, und ich brauche es nicht zu laden voll.
Hier ist, was ich derzeit habe:
foreach($sites as $s) //Create one line to read from a wide array
{
file_get_contents($s['url']); //Send to the shells
}
EDIT: klar, keine Verwirrung, dieses Skript verwendet wird, um die start-Skripte auf anderen Servern, die keine Daten zurückgeben.
EDIT: ich bin jetzt versucht, cURL, den trick zu tun, indem Sie ein timeout von einer Sekunde zu machen, senden Sie die Daten und beenden Sie dann. Hier ist mein code:
$ch = curl_init($s['url']); //load the urls
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //Only send the data, don't wait.
curl_exec($ch); //Execute
curl_close($ch); //Close it off.
Vielleicht habe ich die option falsch. Ich bin auf der Suche durch einige Anleitungen, wie wir sprechen. Nur geben Sie ein update. Danke Euch allen, das hilft mir so weit.
EDIT: Ah, habe das problem gefunden. Ich war mit CURLOPT_CONNECTTIMEOUT statt CURLOPT_TIMEOUT. Hoppla.
Aber jetzt, die Skripts sind nicht auslösen. Verwenden Sie jeweils ignore_user_abort(TRUE); so kann ich nicht verstehen, das problem
Hah, scratch, dass. Nun funktioniert. Danke Euch allen
Nein, ich habe keine Erfahrung mit cURL. Wollte, es zu tun mit etwas, das ich zumindest ein wenig Erfahrung mit. Denken Sie, ich sollte Schrott das mit php und gehen mit cURL?
was genau macht die Webseite? Sie wollen nur, dass es ein Skript starten, dass sollte von alleine laufen, die keine Daten zurückgibt?
Valamo: ja, genau.
es muss noch laufen, obwohl, richtig? Das bedeutet, dass es muss warten, bis die remote-site senden von Daten? Sie konnte nicht einfach die URL aufrufen, die zum auslösen eines remote-scripting-Aktion und dann verwerfen Sie alle Daten, die er sendet?
InformationsquelleAutor Rob | 2010-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es gibt viele Möglichkeiten, um dieses Problem zu lösen.
Könnten Sie LOCKE mit seinen curl_multi_* Funktionen für die asynchrone Ausführung der Anfragen. Oder verwenden Sie cURL den gemeinsamen Weg, aber mit 1 als timeout-limit erreicht, so wird es die Anfrage und senden timeout, aber die Anfrage wird ausgeführt.
Wenn Sie nicht haben cURL installiert, können Sie weiterhin mit file_get_contents, aber forking-Prozesse (nicht so cool, aber funktioniert) mit so etwas wie ZendX_Console_Process_Unix so vermeiden Sie das warten zwischen jeder Anfrage.
So probiert: $ch = curl_init($s['url']); //laden Sie die urls curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); //senden Nur die Daten, nicht warten. curl_exec($ch); //Ausführen curl_close($ch); //Schließen-es ist immer noch be-alle von Ihnen
Sorry, ich habe keine Zeit um es zu testen. Sie möchten möglicherweise versuchen Sie es mit den anderen Methoden.
InformationsquelleAutor Franco
Als Franco erwähnt und ich bin mir nicht sicher, war abgeholt auf, die Sie speziell möchten den curl_multi Funktionen, nicht die normale curl lieben. Diese packs mehrere curl-Objekte in einem curl_multi Objekt und führt Ihnen gleichzeitig die Rückkehr (oder nicht in deinem Fall) die Antworten, wie Sie ankommen.
Beispiel bei http://php.net/curl_multi_init
InformationsquelleAutor Ian B
Re Ihre Updates, Sie müssen nur trigger den Betrieb:
Sie könnten versuchen, mit
file_get_contents
mit einem timeout. Dies würde dazu führen, dass das entfernte Skript aufgerufen wird, sondern die Verbindung beendet wird, nachdem n Sekunden (z.B. 1).Wenn das remote-Skript ist so konfiguriert, dass es weiterhin ausgeführt werden, auch wenn die Verbindung abgebrochen wird (in PHP wäre das
ignore_user_abort
), sollte es funktionieren.Probieren Sie es aus. Wenn es nicht funktioniert, kommen Sie nicht um die Erhöhung Ihrer
time_limit
oder mithilfe eines externen ausführbaren Datei. Aber von dem, was du sagst - Sie müssen nur die Anfrage zu machen - das sollte funktionieren. Sie könnten auch versuchen, das Zeitlimit zu0
aber ich würde nicht darauf Vertrauen, dass.Vom hier:
Um fair zu sein, Chris ' s Antwort beinhaltet bereits diese Möglichkeit:
curl
hat auch einen timeout-Schalter.InformationsquelleAutor Pekka 웃
ist es nicht file_get_contents (), die verbrauchen viel Zeit, aber die Netzwerk-Verbindung selbst.
Denken Sie daran, nicht zu senden die Daten an ein array von Websites, sondern legen Sie sich einen rss-und lassen Sie Sie RSS-Daten.
InformationsquelleAutor Your Common Sense
Ich nicht vollständig versteht die Bedeutung hinter Ihrem Skript.
Aber hier ist was Sie tun können:
BR.
InformationsquelleAutor aviv
Wenn die remote-Seiten bis zu 5 Minuten dauern, um zu laden, Ihre file_get_contents sitzen und warten, dass 5 Minuten. Gibt es eine Möglichkeit, Sie könnte ändern Sie den remote-scripts zu Gabel in einen hintergrund-Prozess und die schwere Verarbeitung gibt? Damit ist Ihre erste hit zurück fast sofort, und nicht warten, bis der Start-Zeitraum.
Andere Möglichkeit ist es, zu untersuchen, ob eine HEAD-Anforderung würde den trick tun. KOPF nicht wieder alle Daten, nur die überschriften, so kann es sein, genug, um die trigger der remote-Arbeitsplätze, und nicht warten, bis die volle Lichtleistung.
InformationsquelleAutor Marc B