#php #while-loop #filehandle
#php #цикл while #дескриптор файла
Вопрос:
Это код, который у меня есть на данный момент, интересно, правильный ли он?
$handle = fopen($file, 'w') or die("can't open file");
$closed = fclose($handle);
while($closed){
DOAWESOMETHINGS(); // btw I only want to have this run once for each handle
$closed = false;
}
Большое вам спасибо!
Комментарии:
1. Чего именно вы пытаетесь достичь? После вызова
fclose
дескриптор, надеюсь, закрыт, и если это не так, вы ничего не сможете с этим поделать. Для чего вам нуженwhile
?2. Мне нужно переименовать файл, а иногда дескриптор файла еще не закрыт. Итак, для следующей операции требуется, чтобы дескриптор был закрыт. Обычно это проблема Windows. Спасибо.
3. Так что на самом деле вместо
while
я бы предпочел оператор do_this_right_after файл был закрыт.4. Не знаю никаких подробностей, но, насколько я знаю,
fclose()
должен блокироваться, пока обработчик действительно не будет закрыт.5. Согласно этому комментарию (и нескольким другим на той же странице) php.net/manual/en/function.rename.php#102274 кажется, есть небольшая задержка (каким-то образом??) в этих последовательных действиях.
Ответ №1:
Вы можете проверить, был ли дескриптор закрыт или нет, используя этот оператор
if(!is_resource($handle)){
//Handle closed
}else{
//Handle still open
}
Поэтому, если вам нужно убедиться, что fclose сработал перед запуском следующей функции, вы можете использовать этот цикл:
while(is_resource($handle)){
//Handle still open
fclose($handle);
}
do_awesome_things();
Примечание: Вы также должны использовать break;
для завершения циклов while, когда вам нужно. В этом случае цикл не завершится, пока дескриптор не будет закрыт.
Комментарии:
1. но мне интересно, будет ли это ждать, пока дескриптор будет оценен, или он сработает сразу, когда достигнет строки кода. Вы видите, что, похоже, существует задержка между порядком закрытия дескриптора файла и фактическим закрытием файла, поэтому мгновенный запуск кодов иногда не выполняется, когда дескриптор все еще закрывается в конце окна. Спасибо.
2. Один небольшой источник путаницы заключается в том, что закрытый ресурс по-прежнему выглядит как ресурс, если вы
var_dump
его (отображается какresource(n) of type (Unknown)
), ноis_resource
возвращает для него значение false. Возможно, вы захотите присвоить дескриптору значение null после закрытия, чтобы избежать путаницы.