Como otras respuestas dicho:
- no se puede tener todo esto en memoria
- una solución sería utilizar
CURLOPT_FILE
embargo, puede que no desee para crear realmente una archivo ; es posible que desee trabajar con datos en la memoria ... Usarlo tan pronto como "llegue".
Una posible solución podría ser definind es el propietario envoltura de flujo, y el uso de éste, en lugar de un archivo real, con CURLOPT_FILE
En primer lugar, ver:
Y ahora, vamos con un ejemplo.
En primer lugar, vamos a crear nuestra clase de envoltura de secuencia:
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);
}
}
Lo que hago es:
- trabajo sobre los fragmentos de datos (yo uso var_dump, pero que lo haría su material habitual en su lugar) cuando llegan
- Tenga en cuenta que no obtiene "líneas completas": el final de una línea es el comienzo de un fragmento, y el comienzo de esa misma línea se encontraba al final del fragmento anterior; Por lo tanto, usted tiene que mantener algunas partes de un chunck entre las llamadas a
stream_write
A continuación, registrar esta envoltura de flujo, para ser utilizado con el pseudo-protocolo de "prueba":
// Register the wrapper
stream_wrapper_register("test", "MyStream")
or die("Failed to register protocol");
Y, ahora, que hacemos nuestra solicitud rizo, como lo haría cuando escribiendo a un documento "real", al igual que otras respuestas sugeridas:
// 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);
Tenga en cuenta que no trabajamos con un archivo real, pero con nuestro pseudo protocolo.
De esta manera, cada vez que un fragmento de datos llega, MyStream::stream_write
método se llamará, y será capaz de trabajar en una pequeña cantidad de datos (cuando probé, siempre llegué 8192 bytes, cualquiera que sea el valor I utilizado para CURLOPT_BUFFERSIZE
)
Unas pocas notas:
- Es necesario poner a prueba esta más que yo, obviamente,
- mi implementación stream_write probablemente no funcionará si las líneas son más largas que 8192 bytes; depende de usted parchearlo ;-)
- Solo se trata de unos pocos indicadores, y no una solución totalmente funcional: debe probar (nuevamente), ¡y probablemente codifique un poco más!
Aún así, espero que esto ayuda ;-)
Que se diviertan!
La respuesta en http://stackoverflow.com/a/1342760/4668 es mejor que la mía. –