Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高负载是否会导致PHP无法写入文本文件?_Php_Iis_Logging_Php 5.5 - Fatal编程技术网

高负载是否会导致PHP无法写入文本文件?

高负载是否会导致PHP无法写入文本文件?,php,iis,logging,php-5.5,Php,Iis,Logging,Php 5.5,我有一个PHP脚本,它的负载很高,每秒有多个调用(来自另一台计算机)。它在IIS服务器上的PHP5.5.14上运行。对脚本的每个请求和响应都使用 file_put_contents('log_2019-09-12.txt', $msg, FILE_APPEND); 每个请求和响应也都会记录在客户端计算机上,在那里我偶尔会看到PHP错误,例如: PHP ERROR 2: file_put_contents(C:\\WWW\\project-x\\logs\\log_2019-09-11.txt)

我有一个PHP脚本,它的负载很高,每秒有多个调用(来自另一台计算机)。它在IIS服务器上的PHP5.5.14上运行。对脚本的每个请求和响应都使用

file_put_contents('log_2019-09-12.txt', $msg, FILE_APPEND);
每个请求和响应也都会记录在客户端计算机上,在那里我偶尔会看到PHP错误,例如:

PHP ERROR 2: file_put_contents(C:\\WWW\\project-x\\logs\\log_2019-09-11.txt): failed to open stream: Permission denied
这些似乎每140分钟发生一次,通常是连续发生8次,然后再持续140分钟,每秒处理几个请求并成功地记录到日志文件中


是否PHP通常会写入内存文件,然后每隔140分钟将内容写入磁盘,这就是导致此错误的原因?如果是这样的话,我怎样才能绕过它呢?

你没有写这篇文章的权限。 mkdir($path,0755,true)
检查您是否拥有写作权限。

由Magnus Eriksson在评论中回答


写入时尝试添加
LOCK\u EX
参数:
file\u put\u contents($file、$text、file\u APPEND | LOCK\u EX)
来自手册:
锁定_EX标志,以防止任何其他人同时写入文件

当第二次调用进入并尝试编辑同一文件时,是否仍在写入同一文件?这很可能是竞争条件问题。更简单的方法是将日志存储在DB上,让它来处理,否则我认为您需要构建某种排队算法来解决这个问题。@NicoShultz这是一种可能性,但我认为PHP足够聪明来处理这些冲突?特别是考虑到有数百万网站运行PHP并可能使用
file\u put\u contents
,如果Stackoverflow不能处理对文件的并发访问,那么它现在应该会被这些类型的错误弄得乱七八糟。。@MagnusW是的,我也这么想,但如果不是这样的话,我也不会感到惊讶:)也许你可以检查一下他试图写入文件的内容,看看内容是否有什么奇怪的地方?只需添加一个try catch和dump$msgTry,并在写入时添加
LOCK\u EX
参数:
file\u put\u contents($file、$text、file\u APPEND | LOCK\u EX)
。根据手册:“LOCK_EX标志以防止其他人同时写入文件”,我将使用日志库,比如,而不是编写自己的日志库。该库支持所有类型的日志记录,如文件、数据库、电子邮件等。如果他没有权限,则总是会失败权限不是问题,因为它在其他99.99%的时间内成功写入同一文件。我提出了两种解决方案。第一种是在写入文件时锁定文件,第二个是创建一个临时文件来更新主文件。这实际上是一个注释,而不是答案。再重复一点。我正在将这篇文章标记为删除。