【问题标题】:Append to file...will I need to lock附加到文件...我需要锁定吗
【发布时间】:2013-04-07 04:09:05
【问题描述】:

这里是php新手

我正在创建一个网页,该网页通过附加到文本文件中来存储一些信息。 每次网页加载时,都会有一个小的 php 脚本将信息添加到文本文件的末尾。我正在使用 file_put_contents。这是我的代码的非常简化的版本:

<?php
$file = "records.txt";
$current = file_get_contents($file);
$current .= "id = ". $_GET["id"]." \n";
file_put_contents($file, $current );
?>

这是我的担忧...如果数百人打开我的网页,我的脚本是否能够捕获所有用户信息而不会错过任何人。这非常重要。

我害怕锁定它(使用 LOCK_EX),因为这意味着当新用户打开网页时,如果另一个用户正在写入脚本,则脚本将无法打开并附加到文本文件中,因此我将无法捕获他的信息,这是一个大问题。

那么我应该忽略锁还是需要一个?我该如何解决这个问题

非常感谢。

【问题讨论】:

  • 你应该使用数据库。但是作为一名 PHP 程序员,如果任由您自己使用,您可能最终会使用 mysql_* 系列函数。不要这样做。阅读有关在 PHP 中使用参数化 SQL 的信息。

标签: php


【解决方案1】:

它不是数据库,但它类似于锁定。您可以使用队列来存储要写入文件的消息。但它可能会变得非常大。

【讨论】:

    【解决方案2】:

    使用数据库会很慢。您的问题听起来与日志文件所做的完全一样,它们有效地完成了工作,经过了很好的测试并且可靠。其中一些甚至支持具有您选择的文件大小的文件集。理论上,您只需用您的数据替换错误消息。虽然我自己还没有使用它,但我看到到处都是对 log4j 的引用,所以这是一个很好的起点。它使用Java。 Java 本身内置了一个小型日志记录系统,我在一项小型工作中使用它并取得了不错的效果。您甚至可以将 log4j 视为一个黑匣子,并将其用于使用其他语言构建的项目。

    【讨论】:

      【解决方案3】:

      fopen()a 开关一起使用。这将解决所有问题。

      $handle = fopen("somefile.txt", "a");
      

      根据您的要求,您不应锁定文件,但这可能会使文件暴露于漏洞。所以我会建议一个替代方案。

      数据库中插入您想要的信息,而不是文件。

      【讨论】:

      • 根据 php fopen with 'w' 将“将文件指针放在文件的开头并将文件截断为零长度”。我认为这意味着它将覆盖。我需要追加而不是覆盖,否则我只会在文本文件中获得一个用户的输入。
      • @user1684072,哦,是的,使用“a”开关。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-20
      相关资源
      最近更新 更多