2012-06-28 14 views
5

Estoy intentando ejecutar un proceso usando proc_open. ¡La I/O para el proceso es manejada por las tuberías!fclose(): 18 no es un recurso de flujo válido

$descriptorspec = array(
    0 => array("pipe", "r"), 
    1 => array("pipe", "w"), 
    2 => array("pipe", "w") 
); 

Ahora, como es el caso, a veces el "programa de c" que he abierto consigue pegado, y he añadido un cheque max_time_limit que forzar el cierre del proceso. He agregado la función de devolución de llamada, a saber, onExit - (usando "call_user_function") para procesar la información siempre que el "proceso salga" de manera válida o por la fuerza.

En la función de "salida", estoy cerrando las E/S tuberías

foreach ($pipes as $pipe) { 
    fclose($pipe); 
} 

lo anterior funciona perfectamente bien si el proceso ha tenido una salida válida. Sin embargo, en el caso en que maté por la fuerza mi proceso, llamé a proc_terminate para hacerlo. Entiendo que la finalización del proceso también continuaría y cerraría cualquier canalización de E/S, pero el problema es que debido a una devolución de llamada, siempre se llama a mi proceso de función "onExit" (y así es como quiero que sea). .como necesito hacer un poco más de procesamiento). Ahora, en este caso, mientras trato de cerrar las tuberías, me sale el siguiente error:

fclose(): 18 is not a valid stream resource 

He intentado utilizar "ftell" para comprobar si la tubería es válida o no, pero eso también errored a cabo. ¿Cómo puedo verificar si las tuberías ya se han cerrado o no?

+0

¿Por qué estás cerrando esas tuberías? Serán cerrados automáticamente por el recolector de basura al finalizar su script. – lanzz

+0

@lanzz: Solo quería asegurarme de que esto no causara ningún caos. –

+0

@Bart: de acuerdo con usted ... no estaba prestando atención a esto antes ... he empezado a hacer eso ahora ... también iré y actualizaré todas las demás preguntas ... ¡gracias! –

Respuesta

12

¿Qué hay de comprobar si el recurso sigue siendo un recurso antes de tratar de cerrarla:

foreach ($pipes as $pipe) { 
    // Finds whether a variable is a resource 
    if(is_resource($pipe)) { 
    fclose($pipe); 
    } 
} 
+0

sí, de verdad ... eso lo hace ... ¡muchas gracias! –

-1

O si su código está funcionando correctamente y que es sólo una "advertencia" a continuación, cierre con una advertencia @. Eso es todo.

@fclose($pipe); 
Cuestiones relacionadas