php warning fclose () ожидает, что параметр 1 является ресурсом, имеющим логическое значение

Я использую newrelic, чтобы отслеживать что-либо на своем веб-сайте, и я всегда получаю эту ошибку:

Сообщение об ошибке: E_WARNING: fclose () ожидает, что параметр 1 будет ресурсом, имеет значение boolean. Трассировка стека: в fclose, вызываемой в /etc/snmp/bfd-stats.php (68)

Так выглядит /etc/snmp/bfd-stats.php

 <?php $a = 0; $ptr = 0; $any = 0; $mx = 0; $ns = 0; $cname = 0; $soa = 0; $srv = 0; $aaaa = 0; $txt = 0; $total = 0; if(file_exists('/etc/snmp/bfd-log-pos.stat')) { $lfh = fopen('/etc/snmp/bfd-log-pos.stat','r'); $string = fread($lfh,2087); $res = explode(',',$string); fclose($lfh); } else { $res = array(); $res[0] = 0; $res[1] = 0; } if(file_exists("/var/log/bfd_log.1")) { $stats = stat('/var/log/bfd_log.1'); if($stats[10] > $res[0]) { $res[0] = 0; $res[1] = 0; } } $fh = fopen('/var/log/bfd_log', 'r'); fseek($fh,$res[1]); $blocks = 0; if(!$fh) { echo "Error! Couldn't open the file."; } else { while (!feof($fh)) { $data = fgets($fh); if(preg_match('/executed\sban/',$data)) { $blocks++; } } } $lfh = fopen('/etc/snmp/bfd-log-pos.stat','w'); $timestamp = time(); $pos = ftell($fh); fwrite($lfh,"$timestamp,$pos"); fclose($lfh); if(!fclose($fh)) { echo "Error! Couldn't close the file."; } print("bfd_blocks\n$blocks"); ?> 

В строке 40: $fh = fopen('/var/log/bfd_log', 'r'); Я просмотрел каталог /var/log и нет файла с именем bfd_log , я не знаю, нужно ли мне его создавать самостоятельно или автоматически создается.

Может кто-нибудь помочь мне в исправлении этой ошибки, спасибо заранее.

Ошибка указывает, что вы пытаетесь передать переменную с логическим значением (true / false) в функцию, которая нуждается в ресурсе, а не в логическом значении.

Убедитесь, что перед использованием ресурсов из переменных функция, возвращающая ресурс, не запуталась. Только с успехом выполняйте другие функции, которые используют этот ресурс / переменную.

 $fh = fopen('/var/log/bfd_log', 'r'); // check fh before other functions use this variable if (!$fh) { echo "Error! Couldn't open the file."; } else { // perform task with resource $fh fseek($fh, $res[1]); [...] $lfh = fopen('/etc/snmp/bfd-log-pos.stat', 'w'); // check before other code block is executed and use this variable if( $lfh ) { // perform task with resource $lfh $pos = ftell($fh); fwrite($lfh, "$timestamp,$pos"); fclose($lfh); fclose($fh); [...] } else { // lfh error } } 

Если вы всегда проверяете перед использованием переменных, вы больше не столкнетесь с этой ошибкой.

Пытаться

 $fh = fopen('/var/log/bfd_log', 'a+'); 

a + режим создаст файл, если он не существует