PHP 8.4.0 RC4 available for testing

Phar::startBuffering

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 1.0.0)

Phar::startBufferingIniciar las operaciones de escritura en buffer de Phar, no modifica el objeto Phar del disco

Descripción

public Phar::startBuffering(): void

Aunque es técnicamente innecesario, el método Phar::startBuffering() puede proporcionar un aumento significativo de rendimiento al crear o modificar un archivo Phar con un gran número de ficheros. Normalmente, cada vez que un fichero dentro de un archivo Phar es creado o modificado de alguna manera, el archivo Phar entero se re-creará con los cambios. De esta forma, el archivo estará actualizado con la actividad realizada sobre él.

Sin embargo, esto puede ser innecesario al crear simplemente un nuevo archivo Phar, que tendría más sentido escribir el archivo entero de una vez. De forma similar, a menudo es necesario realizar una serie de cambios y asegurarse de que todos son posibles antes de hacer cualquier cambio en disco, similar al concepto de transacciones en bases de datos relacionales. La pareja de métodos Phar::startBuffering()/Phar::stopBuffering() está prevista para este propósito.

La escritura en buffer de Phar es por archivo, el almacenamiento activo en buffer del archivo Phar foo.phar no afecta a los cambios hechos al archivo Phar bar.phar.

Valores devueltos

No devuelve ningún valor.

Ejemplos

Ejemplo #1 Un ejemplo de Phar::startBuffering()

<?php
// asegurarse de que no existe
@unlink('nuevo_phar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nuevo_phar.phar', 0, 'nuevo_phar.phar');
} catch (
Exception $e) {
echo
'No se pudo crear el phar:', $e;
}
echo
'El nuevo phar tiene ' . $p->count() . " entradas\n";
$p->startBuffering();
$p['fichero.txt'] = 'hola';
$p['fichero2.txt'] = 'qué tal';
$p['fichero2.txt']->setCompressedGZ();
$p['fichero3.txt'] = 'cara de niño';
$p['fichero3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload(
$clase)
{
include 'phar://miphar.phar/' . str_replace('_', '/',
$clase) . '.php';
}
Phar::mapPhar('miphar.phar');
include 'phar://miphar.phar/inicio.php';
__HALT_COMPILER();"
);
$p->stopBuffering();
?>

Ver también

  • Phar::stopBuffering() - Detener las peticiones de escritura en buffer del archivo Phar, y guardar los cambios en disco
  • Phar::isBuffering() - Determinar si las operaciones de escritura de Phar está siendo almacenadas en buffer, o están siendo volcadas directamente al disco

add a note

User Contributed Notes 1 note

up
0
anon at php dot com
3 years ago
To setthe ini key phar.readonly to 0, from a unix shell script, this is possible on the fly it is possible see below.
The example given on this page has some issues with quoting: (See conversion to simple quotes)

#!/usr/bin/php -d phar.readonly=0
<?php
print(ini_get('phar.readonly')); // Must return 0
// make sure it doesn't exist
@unlink('brandnewphar.phar');
try {
$p = new Phar(dirname(__FILE__) . '/brandnewphar.phar', 0, 'brandnewphar.phar');
} catch (
Exception $e) {
echo
'Could not create phar:', $e;
}
echo
'The new phar has ' . $p->count() . " entries\n";
$p->startBuffering();
$p['file.txt'] = 'hi';
$p['file2.txt'] = 'there';
$p['file2.txt']->compress(Phar::GZ);
$p['file3.txt'] = 'babyface';
$p['file3.txt']->setMetadata(42);
$p->setStub('<?php
function __autoload($class)
{
include "phar://myphar.phar/" . str_replace("_", "/", $class) . ".php";
}
Phar::mapPhar("myphar.phar");
include "phar://myphar.phar/startup.php";
__HALT_COMPILER();'
);
$p->stopBuffering();

// Test
$m = file_get_contents("phar://brandnewphar.phar/file2.txt");
$m = explode("\n",$m);
var_dump($m);
/* Output:
* there
**/
To Top