2012-06-28 35 views
5

Tôi đang cố gắng thực thi quy trình bằng proc_open. I/O cho quá trình này được xử lý bởi các đường ống !!fclose(): 18 không phải là tài nguyên luồng hợp lệ

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

Bây giờ, khi nó xảy ra, đôi khi "c chương trình" mà tôi đã mở không gặp khó khăn, và tôi đã thêm một tấm séc MAX_TIME_LIMIT mà buộc sẽ tắt quá trình này. Tôi đã thêm chức năng gọi lại - cụ thể là onExit - (sử dụng "call_user_function") để xử lý thông tin bất cứ khi nào "thoát khỏi quá trình" một cách hợp lệ hoặc bằng vũ lực.

Trong chức năng "thoát", tôi đang đóng i/o Ống

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

Các công trình trên hoàn toàn tốt đẹp nếu quá trình này đã có một lối ra hợp lệ. Tuy nhiên, trong trường hợp tôi buộc phải giết quá trình của mình, tôi gọi proc_terminate để làm như vậy. Tôi hiểu rằng việc chấm dứt quá trình cũng sẽ đi trước và đóng bất kỳ đường ống I/O nào, nhưng vấn đề là do gọi lại, quy trình hàm "onExit" của tôi luôn được gọi (và đây là cách tôi muốn nó .. . Tôi cần phải xử lý thêm). Bây giờ, trong trường hợp này, như tôi đã cố gắng để đóng ống, tôi nhận được lỗi sau:

fclose(): 18 is not a valid stream resource 

tôi đã cố gắng sử dụng "ftell" để kiểm tra xem ống có giá trị hay không, nhưng điều đó quá errored ra. Làm thế nào để kiểm tra xem các đường ống đã được đóng hay chưa?

+0

Tại sao bạn đóng các đường ống đó? Chúng sẽ tự động bị đóng bởi bộ thu gom rác khi chấm dứt tập lệnh của bạn. – lanzz

+0

@lanzz: Tôi chỉ muốn đảm bảo rằng điều này không gây ra bất kỳ sự hỗn loạn nào. –

+0

@Bart: Đồng ý với bạn ... đã không chú ý đến điều này sớm hơn .... đã bắt đầu làm điều đó ngay bây giờ .... cũng sẽ đi và cập nhật tất cả các câu hỏi khác ... cảm ơn! –

Trả lời

12

gì về việc kiểm tra nếu tài nguyên vẫn là một nguồn lực trước khi cố gắng để đóng nó lại:

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

có thực sự ...... mà nó .... cảm ơn một tấn! –

-1

Hoặc nếu mã của bạn đang hoạt động tốt và đó chỉ là một "cảnh báo", sau đó đóng một cảnh báo với @. Đó là tất cả.

@fclose($pipe); 
Các vấn đề liên quan