Las Secuencias como Recursos

Todas las secuencias son registradas como recursos cuando son creadas. Esto asegura que sean limpiadas apropiadamente incluso si ocurre un error fatal. Todas las funciones del sistema de archivos en PHP operan sobre recursos de secuencia - lo que quiere decir que sus extensiones pueden aceptar apuntadores de archivo PHP normales como parámetros también, y devolver secuencias desde sus funciones. La API de secuencias hace este proceso tan simple como es posible:

Ejemplo 63-2. Cómo aceptar una secuencia como parámetro

PHP_FUNCTION(ejemplo_escribir_hola)
{
    zval *zstream;
    php_stream *stream;
    
    if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream))
        return;
    
    php_stream_from_zval(stream, &zstream);

    /* ahora puede usar la secuencia. Sin embargo, usted no es el
       "duenyo" de la secuencia, lo es el script. Eso quiere decir que
       usted NO DEBE cerrar la secuencia, ya que producira un fallo en
       PHP! */

    php_stream_write(stream, "hola\n");
        
    RETURN_TRUE();
}

Ejemplo 63-3. Cómo devolver una secuencia desde una función

PHP_FUNCTION(ejemplo_abrir_pagina_php)
{
    php_stream *stream;
    
    stream = php_stream_open_wrapper("http://www.php.net", "rb", REPORT_ERRORS, NULL);
    
    php_stream_to_zval(stream, return_value);

    /* despues de este punto, el duenyo de la secuencia es el
       script. Si la cierra ahora, hara que PHP falle! */

}

Ya que las secuencias son limpiadas automáticamente, es tentador pensar que tenemos la oportunidad de ser programadores mediocres y no preocuparnos por cerrar las secuencias cuando hayamos terminado con ellas. Aunque tal enfoque podría funcionar, no es una buena idea por varias razones: las secuencias mantienen bloqueos sobre recursos del sistema mientras están abiertas, así que dejar un archivo abierto después que ha terminado de usarlo puede prevenir que otros procesos tengan acceso a los recursos. Si un script maneja un gran número de archivos, el conjunto de los recursos usados, tanto en términos de memoria y el exagerado número de archivos abiertos, puede producir que las peticiones al servidor web fallen. Suena mal, ¿no es así? La API de secuencias incluye algo de magia que le ayuda a mantener su código limpio - si una secuencia no es cerrada por su código cuando debería hacerlo, encontrará un poco de información útil de depuración en su registro de errores del servidor web.

Nota: Siempre use una versión de PHP compilada para depuración cuando desarrolle una extensión (--enable-debug cuando ejecute configure), ya que se ha hecho un gran esfuerzo para advertirle sobre fugas de memoria y secuencias.

En algunos casos, es útil mantener una secuencia abierta durante la duración de una petición, para actuar como un registro o rastrear un archivo, por ejemplo. Escribir el código necesario para limpiar de manera segura ese tipo de secuencia no es difícil, pero se trata de varias líneas de código que no es escrictamente necesario. Para evitarse los problemas de escribir aquél código, puede marcar una secuencia para que sea apta para una auto-limpieza. Lo que quiere decir esto es que la API de secuencias no emitirá una advertencia cuando sea momento de auto-limpiar una secuencia. Para hacer esto, puede usar php_stream_auto_cleanup().

Hosting by: hurra.com
Generated: 2007-01-26 18:01:10