PHP 8.4.2 Released!

Phar::startBuffering

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

Phar::startBufferingDémarre la mise en tampon d'écritures Phar, ne modifie pas l'objet Phar sur le disque

Description

public Phar::startBuffering(): void

Bien que techniquement inutile, la méthode Phar::startBuffering() peut fournir un gain de performance lors de la création ou la modification d'une archive Phar avec un grand nombre de fichiers. D'ordinaire, chaque fois qu'un fichier au sein de l'archive Phar est créé ou modifié, l'archive Phar entière et recréée en incluant les changements. De cette manière, l'archive sera toujours à jour vis à vis des opération qui y sont appliquées.

Alors que ceci peut paraître inutile lors de la création d'un archive Phar simple, ça prend tout son sens lors de l'écriture en une fois de l'archive Phar entière. De même, il est souvent nécessaire de faire une série de changements et de s'assurer qu'ils sont tous possibles avant d'écrire sur le disque, un peu comme les transactions des base de données relationnelles. Les fonctions Phar::startBuffering()/Phar::stopBuffering() sont disponibles dans ce but.

La mise en tampon Phar s'effectue par archive, le tampon actif pour l'archive Phar foo.phar n'affecte pas les changements faits à l'archive Phar bar.phar.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Aucune valeur n'est retournée.

Exemples

Exemple #1 Un exemple avec Phar::startBuffering()

<?php
// on s'assure que le phar n'existe pas déjà
@unlink('nouveau.phar');
try {
$p = new Phar(dirname(__FILE__) . '/nouveau.phar', 0, 'nouveau.phar');
} catch (
Exception $e) {
echo
'Ne peut pas créer le phar:', $e;
}
echo
'Le nouveau phar a ' . $p->count() . " entrées\n";
$p->startBuffering();
$p['fichier.txt'] = 'salut';
$p['fichier2.txt'] = 'jolie';
$p['fichier2.txt']->setCompressedGZ();
$p['fichier3.txt'] = 'môme';
$p['fichier3.txt']->setMetadata(42);
$p->setStub("<?php
function __autoload(
$class)
{
include 'phar://monphar.phar/' . str_replace('_', '/',
$class) . '.php';
}
Phar::mapPhar('monphar.phar');
include 'phar://monphar.phar/demarrage.php';
__HALT_COMPILER();"
);
$p->stopBuffering();
?>

Voir aussi

  • Phar::stopBuffering() - Arrête la mise en tampon des écritures Phar et provoque l'écriture que le disque
  • Phar::isBuffering() - Détermine si les opérations d'écriture du Phar sont mises en tampons ou sont directement inscrites sur le disque

add a note

User Contributed Notes 1 note

up
0
anon at php dot com
4 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