[PHP] Curl werkt niet met memory stream?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Ik ben bezig een stukje library te schrijven die een internetpagina op moet halen.

Nu wil ik graag mbv van curl de inhoud van mijn request in een memory stream schrijven.

Code:
PHP:
1
2
3
4
5
6
7
8
9
10
$c = curl_init("http://example.com");
$st = fopen("php://memory", "r+");

curl_setopt($c, CURLOPT_FILE, $st);

if(!curl_exec($c)) die ("error: ".curl_error($c));

rewind($st);
echo "Content|".htmlspecialchars(stream_get_contents($st))."|/Content";
fclose($st);


Dit werkt niet. Terwijl ik eigenlijk zeker weet dat het zo moet werken. Als ik nl. van de memory stream een file-stream maakt, werkt dit wel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$c = curl_init("http://example.com");

$file = "/tmp/phptest".rand()."";
touch($file);
$st = fopen($file, "r+");

curl_setopt($c, CURLOPT_FILE, $st);

if(!curl_exec($c)) die ("error: ".curl_error($c));

rewind($st);
echo "Content|".htmlspecialchars(stream_get_contents($st))."|/Content";
fclose($st);
unlink($file);


Nu zijn er verschillende opties:
1. ik maak ergens een fout
2. php ondersteund dit gewoon niet
3. dit is een bug in php

Ziet iemand misschien een fout? Of weet iemand of dit een bug is (of dat het zo hoort?). Op de php site staat alleen dat elke stream geopen met fopen() meegegeven kan worden aan curl.

(Voor de duidelijkheid, code-snippet 1 geeft als output "Content||/Content" en nr2 geeft netjes "Content|[website inhoud]|/Content")

petersmit.eu


Acties:
  • 0 Henk 'm!

Verwijderd

Heb je PHP 5.1 ?

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
Sorry, vergeten te vermelden.

$ php -v
PHP 5.2.3-1ubuntu6 (cli) (built: Oct  4 2007 23:35:54) 

petersmit.eu


Acties:
  • 0 Henk 'm!

  • djiwie
  • Registratie: Februari 2002
  • Laatst online: 17-09 16:35

djiwie

Wie?

Gek, ik krijg jouw eerste scriptje wel werkend wanneer ik een slash achter php://memory zet. Maar dan krijg je weer allerlei errors over ongeldige php:// URL's...

Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
djiwie schreef op dinsdag 27 november 2007 @ 19:34:
Gek, ik krijg jouw eerste scriptje wel werkend wanneer ik een slash achter php://memory zet. Maar dan krijg je weer allerlei errors over ongeldige php:// URL's...
Waarschijnlijk klaagt curl dan ook dat het geen valid resource is. Dan gebruikt hij de standaard resource en dat is stdout. Dus dan staat de pagina waarschijnlijk niet tussen "Content|"en "|/Content". Dat gedrag is dus goed te verklaren.

petersmit.eu


Acties:
  • 0 Henk 'm!

  • WouZz
  • Registratie: Mei 2000
  • Niet online

WouZz

Elvis is alive!

Als je alleen de content van een webpagina in een variabele wilt zetten, kijk dan eens naar CURLOPT_RETURNTRANSFER:
TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly.

On track


Acties:
  • 0 Henk 'm!

  • Pete
  • Registratie: November 2005
  • Laatst online: 07-09 17:51
WouZz schreef op woensdag 28 november 2007 @ 14:39:
Als je alleen de content van een webpagina in een variabele wilt zetten, kijk dan eens naar CURLOPT_RETURNTRANSFER:

[...]
Klopt. Echter ik vind het veel handiger om in de library alles met streams te doen. Dan hoef ik geen onderscheid te maken tussen direct output naar de browser, opslaan in memory en opslaan in file.

Nu op dit moment los ik het op door tijdelijk bestanden te creëren. Ik heb het probleem nu ook op de PHP-mailinglist gezet en ik hoop dat ik daar misschien een antwoord vandaan krijg.

petersmit.eu

Pagina: 1