Come altre risposte detto:
- non si può avere tutto ciò che nella memoria
- una soluzione sarebbe quella di utilizzare
CURLOPT_FILE
Ma, non si potrebbe desiderare di creare davvero un file ; potresti voler lavorare con i dati in memoria ... Usarli non appena "arriva".
Una possibile soluzione potrebbe essere definind si possiede flusso involucro, e utilizzare questo, invece di un file vero e proprio, con CURLOPT_FILE
Prima di tutto, vedi:
E ora, facciamo un esempio.
In primo luogo, creiamo la nostra classe flusso avvolgitore:
class MyStream {
protected $buffer;
function stream_open($path, $mode, $options, &$opened_path) {
// Has to be declared, it seems...
return true;
}
public function stream_write($data) {
// Extract the lines ; on y tests, data was 8192 bytes long ; never more
$lines = explode("\n", $data);
// The buffer contains the end of the last line from previous time
// => Is goes at the beginning of the first line we are getting this time
$lines[0] = $this->buffer . $lines[0];
// And the last line os only partial
// => save it for next time, and remove it from the list this time
$nb_lines = count($lines);
$this->buffer = $lines[$nb_lines-1];
unset($lines[$nb_lines-1]);
// Here, do your work with the lines you have in the buffer
var_dump($lines);
echo '<hr />';
return strlen($data);
}
}
Quello che faccio è:
- lavoro sui blocchi di dati (io uso var_dump, ma farei la vostra solita roba invece) quando arrivano
- Si noti che non si ottengono "linee complete": la fine di una linea è l'inizio di un blocco, e l'inizio di quella stessa linea era alla fine del blocco precedente; quindi, è necessario mantenere alcune parti di un chunck tra le chiamate al
stream_write
Successivamente, registrare questo flusso di involucro, per essere utilizzato con la pseudo-protocollo "test":
// Register the wrapper
stream_wrapper_register("test", "MyStream")
or die("Failed to register protocol");
E, ora, facciamo del nostro riccio richiesta, come faremmo quando scrittura di un file "reale", come le altre risposte hanno suggerito:
// Open the "file"
$fp = fopen("test://MyTestVariableInMemory", "r+");
// Configuration of curl
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.rue89.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 256);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILE, $fp); // Data will be sent to our stream ;-)
curl_exec($ch);
curl_close($ch);
// Don't forget to close the "file"/stream
fclose($fp);
Nota che non lavoriamo con un file reale, ma con il nostro pseudo-protocollo.
In questo modo, ogni volta che un blocco di dati arriva, MyStream::stream_write
metodo verrà chiamato, e sarà in grado di lavorare su una piccola quantità di dati (quando ho provato, ho sempre avuto 8192 byte, qualsiasi valore I usato per CURLOPT_BUFFERSIZE
)
alcune note:
- È necessario testare questo più che ho fatto, ovviamente
- l'implementazione dello stream_write probabilmente non funzionerà se le righe sono più lunghe di 8192 byte; a te per aggiustarlo ;-)
- Si tratta di poche indicazioni e non di una soluzione pienamente funzionante: devi testare (di nuovo) e probabilmente codificarne un po 'di più!
Eppure, spero che questo aiuta ;-)
Buon divertimento!
La risposta in http://stackoverflow.com/a/1342760/4668 è migliore della mia. –