【问题标题】:What are the best practices for handling high-load file I/O?高负载文件 I/O 的最佳实践?
【发布时间】:2010-12-27 02:00:05
【问题描述】:

对于同时负载较高的 LAMP 服务器,我需要处理文件 I/O 而不会被文件锁挂得太久,您推荐的最佳做法是什么?

我的意思是,假设我想要一个 SUBSCRIBERS.CSV 文件,其中包含一堆姓名和电子邮件地址。但我希望人们能够填写表格取消订阅。如果给定电子邮件地址存在匹配行,则取消订阅操作将滚动浏览该文件以删除匹配行。这在 PHP 中似乎是一项简单的任务,但是当您有 10 个人试图同时取消订阅并添加 10 个新订阅者时会发生什么?这就是我认为 PHP 可能会遇到问题并且可能由于文件锁定而产生错误的地方,除非 Linux 或 PHP 比我想象的更强大。

请注意,我的客户需要 CSV 文件,而不是数据库表。在数据库表中,这不是问题,但作为文件 I/O,我可能会遇到潜在问题,对吧?

(顺便说一句,为了防止身份盗用,我使用了一个 .htaccess 技巧,这样人们就无法通过猜测其名称通过网络下载 CSV——它只能通过我的 PHP 脚本或 FTP 访问。)

【问题讨论】:

  • 客户有没有具体描述过为什么应该是csv?为什么不在数据库中存储和处理所有数据,有时只是将数据导出到 csv?
  • 单个文件处理您的用户信息不是明智的选择。这就是数据库的用途。对你的客户大喊大叫。
  • 我同意,@Evan 和@zerkms。我会看看我能做什么。
  • 为了防止身份被盗,您将数据存储在无法通过网络访问的地方。它要么在 webroot 之外的文件中,要么在数据库中。用“.htaccess 技巧”保护它太脆弱了。很抱歉,但总体上是不好的方法。

标签: php multithreading file-io writing simultaneous


【解决方案1】:

如果要求客户端与 CSV 文件交互,则不需要实际使用 CSV 文件作为数据存储。相反,使用数据库,在数据库中完成所有工作,然后让 PHP 按需生成 CSV 文件。

所以,如果客户端需要访问http://example.com/SUBSCRIBERS.CSV,只需让 PHP 处理 SUBSCRIBERS.CSV 并使用类似的东西:

header("Content-type: text/csv");
$data = get_subscriber_data();
foreach ($data as $row) {
  // $row is an array of columns
  print implode(',', $row);
}

【讨论】:

  • 我还将设置一个每天运行的 cron 并创建一个带时间戳的 csv 文件,以便始终有一个“正在使用”的 csv,并且它还允许在数据库损坏的情况下进行一系列备份/失败。
【解决方案2】:
header("Content-type: text/csv");
$data = get_subscriber_data();
$fp = fopen('php://stdout', 'w'); 
foreach ($data as $row) {
  // $row is an array of columns
  fputcsv($fp, $row);
}
fclose($fp);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多