3

对于具有高同时负载的 LAMP 服务器,您推荐的最佳实践是什么,我需要处理文件 I/O 而不会太挂在文件锁上?

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

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

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

4

2 回答 2

8

如果要求客户端与 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);
}
于 2010-12-27T02:14:46.677 回答
1
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);
于 2010-12-27T03:02:08.560 回答