Re: [PHP-ES] rendimiento al editar archivos binarios
[email protected] (S Silva)
| Newsgroups | php.general.es |
|---|---|
| Message-ID | <[email protected]> |
Supongo que tendrás que posicionar el puntero del fichero al byte 640 con
http://php.net/manual/es/function.fseek.php
Y luego escribir normalmente con un fwrite.
if ( !file_exists($cache) || @$this->params['named']['cache'] === 0){
$handle = fopen($filename, "r+b");
fseek($handle, 640);
fwrite($handle, $this->params['id'], 16);
fclose($handle);
FireCake::fb(" GENERADO (" . @$this->params['named']['cache'] . ")
$referer ($cache)");
}
Hace mucho que no hago estas cosas, puede que me equivoque pero tiene buena
pinta, no?
Te recomiendo que encapsules esto un poco más en vez que tirar directamente
de $this->params (estás dentro de un controlador???) y valides que todo
tiene el tamaño y la forma que debe. Si $this->params['id'] (que es un
parámetro por GET al fin y al cabo) tiene un valor raro puede corremper el
fichero.
Espero haber sido de ayuda.
Saludos.
El 26 de mayo de 2010 17:16, Manolet Gmail <[email protected]> escribió:
> Saludos, actualmente tengo una aplicacion que edita un archivo binario
> cambiando 16 bytes que estan en la misma posicion siempre (640 bytes
> despues
> del inicio del archivo), sin embargo lo que estoy haciendo es leer TODO el
> archivo para luego escribirlo usando la funcion pack, lo que siento que es
> bastante torpe y desconsiderado con la memoria ram (considerando que
> necesito hacer esto cientos de veces al instante). Este es el código que
> estoy utilizando.
>
> if ( !file_exists($cache) || @$this->params['named']['cache'] ===
> 0){
> $handle = fopen($filename, "r+b");
> $init = fread($handle, 640);
> fread($handle, 16); //esto debe ser exactamente igual
> a lo que se reemplaza.
> $full = fread($handle, filesize($filename)); // leemos el
> resto para escribirlo despues
> fclose($handle);
>
> //las concateno para que sea human readable
> $contents = pack('a640'.'A16'.'a*', $init, $this->params['id'],
> $full);
>
> $handle = fopen($cache, "w+b");
> fwrite($handle, $contents);
> fclose($handle);
> FireCake::fb(" GENERADO (".@$this->params['named']['cache'].")
> $referer ($cache)");
> }
>
> Alguna idea de como hacerlo "mas eficiente"?
>
> Arnold
>