这让我疯狂。我有一个标准的例程来编写运行良好的日志文件,以至于我几乎忘记了代码中的内容。将它转化为一个新项目,做出了一个改变,它的表现真的很奇怪。错误消息指出fopen()无法打开日志文件,但是这些条目仍在写入日志文件中。我不喜欢有任何描述的错误或警告,所以我不打算忽略这个错误,仅仅因为它看起来在尽管出现错误仍在工作。PHP fopen无法打开文件,但仍然写入它
我所做的更改是以$ _SESSION ['base_dir_prefix']的方式设置的。在之前的项目中,这些项目是在主页上下文中设置的,并设置为该目录的绝对路径。这有一个弱点,你不能不经过index.php直接进入一个页面。我无法在这个项目中做到这一点,所以我将它设置为相对路径 - 例如, $ _SESSION ['base_dir_prefix'] =“../”;据我所见,前缀设置正确。事实上,据我所知,一切都设置正确,但显然有一针在那里,需要另一双眼睛看!
我最大的问题之一是,如果fopen()无法打开文件,那么为什么会被写入?
附件1 - 实际写入功能的源代码。请注意,echo语句纯粹用于调试目的,不属于正常执行。
function writelog($str=" ")
{
if (isset($_SESSION['base_dir_prefix']))
{
$prepend = $_SESSION['base_dir_prefix'] ;
}
else
{
$prepend = $_SERVER['DOCUMENT_ROOT'] ;
}
if (substr($prepend, -1, 1) <> DIRECTORY_SEPARATOR)
{
$prepend .= DIRECTORY_SEPARATOR ;
}
$fname = $prepend."log/log.txt" ;
$mode = "a" ;
echo getcwd(). "\n" ; // debug code
echo $fname." Files exists?:".file_exists($fname) ."\n";
echo $str."\n" ;
$fp = fopen($fname, $mode) ;
fwrite($fp, date("Y-m-d H:i:s").": ") ;
fwrite($fp, $str."\n") ;
fclose($fp) ;
}
图表2 - 日志文件本身 - 调用该函数
$u->writelog ("SA OLU entering Option List Users function") ;
$u->writelog ("Current dir:".getcwd()." ") ;
$usr_list = array(array("None", "None"));
$sc->user_list($usr_list) ;
$i = 0 ;
$res = "" ;
$actv_flag = strtoupper($active) ;
if ($usr_list[0][0] != "None")
{
while ($i < count($usr_list))
{
if ((bool)$usr_list[$i][2] == true && $actv_flag == "YES") //only active users
{
$i++ ;
continue ;
}
$res .= sprintf("<option value=\"%s\"> %s (%s) </option> \n",
$usr_list[$i][0],
$usr_list[$i][1],
$usr_list[$i][0]
);
$i++ ;
}
} else
{
$res = sprintf("<option value=\"no_recs\"> No Program Records </option> \n") ;
}
$u->writelog ("SA OLU leaving Option List Users function") ;
图表3的代码。由展览创建的条目1.请注意,此文件上的时间戳比实际时间晚1个小时。不知道为什么,因为我是唯一看这个文件的人,所以我一直没有太在意。
2014-11-21 16:29:58: SA OLU entering Option List Users function
2014-11-21 16:29:58: Current dir:/srv/www/dev/gillies/security
2014-11-21 16:29:58: SA OLU leaving Option List Users function
2014-11-21 16:29:58: SA OLU entering Option List Users function
2014-11-21 16:29:58: Current dir:/srv/www/dev/gillies/security
2014-11-21 16:29:58: SA OLU leaving Option List Users function
2014-11-21 16:29:58: SA OLU entering Option List Users function
2014-11-21 16:29:58: Current dir:/srv/www/dev/gillies/security
2014-11-21 16:29:58: SA OLU leaving Option List Users function
表4 - Apache的错误日志文件
[Fri Nov 21 15:29:25.047732 2014] [:error] [pid 20588] [client 192.168.0.19:62116] PHP Warning: fwrite() expects parameter 1 to be resource, boolean given in /srv/www/dev/gillies/php/utilities.php on line 72
[Fri Nov 21 15:29:25.047746 2014] [:error] [pid 20588] [client 192.168.0.19:62116] PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /srv/www/dev/gillies/php/utilities.php on line 73
[Fri Nov 21 15:29:58.721627 2014] [:error] [pid 17084] [client 192.168.0.19:62141] PHP Warning: fopen(../log/log.txt): failed to open stream: No such file or directory in /srv/www/dev/gillies/php/utilities.php on line 69
[Fri Nov 21 15:29:58.721698 2014] [:error] [pid 17084] [client 192.168.0.19:62141] PHP Warning: fwrite() expects parameter 1 to be resource, boolean given in /srv/www/dev/gillies/php/utilities.php on line 71
[Fri Nov 21 15:29:58.721711 2014] [:error] [pid 17084] [client 192.168.0.19:62141] PHP Warning: fwrite() expects parameter 1 to be resource, boolean given in /srv/www/dev/gillies/php/utilities.php on line 72
[Fri Nov 21 15:29:58.721720 2014] [:error] [pid 17084] [client 192.168.0.19:62141] PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /srv/www/dev/gillies/php/utilities.php on line 73
图表5 - 表示回波的结果所生成的HTML代码的一个片断。附件2创建的条目。再次,这仅用于诊断目的,不是生产文件的一部分。
</h4><select name="users" size="5">
/srv/www/dev/gillies/security
../log/log.txt Files exists?:1
SA OLU entering Option List Users function
/srv/www/dev/gillies/security
../log/log.txt Files exists?:1
Current dir:/srv/www/dev/gillies/security
/srv/www/dev/gillies/security
../log/log.txt Files exists?:1
SA OLU leaving Option List Users function
<option value="loginid"> name (loginid) </option>
图表6 - 日志文件
[email protected]:/srv/www/dev/gillies/log$ pwd
/srv/www/dev/gillies/log
[email protected]:/srv/www/dev/gillies/log$ ls -l
total 8
-rw-rw-rw- 1 www-data www-data 4743 Nov 21 15:33 log.txt
任何线索的人的目录结构? 谢谢。
代码中的某处,您将'$ fname'设置为'boolean'。您需要调试(通过'var_dump()')来查看它从字符串到布尔的位置。 – Darren 2014-11-21 06:33:55
达伦,谢谢你的想法,但我不认为这是发生。如果你看展览1,在fopen使用它之前立即回显$ fname。图表5显示它不是布尔值,并且还验证文件$ fname确实存在。 – 2014-11-21 07:05:01
我很惊讶,相对路径正在工作,我的印象是,你总是需要一个绝对路径来写文件? – Darren 2014-11-21 07:08:41