mit PEAR HTTP_Client in einer Session bleiben
TobiasBuschi
- php
Hallo allerseits
Wenn ich folgendes mache...
$client =& new HTTP_Client();
$code = $client->get($link);
$code = $client->get($link);
... sollte ich doch beim zweiten aufruf der Methode get() in der selben Session bleiben. Irgendwie geht das aber nicht, ich bekomme eine neue SESSION-ID vom Server ($link) zugewiesen.
Kennt sich da jemand aus?
Was mache ich falsch?
mfg Tobias Buschor
Moin!
$client =& new HTTP_Client();
$code = $client->get($link);
$code = $client->get($link);... sollte ich doch beim zweiten aufruf der Methode get() in der selben Session bleiben. Irgendwie geht das aber nicht, ich bekomme eine neue SESSION-ID vom Server ($link) zugewiesen.
Session-IDs werden entweder per URL-Parameter, verstecktem Formularfeld oder Cookie übertragen.
Hast du irgendeine dieser Übertragungsmethoden berücksichtigt? Das sieht für mich nicht so aus - folglich wird die Session-ID der ersten Anforderung verloren gehen und bei der zweiten Anforderung gibt es eine neue.
Moin!
$client =& new HTTP_Client();
$code = $client->get($link);
$code = $client->get($link);... sollte ich doch beim zweiten aufruf der Methode get() in der selben Session bleiben. Irgendwie geht das aber nicht, ich bekomme eine neue SESSION-ID vom Server ($link) zugewiesen.
Session-IDs werden entweder per URL-Parameter, verstecktem Formularfeld oder Cookie übertragen.
Ich weiss
Hast du irgendeine dieser Übertragungsmethoden berücksichtigt? Das sieht für mich nicht so aus - folglich wird die Session-ID der ersten Anforderung verloren gehen und bei der zweiten Anforderung gibt es eine neue.
Ich glaube das sollte diese PEAR-Klasse "HTTP_Client" machen. Mit dieser Klasse kann ich (auf dem Server mit PHP) auf andere Web-Server zugreifen. Die klasse beinhaltet auch einen Cookie-Manager.
Moin!
Hast du irgendeine dieser Übertragungsmethoden berücksichtigt? Das sieht für mich nicht so aus - folglich wird die Session-ID der ersten Anforderung verloren gehen und bei der zweiten Anforderung gibt es eine neue.
Ich glaube das sollte diese PEAR-Klasse "HTTP_Client" machen. Mit dieser Klasse kann ich (auf dem Server mit PHP) auf andere Web-Server zugreifen. Die klasse beinhaltet auch einen Cookie-Manager.
"Glauben" ist beim Programmieren ganz schlecht. "Wissen" ist viel besser. Und wenn ich einen ganz kurzen Blick in die Dokumentation von HTTP_Client werfe, dann sehe ich, dass dort Cookies von einer eigenen Klasse behandelt werden - was mir recht zweifelsfrei sagt, dass deine doppelte Abfolge von GETs die Cookies eben gerade NICHT berücksichtigt - es wäre programmtechnisch auch relativ idiotisch, dem Server einfach jedes gesetzte Cookie wieder zurückzusenden, ohne dass man das verhindern könnte, weil es die Benutzbarkeit dieser Klasse für genau die Fälle, wo man keine Cookies senden will, erheblich einschränkt.
Das Dumme ist nur, dass die Dokumentation dieser PEAR-Klasse äußerst dünn ist - es existiert die automatisch generierte Doku, die manuelle Doku ist aber praktisch nicht-existent. Das Zusammenspiel von HTTP_Client und HTTP_Client_CookieManager erschließt sich wahrscheinlich erst nach dem Studium des Klassenquelltextes (den es ja immerhin gibt).
Hi Sven!
"Glauben" ist beim Programmieren ganz schlecht. "Wissen" ist viel besser.
Da hast Du wohl recht ;-)
Und wenn ich einen ganz kurzen Blick in die Dokumentation von HTTP_Client werfe, dann sehe ich, dass dort Cookies von einer eigenen Klasse behandelt werden - was mir recht zweifelsfrei sagt, dass deine doppelte Abfolge von GETs die Cookies eben gerade NICHT berücksichtigt
Das ist allerdings eine recht "kühne" Schlussfolgerung. Wenn Cookie-Handling ein eigene Themenkomplex ist, macht es Sinn das in eine eigene Klasse zu packen, unabhängig davon ob diese Klasse dann automatisch von HTTP_Client benutzt wird (was aber hier der Fall ist).
- es wäre programmtechnisch auch relativ idiotisch, dem Server einfach jedes gesetzte Cookie wieder zurückzusenden, ohne dass man das verhindern könnte, weil es die Benutzbarkeit dieser Klasse für genau die Fälle, wo man keine Cookies senden will, erheblich einschränkt.
Aber genau das soll die Klasse machen. Die Klasse soll vor allem Cookies speichern und Redirects verfolgen. Automatisch. Wenn man das nicht will ist es einfach die falsche Klasse. Es gibt auch die Klasse PEAR::HTTP_Request, welche sehr viel mehr Kontrolle über einzelnde Requests einräumt (auf dieser Klasse baut HTTP_Client ebenfalls auf), das wäre dann eher die Klasse der Wahl. Bei HTTP_Client könnte man Cookies AFAIK lediglich über HTTP_Client::reset() loswerden (oder eben durch eine neue Instanz).
Sicherlich wäre es nicht schlecht über eine Funktion/einen Parameter festlegen zu können, ob (Session)-Cookies gespeichert werden sollen.
Wenn das mal jemand braucht kann er ja ein Patch hinschicken und es wird ggfs. eingebaut ;-)
Das Dumme ist nur, dass die Dokumentation dieser PEAR-Klasse äußerst dünn ist - es existiert die automatisch generierte Doku, die manuelle Doku ist aber praktisch nicht-existent. Das Zusammenspiel von HTTP_Client und HTTP_Client_CookieManager erschließt sich wahrscheinlich erst nach dem Studium des Klassenquelltextes (den es ja immerhin gibt).
Ja, in diesem Fall ist der Quelltext auch sehr einfach zu verstehen: http://cvs.php.net/co.php/pear/HTTP_Client/Client.php?r=1.5
Viele Grüße
Andreas
Hallo!
Wenn ich folgendes mache...
$client =& new HTTP_Client();
$code = $client->get($link);
$code = $client->get($link);... sollte ich doch beim zweiten aufruf der Methode get() in der selben Session bleiben. Irgendwie geht das aber nicht, ich bekomme eine neue SESSION-ID vom Server ($link) zugewiesen.
Kann ich nicht bestätigen. Wird die Session evtl. nicht per Cookie weitergegeben? Bei mir funktioniert es (mit php.ini Standard-Einstellungen bzgl. Sessions):
<?php /* client.php: */
require_once 'HTTP/Client.php';
$link = 'http://example.com/session_id.php';
$client =& new HTTP_Client();
$code = $client->get($link);
$res =& $client->currentResponse();
echo $res['body']."\n";
$code = $client->get($link);
$res =& $client->currentResponse();
echo $res['body']."\n";
?>
<?php /* session_id.php: */
session_start();
echo session_id();
?>
$ php client.php
ff598d21552f0f56d62ed75ea894c3ac
ff598d21552f0f56d62ed75ea894c3ac
Kontrolle:
$ ngrep -p -W byline port 80
########
GET /session_id.php HTTP/1.1.
Host: example.com.
User-Agent: PEAR HTTP_Request class ( http://pear.php.net/ ).
Connection: close.
Accept-Encoding: gzip.
.
HTTP/1.1 200 OK.
Date: Wed, 08 Jun 2005 11:00:51 GMT.
X-Powered-By: PHP/4.3.10.
Set-Cookie: PHPSESSID=ff598d21552f0f56d62ed75ea894c3ac; path=/.
Connection: close.
Transfer-Encoding: chunked.
Content-Type: text/html.
.
20 .
ff598d21552f0f56d62ed75ea894c3ac.
########
GET /session_id.php HTTP/1.1.
Host: example.com.
User-Agent: PEAR HTTP_Request class ( http://pear.php.net/ ).
Connection: close.
Accept-Encoding: gzip.
Referer: http://example.com/session_id.php.
Cookie: PHPSESSID=ff598d21552f0f56d62ed75ea894c3ac.
.
HTTP/1.1 200 OK.
Date: Wed, 08 Jun 2005 11:00:51 GMT.
X-Powered-By: PHP/4.3.10.
Connection: close.
Transfer-Encoding: chunked.
Content-Type: text/html.
.
20 .
ff598d21552f0f56d62ed75ea894c3ac.
Grüße
Andreas
Danke, für die hilfreiche Antwort!
Noch ein Problem hab ich, wie kann ich den User-Agent, den Referer und diese Angaben verstellen?
mfg Tobias Buschor
Hi!
Noch ein Problem hab ich, wie kann ich den User-Agent, den Referer und diese Angaben verstellen?
Referer geht AFAIK nicht, weil der ggfs. überschrieben wird. Aber User-Agent:
$headers = array (
'User-Agent' => 'TobiasBuschi was here'
);
$client->setDefaultHeader($headers);
Die Klasse soll einen kompletten Client emulieren. Wenn Du mehr Kontrolle über die Requests benötigst, kannst Du PEAR::HTTP_Request verwenden.
Grüße
Andreas
Danke, danke...
...aber irgendwie geht es immernoch nicht. ):
Mein eigentliches Ziel ist:
$link="http://v3.espacenet.com/results?sf=a&CY=ep&LG=de&DB=EPODOC&TI=&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=G12B21&IC=&=&=&=&=&=&PGS=10&FIRST=51";
Der letzte Parameter im URI, "&FIRST=51" git die Seitenzahl an, für die Liste auf dieser Site.
Beim ersten Aufruf wirst du jedoch nicht auf der Seite 6 landen wie es "&FIRST=51" eigentlich definiert, erst in einer gültigen Session wird dieser Parameter akzeptiert.
Ich habe es bis jetzt nicht geschafft mit HTTP_Client auf eine andere, als die Seite 1 zu kommen.
Gibt es sonst noch eine Angabe die ich dieser Seite vorgaukeln muss um korrekt navigieren zu können?
mfg Tobias Buschor
Hallo!
$link="http://v3.espacenet.com/results?sf=a&CY=ep&LG=de&DB=EPODOC&TI=&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=G12B21&IC=&=&=&=&=&=&PGS=10&FIRST=51";
Der letzte Parameter im URI, "&FIRST=51" git die Seitenzahl an, für die Liste auf dieser Site.
Beim ersten Aufruf wirst du jedoch nicht auf der Seite 6 landen wie es "&FIRST=51" eigentlich definiert, erst in einer gültigen Session wird dieser Parameter akzeptiert.
Ich habe es bis jetzt nicht geschafft mit HTTP_Client auf eine andere, als die Seite 1 zu kommen.
Gibt es sonst noch eine Angabe die ich dieser Seite vorgaukeln muss um korrekt navigieren zu können?
Nein, das funktioniert so. Ich weiß zwar nicht genau was Du da vorhast, aber für solche Sachen wurden eigentlich Webservices wie SOAP erfunden. Und wie es der Zufall will, stellt der Anbieter diese Daten auch per Webservice zur Verfügung. Das kannst Du dann auch sauber programmieren, und musst nicht bei jeder kleinen Änderung oder Korrektur an der Seite bangen, dass Deine Scripte nicht mehr funktionieren.
Siehe: http://ops.espacenet.com/, abfragbar per SOAP/WSDL. Hierfür gibt es auch wunderbare APIs für PHP. Wenn Du PHP 5 hast kannst Du wahrscheinlich auch die neue SOAP-Extension verwenden, sonst bleibt Dir noch PEAR::SOAP. Für letzteres findest Du Beispiele im CVS, z.B. wsdl_client.php.
Ich würde unbedingt den Weg über den Webservice gehen. Ist nebenbei auch viel interessanter ;-)
Grüße
Andreas
Nein, das funktioniert so. Ich weiß zwar nicht genau was Du da vorhast, aber für solche Sachen wurden eigentlich Webservices wie SOAP erfunden. Und wie es der Zufall will, stellt der Anbieter diese Daten auch per Webservice zur Verfügung. Das kannst Du dann auch sauber programmieren, und musst nicht bei jeder kleinen Änderung oder Korrektur an der Seite bangen, dass Deine Scripte nicht mehr funktionieren.
Ich würde unbedingt den Weg über den Webservice gehen. Ist nebenbei auch viel interessanter ;-)
Ich habe diesen Service auch schon entdeckt, mich jedoch nicht getraut in SOAP einzuarbeiten. Aber du hast mich überzogen.
Besten Dank, ich habe einiges gelernt.
mfg Tobias Buschor