Anzeige - [Hier werben / Mediadaten]
(?) Tags raten (?) (edit)
 
Reply to this topicStart new topicStart Poll
> PHP: HTTP-Requests
mdo
Geschrieben am: Fr 19.01.2007, 20:43
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (inaktiv)
Beiträge: 5
Mitglied seit: 19.01.2007


Hallo,

ich möchte mit PHP HTTP-Requests an Server stellen. Das PHP-Skript, welches durch einen Browser aufgerufen wird, soll also einen weiteren Server per HTTP kontaktieren und dort Daten runterladen.

Dabei gibt es ein paar Voraussetzungen:
- Header senden
- Zugriff auf die Header, die vom fremden Server gesendet werden
- Zugriff auf die herunterzuladenden Daten schon während der Übertragung

Wenn es auch nicht das trifft, was ich umsetzen will: am einfachsten Stellt man sich einen HTTP-Proxy vor. Ich möchte also schon während des Herunterladens die Daten an den anfragenden Client weiterreichen.

fopen() ist einfach zu handhaben und ermöglicht den letzten Punkt dadurch, dass ein Handle vorhanden ist. Jegliche erweiterte Funktionalität ist damit aber mWn nicht umzusetzen. CURL, einige PEAR-Pakete und dergleichen sind wohl nur in der Lage, nach der Abfrage die kompletten Daten auf einen Schlag zu liefern.

Sicherlich gibt es irgendeine bestehende Lösung, für jeglichen Tipp bin ich dankbar.

mdo

Top
PMEmail Poster
Top
 
 
Ansgar Berhorn
TOPdesk Deutschland
#2 Geschrieben am: Fr 19.01.2007, 21:54 (+01:11)
Report PostQuote Post

AyomRank 6
Group Icon

Gruppe: Experten Entwicklung (Mod)
Beiträge: 857
Mitglied seit: 8.10.2004


QUOTE (mdo @ Fr 19.1.2007, 20:43)
Wenn es auch nicht das trifft, was ich umsetzen will: am einfachsten Stellt man sich einen HTTP-Proxy vor. Ich möchte also schon während des Herunterladens die Daten an den anfragenden Client weiterreichen.

Das hört sich nach einer ziemlich verknoten Dreiecksgeschichte an.
Man kann dem Klienten nur eine Datei liefern.

Was der andere Kram nun besser kann als PHP kann ich nicht beurteilen. Aber ist das Problem nicht eventuell das man dem Klienten nur das liefern kann, was er anfordert? Eventuell müssen einfach die Sachen vom eigenen Server und die vom externen Server in einer ZIP-Datei zusammengepackt werden?


--------------------
Top
PMUsers Website
Top
 
mdo
#3 Geschrieben am: Fr 19.01.2007, 22:15 (+00:21)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (inaktiv)
Beiträge: 5
Mitglied seit: 19.01.2007


QUOTE
Man kann dem Klienten nur eine Datei liefern.


Mehr habe ich auch nicht vor. Wie gesagt: man stelle sich einfach einen HTTP-Proxy (wie Squid) vor, der in PHP implementiert wird.

Die gewünschte Funktionalität lässt sich vom Grundsatz her in ein paar Zeilen coden: fopen("http://meine.url/","r") und dann in einer while-Schleife fgets() und ein print für die Ausgabe zum Client. Für eine Anfrage per HTTP kann ich dem Client natürlich auch nur eine Antwort/Datei/Resource schicken. Zwischen dem fgets() und dem print kann ich dann halt alle Aktionen ausführen, die ich möchte. Bei CURL kann ich das mWn nicht, da müsste ich erst den kompletten Download abwarten.

Top
PMEmail Poster
Top
 
Alonso
WEPAX.com
#4 Geschrieben am: Fr 19.01.2007, 22:47 (+00:31)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 514
Mitglied seit: 10.02.2005


Mit fopen wird das nix. Dazu musst du mit Sockets arbeiten. Unter PHP geht das recht gut mit fsockopen. In den Kommentaren unten hats genügend Beispiele..


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
mdo
#5 Geschrieben am: Fr 19.01.2007, 23:34 (+00:46)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (inaktiv)
Beiträge: 5
Mitglied seit: 19.01.2007


QUOTE (Alonso @ Fr 19.1.2007, 23:47)
Mit fopen wird das nix. Dazu musst du mit Sockets arbeiten. Unter PHP geht das recht gut mit fsockopen. In den Kommentaren unten hats genügend Beispiele..

Nur müsste ich dann das gesamte HTTP-Protokoll abbilden. Oder eine existierende Klasse, ein Pear-Modul, whatever umbauen. Ich hege eigentlich immer noch die Hoffnung, dass irgendwer eine "fertige" Lösung kennt.

Top
PMEmail Poster
Top
 
Ansgar Berhorn
TOPdesk Deutschland
#6 Geschrieben am: Sa 20.01.2007, 00:26 (+00:52)
Report PostQuote Post

AyomRank 6
Group Icon

Gruppe: Experten Entwicklung (Mod)
Beiträge: 857
Mitglied seit: 8.10.2004


QUOTE (mdo @ Fr 19.1.2007, 23:34)
QUOTE (Alonso @ Fr 19.1.2007, 23:47)
Mit fopen wird das nix. Dazu musst du mit Sockets arbeiten. Unter PHP geht das recht gut mit fsockopen. In den Kommentaren unten hats genügend Beispiele..

Nur müsste ich dann das gesamte HTTP-Protokoll abbilden. Oder eine existierende Klasse, ein Pear-Modul, whatever umbauen. Ich hege eigentlich immer noch die Hoffnung, dass irgendwer eine "fertige" Lösung kennt.

Dann beschreib doch einfach mal, was du machen willst.
Du machst in deiner Beschreibung oben einen blumigen Eiertanz mit, allerlei Fachwörtern gespickt, um die Problembeschreibung herum.

Für die Lösung des Problems musst du nicht das Internet neu erfinden.

QUOTE
CURL, einige PEAR-Pakete und dergleichen sind wohl nur in der Lage, nach der Abfrage die kompletten Daten auf einen Schlag zu liefern.


Wie soll da eigentlich die Interaktion mit dem Nutzer funktionieren?
Der Nutzer macht 1 Anfrage und bekomt X-Dateien gedrückt. Wie soll das mit einem handelsüblichen Browser gehen?


--------------------
Top
PMUsers Website
Top
 
mdo
#7 Geschrieben am: Sa 20.01.2007, 00:35 (+00:09)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (inaktiv)
Beiträge: 5
Mitglied seit: 19.01.2007


Ich weiß zwar nicht, wo der blumige Eiertanz stattfand, aber als Einsatzzweck kann man sich einfach -- wie zuvor erwähnt -- einen HTTP-Proxy vorstellen. Meinetwegen will ich Squid in PHP nachprogrammieren. Es geht mir aber nicht um das ganze Drumherum, sondern lediglich um a) das Herunterladen und b) das gleichzeitige Weitersenden der Daten an den Client.

Wenn der Client nun eine 200 MB große Datei anfragt, soll der nicht solange warten, bis der Proxy (PHP-Skript) die vom "Upstream-Server" komplett heruntergeladen hat, sondern schon Daten gesandt bekommen, sobald das PHP-Skript welche erhält.

Jeder handelsübliche Browser kann das übrigens, indem man einen Proxy-Server darin einstellt.

Top
PMEmail Poster
Top
 
Alonso
WEPAX.com
#8 Geschrieben am: Sa 20.01.2007, 00:49 (+00:13)
Report PostQuote Post

AyomRank 6
************

Gruppe: Member (aktiv)
Beiträge: 514
Mitglied seit: 10.02.2005


QUOTE (mdo @ Sa 20.1.2007, 1:35)
Jeder handelsübliche Browser kann das übrigens, indem man einen Proxy-Server darin einstellt.

Ja, wenn du ihm einen Proxy angibst. Aber wie willst du dem Browser beibringen, eine normale Webseite als Proxy zu akzeptieren? Ich sehe den Sinn deines Vorhabens ehrlich gesagt auch nicht. Wenn ich dich richtig verstehe, willst du sowas in der Art eines Anonymizer-Service aufbauen?

Eine 200MB Datei in purem HTML abzubilden dürfte relativ schwer sein wink.gif Abgesehen davon wirst du dir die Zähne ausbeissen, solch grosse Datenvolumen im grossen Stil mit PHP zu verarbeiten..


--------------------
Top
PMEmail PosterUsers WebsiteICQ
Top
 
jAuer
Jürgen Auer - freiberufl. Programmierer
#9 Geschrieben am: Sa 20.01.2007, 08:36 (+07:47)
Report PostQuote Post

AyomRank 9
Group Icon

Gruppe: Experten Entwicklung
Beiträge: 2432
Mitglied seit: 4.02.2006


Irgendwie kommt mir der ganze Thread etwas merkwürdig vor:

@mdo: Einerseits willst Du irgendetwas 'wichtiges' machen, andererseits verstehst Du noch nicht einmal diese Beispiele unter fsockopen, die sogar ich als PHP-Nicht-Verwender hinreichend rasch nachvollziehen kann.

Die einzigste ernsthafte Verwendung besteht für mich darin, daß Du - eher illegal - irgendwelche großen Streams (ab einer Minute Dauer) abrufen und diese Clients natürlich nicht erst nach dem kompletten Download zusenden willst. Weder für Html-Seiten, Bilder oder bsp. Word-Dokumente macht dein Wunsch Sinn, die funktionieren immer nur als Ganzes. Bei Streams ist so ein Verfahren technisch möglich, weil man die clientseitig schon verarbeiten kann, während der Download noch läuft.


--------------------
Web-Anwendung 3.0: Ein Online-Kalender für Termine vieler Filialen.

server-daten - die Single-Data-Solution: Web-Datenbanken als Online - CRM - Lösung.
Ihre Geschäftsprozesse entscheiden, was Ihre Online-Datenbank macht. Sie konzentrieren sich auf Ihr Kerngeschäft - Ihre Datenbank funktioniert.
Top
PMEmail PosterUsers Website
Top
 
Irene
irene.ch
#10 Geschrieben am: Sa 20.01.2007, 09:54 (+01:18)
Report PostQuote Post

AyomRank 7
Group Icon

Gruppe: Experten Entwicklung (Mod)
Beiträge: 1114
Mitglied seit: 3.05.2004


Ich hab sowas mal gemacht, allerdings nicht in PHP. Sinn und Zweck davon war quasi ein Werbefilter-Proxy. Dem Browser kann man das Teil dann als Proxy einstellen, aber es wäre natürlich auch möglich, es als TCP/IP-Gateway einzustellen - wenn der Clientbrowser grundsätzlich nur bestimmte Protokolle nutzen darf.

In Dotnet ist das relativ einfach: ein TCP-Listener, der auf Client-Anfragen hört, und dazu ein Clientsocket für die Kommunikation mit den (externen) Webservern. Jeder Request vom Clientbrowser wird dann einfach an den entsprechenden Webserver geschickt, und dessen Antwort wiederum an den Clientbrowser zurückgesandt. Da das Networking in Dotnet mit Streams arbeitet, kann ich problemlos jedes Byte-Paket, das vom Webserver geliefert wird, direkt an den Client schicken und muss nicht warten bis die Antwort komplett da ist.
In meinem Fall hab ich für den TCP-Listener einen HTTPHandler benutzt; der lässt sich in den IIS integrieren und so musste ich das HTTP-Protokoll nicht selber implementieren. Für den Clientsocket hab ich den vorhandenen Webrequest benutzt, da ich nur HTTP benötige und keine anderen Protokolle.

Ob und wie das in PHP geht, weiss ich nicht, da ich kein PHP kann ;-)

Griessli
Irene


--------------------
Top
PMUsers Website
Top
 
mdo
#11 Geschrieben am: Sa 20.01.2007, 12:10 (+02:15)
Report PostQuote Post

AyomRank 2
****

Gruppe: Member (inaktiv)
Beiträge: 5
Mitglied seit: 19.01.2007


QUOTE (Irene @ Sa 20.1.2007, 10:54)
Ich hab sowas mal gemacht, allerdings nicht in PHP. Sinn und Zweck davon war quasi ein Werbefilter-Proxy.


Na also. Danke Irene für den konstruktiven Beitrag. Eben genau die Umsetzung in PHP ist mein Problem.

QUOTE (jAuer @ Sa 20.1.2007, 9:36)
@mdo: Einerseits willst Du irgendetwas 'wichtiges' machen, andererseits verstehst Du noch nicht einmal diese Beispiele unter fsockopen, die sogar ich als PHP-Nicht-Verwender hinreichend rasch nachvollziehen kann.


So so, große Worte. Jeder der sich mal die entsprechenden RFCs anschaut, wird sehen, dass es nicht damit getan ist, mittels fsockopen() einen Socket aufzubauen, den GET-Request zu senden und dann auf die Daten zu warten. Das HTTP-Protokoll sieht da noch ein paar Möglichkeiten mehr vor. Es geht schlicht und ergreifend darum, dass ich kein Interesse daran habe, "das Rad neu zu implementieren", will sagen: ich möchte mir den Aufwand sparen, etwas komplett selbst zu programmieren, falls es sowas wie eine libwget (Achtung: nicht existierendes Beispiel) oder was auch immer für PHP geben sollte.

QUOTE (jAuer @ Sa 20.1.2007, 9:36)
Die einzigste ernsthafte Verwendung besteht für mich darin, daß Du - eher illegal - irgendwelche großen Streams (ab einer Minute Dauer) abrufen und diese Clients natürlich nicht erst nach dem kompletten Download zusenden willst.

*prust* Also ich persönlich möchte den Client auch schon bei legalen halbgroßen Downloads, deren Daten eine halbe Minute Dauer umfassen, nicht unnötig warten lassen.

QUOTE (jAuer @ Sa 20.1.2007, 9:36)
Weder für Html-Seiten, Bilder oder bsp. Word-Dokumente macht dein Wunsch Sinn, die funktionieren immer nur als Ganzes. Bei Streams ist so ein Verfahren technisch möglich, weil man die clientseitig schon verarbeiten kann, während der Download noch läuft.

Es ist beinahe bei jeglichem Dokument sinnvoll es als Proxy auf diese Art und Weise zu verarbeiten. Jegliche Verzögerung bis zum Senden der ersten Daten bedeutet dem Client-Browser eine Wartezeit, während derer nichts geschieht. Wird bspw. ein großes JPG vom Upstream-Server geholt, der die Daten seinerseits schon nur langsam sendet, könnte das Bild mit und mit bereits im Client-Browser angezeigt werden.

Es ging nur um die technische Umsetzung, nicht um eine Grundsatzdiskussion über die Legalität einer möglichen Anwendung. Ich hatte bereits mehrfach die Zweck-Beschreibung "Proxy" genannt. Schade, wenn so etwas direkt zur Assoziation "illegal" führt.

Für mich ist das Thema hier erledigt.
Top
PMEmail Poster
Top
 
Thema wird von 0 Benutzer(n) gelesen (0 Gäste und 0 anonyme Benutzer)
0 Mitglieder:
Trackback-Url: http://www.ayom.com/track/t/16197

Topic Options Reply to this topicStart new topicStart Poll

 


> Ähnliche Themen
Domain http://www.rürup-info.de/ calusa 82 0 Mi 19.11.2008, 11:59
HTTP 302 Weiterleitung unterbinden ZidaneFFIX 165 1 Do 2.10.2008, 12:48
PHP Proxy / Dynamische IP / HTTP ZidaneFFIX 283 4 Do 2.10.2008, 11:44
http://kein-n.de pelone 448 9 Sa 24.05.2008, 12:50
http get mittels Konsole Sancheck 199 4 Di 20.05.2008, 16:19
http://www.preisvergleich-guenstig.de stadtbummel.de 236 0 Mo 1.10.2007, 14:01
HTTP-Antwort Eckerle 386 5 Mi 4.07.2007, 20:59
.net 2 Post requests hintereinander flirtratgeber 180 1 Mo 2.07.2007, 07:23
http://www.ashesandsnow.org ... ohne Worte digitalcorner 550 1 Mi 1.11.2006, 10:04




Anzeige - [Hier werben / Mediadaten]



Anzeigen


[Hier werben / Mediadaten]