fclose(): 18 не является допустимым ресурсом потока

Я пытаюсь выполнить процесс, используя proc_open. Ввод-вывод для процесса обрабатывается каналами !!

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

Теперь, как это бывает, иногда "программа c", которую я открыл, действительно зависает, и я добавил проверку max_time_limit, которая принудительно завершит процесс. Я добавил функцию обратного вызова, а именно onExit (используя «call_user_function») для обработки информации всякий раз, когда «процесс завершается» допустимым образом или принудительно.

В функции «выход» я закрываю каналы ввода-вывода

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

Вышеупомянутое работает отлично, если процесс имеет допустимый выход. Однако в случае, когда я принудительно завершал свой процесс, я вызывал для этого proc_terminate. Я понимаю, что завершение процесса также продолжится и закроет все каналы ввода-вывода, но проблема в том, что из-за обратного вызова мой процесс функции «onExit» всегда вызывается (и это то, как я хочу, чтобы это было .. .as мне нужно сделать еще немного обработки). Теперь, в этом случае, когда я пытаюсь закрыть каналы, я получаю следующую ошибку:

fclose(): 18 is not a valid stream resource 

Я попытался использовать «ftell», чтобы проверить, действителен ли канал или нет, но это тоже вышло из строя. Как мне проверить, были ли трубы уже закрыты или нет??


person Kapil Kaushik    schedule 28.06.2012    source источник
comment
Почему вы закрываете эти трубы? Они будут автоматически закрыты сборщиком мусора при завершении вашего скрипта.   -  person lanzz    schedule 28.06.2012
comment
@lanzz: я ​​просто хотел убедиться, что это не вызовет хаоса.   -  person Kapil Kaushik    schedule 29.06.2012
comment
@Bart: Согласен с вами... раньше не обращал на это внимания... начал делать это сейчас.... также пойду и обновлю все остальные вопросы... спасибо!   -  person Kapil Kaushik    schedule 29.06.2012
comment
@lanzz Это не значит, что убирать за собой нехорошо.   -  person Bart    schedule 29.06.2012
comment
@Bart: Это не очень хорошая практика, когда она вводит ненужную сложность, которая уже дублируется в сборщике мусора. Избегание дополнительной сложности (и возможности испортить логику) — одна из основных причин использования языка со сборкой мусора.   -  person lanzz    schedule 29.06.2012
comment
@lanzz Конечно, GC устраняет необходимость в собственном управлении памятью и тому подобном. Это не мешает нам повышать производительность и уменьшать потери памяти, добавляя здесь и там несколько удачно расположенных операторов очистки. Я видел и использовал его (например, в сценарии преобразования базы данных, где требовалось поддерживать память на приемлемом уровне). В данном случае это, вероятно, не будет иметь значения, я должен согласиться с этим.   -  person Bart    schedule 29.06.2012


Ответы (2)


Как насчет проверки того, является ли ресурс все еще ресурсом, прежде чем пытаться его закрыть:

foreach ($pipes as $pipe) {
  // Finds whether a variable is a resource
  if(is_resource($pipe)) {
    fclose($pipe);
  }
}
person Bart    schedule 28.06.2012

Или, если ваш код работает правильно, и это просто «предупреждение», закройте предупреждение с помощью @. Это все.

@fclose($pipe);
person Uzgraph    schedule 19.03.2016