文件是可写的,但偶尔会出现错误:“无法打开流:权限被拒绝”

时间:2017-08-07 10:00:32

标签: php

我的/ public_html / logs文件夹中有一个404.log文件。

当显示404页面时,PHP会将信息附加到404.log文件,该文件向我提供有关我的网站以及谁正在尝试访问的内容的信息。

出于某种原因,有时我会收到错误Permission Denied。该文件是可写的,可执行的,并且每天都会被写入 - 如果我转到一个不存在的页面,文件被写入并且我可以在那里看到该条目,它可以正常工作。

然而,由于权限被拒绝,我收到了错误,我认为这种情况正在发生,因为机器人或某人试图强行进入我的网站 - 例如 - 我获得的URI是;

/static/../../../../../../../../../etc/passwd. /cms/www/loader.php/system/"><iMg /webtrees/modules_v3/googlemap/wt_v3_street_view.php?map="> /sites/all/modules/fckeditor/fckeditor/editor/filemanager/connectors/cfm/connector.cfm?Command=GetFolders&Type=File&CurrentFolder=%2F

所以我的猜测是该文件已经被同一个脚本打开,但由于网站访问速度太快,导致权限被拒绝。有办法防止这种情况,或以某种方式异步写入吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该查看网络服务器为您提供的访问日志,以了解发生了多少次404。如果你必须通过PHP完成它,你可以做几件事。

可能有一个并行写入的选项,但我想这会给你一个非常奇怪的文件,其中有很多错误相互混合。

您可能会更改记录到数据库而不是文件的方式。显然,数据库同时更适合于许多请求,并且只会为发生的每个错误创建新记录。

或者,您可以实现自己的日志记录层,它基本上只是一个内存队列,只要它不为空,就会不断尝试写入文件。这样您就可以缓冲日志。您将不得不考虑保存发生事件时的时间戳,以及跟踪队列使用的内存量。

我很确定有很多图书馆可以为您解决这个问题。编写这些库的人也遇到了这些问题,并为他们创建了一个通用的解决方案,所以你现在不必担心它。