9.1 API de flux : les auteurs d'extensions
9 PHP et le moteur interne Zend
Manuel PHP
. Présentation . Eléments de bases ->Les flux qui sont des ressources
|
9.1.3 Les flux qui sont des ressources
Tous les flux sont enregitrés comme des ressources lorsqu'il sont créés.
Cela garantit qu'ils seront convenablement déblayés de la mémoire, même
en cas d'erreur fatale. Toutes les fonctions du sytème de fichier de PHP
opère sur des ressources : cela signifie que vos extensions peuvent accepter
des pointeurs de fichiers comme paramètre, et retourner des flux. L'API des
flux rend ce processus très convivial.
| Comment accepter un flux comme paramètre d'entrée |
PHP_FUNCTION(example_write_hello) { zval *zstream; php_stream *stream;
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream)) return;
php_stream_from_zval(stream, &zstream);
/* Vous pouvez maintenant utiliser votre flux. Cependant, vous ne "possédez" pas le flux, mais le script le possède. Cela signifie que vous de DEVEZ PAS fermer le flux, car sinon, PHP va crasher! */
php_stream_write(stream, "hello\n");
RETURN_TRUE(); }
|
| Comment retourner un flux depuis une fonction |
PHP_FUNCTION(example_open_php_home_page) { php_stream *stream;
stream = php_stream_open_wrapper("http://www.php.net", "rb", REPORT_ERRORS, NULL);
php_stream_to_zval(stream, return_value);
/* A partir de ce moment, le flux appartient au script. Si vous le fermer ici, vous allez faire crasher PHP! */ }
|
Comme les flux sont automatiquement déblayés de la mémoire, il est tentant de
penser que vous pouvez être des programmeurs paresseux et ne pas vous préoccuper
de la fermeture du flux lorsque vous en avez terminé avec lui. Même si une telle
approche fonctionnera probablement, ce n'est pas une bonne idée pour un bon
nombre de raisons : les flux conservent des verrous sur les ressources
systèmes durant un temps plus long, ce qui fait que laisser le verrous empêche
d'autres processus d'accéder à cette ressource. Si le script gère un grand
nombre de fichier, l'accumulation de ressources, en terme de mémoire et de
nombre de fichiers ouverts, causer l'échec des requêtes du serveur web. Cela n'est
plus aussi séduisant, n'est-ce pas? L'API de flux inclut un peu de magie pour
que vous puissiez garder votre code propre : si un flux n'est pas fermé par
votre code alors qu'il devrait l'être, vous trouverez des informations de
débogage dans le fichier d'historique d'erreur de votre serveur web.
| Note | |
Utilisez toujours une version de débogagge de PHP lorsque vous développez
(
--enable-debug
lors de la configuration de la compilation)
car de nombreux efforts ont été fait pour vous aider à traquer les fuites
de mémoire.
|
Dans certains cas, il est pratique de garder un flux ouvert pour toute la
durée de la requête, afin de l'utiliser comme fichier d'historique. Ecrire le
code nécessaire au nettoyage propre d'un tel fichier n'est pas difficile, mais
ce sont plusieurs lignes e code qui ne sont pas strictement nécessaire. Pour
vous éviter l'écriture de ce code, vous pouvez marquer le flux pour qu'il soit
automatiquement libéré lorsque viendra le temps de libérer les ressources.
Pour cela, vous pouvez utiliser la fonction
php_stream_auto_cleanup
.
|