2011-08-02 6 views
6

No estoy seguro si esto es posible, pero se ha convertido en una lucha académica ahora.PHP zip_open() y php: // temp, parece que no se puede abrir

Usando el truco __halt_compiler() para incrustar datos binarios en un archivo PHP, he creado un pequeño script de auto-apertura, que se fseek() a __COMPILER_HALT_OFFSET__ (no ver demasiado duro como este ejemplo preciso se documenta en el manual)

de todas formas, he guardado un pequeño bulto de los datos binarios ZIP (una sola carpeta que contiene un único archivo que dice "hola mundo") después de mi llamada a __halt_compiler()

Lo que he intentado hacer es copie los datos directamente al php://temp corriente, y lo han hecho con éxito (si rewind() y passthru() la referencia de flujo temporal, que vuelca los datos)

$php = fopen(__FILE__, 'rb'); 
$tmp = fopen('php://temp', 'r+b'); 
fseek($php, __COMPILER_HALT_OFFSET__); 
stream_copy_to_stream($php, $tmp); 

Mi problema viene con intentar ahora abierta php://temp con zip_open()

$zip = zip_open('php://temp'); 

Por lo que puedo ver (a pesar otros tales pos ibilities como la falta de apoyo arroyo con zip_open()) El problema aquí es la no permanencia inherente de los datos en php://memory y php://temp corrientes entre los mangos. Si esto puede solucionarse, quizás sea de hecho posible.

Mantiene relajarse código de error 11, que he encontrado ninguna documentación en (aparentemente, al igual que la mayoría de los otros códigos de error posibles)

var_dump($zip); // int(11) 

Como señaló @cweiske, código de error 11 = ZipArchive::ER_OPEN, No se puede abrir el archivo

¿Es esta consecuencia a mi intento de utilizar la corriente php://temp, o algún otro posible problema? También sé que existe un enfoque OOP (ZipArchive, y otros) pero pensé que comenzaría por lo básico.

¿Alguna idea?

+0

Alrighty, por lo que el código de error ** 11 ** es un ** error abierto ** de acuerdo con http://www.php.net/manual/en/function.ziparchive-open.php#102849 respecto a la 'ZipArchive 'clase. Asumo que esto se traduce ya que la clase sería un envoltorio para la misma funcionalidad de extensión. El comentario – Dan

+0

previamente vinculado también hace mención de dicho error devuelto al variar el sistema operativo Windows, al intentar descomprimir un archivo almacenado en 'c: \ windows \ temp' que mi tentativa de utilizar el' php: // temp' corriente que puede volcar a un archivo cuando la longitud de los datos excede el límite, no estaría allí, y cambié a 'php: // memory' de todos modos, todavía resultando en un ** error abierto **. – Dan

+0

Gracias @Gordon - * Editado *; no, no escribiendo, solo leyendo en realidad. Gracias – Dan

Respuesta

2

11 es la constante ZIPARCHIVE::ER_OPEN, que el manual describe con

No se puede abrir el archivo

Tenga en cuenta que el manual hace no estado que transmiten las envolturas pueden ser utilizados.


Por favor, piense en usar Phar extensión de PHP - hace lo que quiere, y está bien probado.

+0

@cweiske - Soy consciente de Phar ** **, sin embargo, esto fue más de una investigación académica, aprender más acerca de los arroyos y soporte archivo al mismo tiempo. Sin mencionar explícitamente que las envolturas de la secuencia se pueden utilizar en este contexto, ¿podemos suponer con seguridad que esto no es posible? Supongo que parece que sí. ¿Debería suponer además que PHP tiene poca (* lectura, no *) compatibilidad para trabajar con datos binarios de archivo ZIP de la memoria, de alguna manera? Hacer uso de un archivo temporal para un volcado intermedio estaría bien prácticamente hablando, pero todavía tengo curiosidad por trabajar estrictamente en la memoria. – Dan

+0

También descubrí que al volver a abrir la secuencia 'php: // temp', se vacía el contenido existente. Sea o no 'zip_open envolturas de flujos()' apoya, que no dejará de ser un problema ya que estoy pasando con eficacia en un búfer vacío, y no puede pasar un identificador de recurso de secuencia existente a 'zip_open()' – Dan

Cuestiones relacionadas