高负载文件I / O的最佳实践?

时间:2010-12-27 02:00:05

标签: php multithreading file-io writing simultaneous

对于具有高同时负载的LAMP服务器,您建议的最佳做法是什么?我需要处理文件I / O而不会过度挂起文件锁?

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

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

(顺便说一句,为防止身份盗用,我使用.htaccess技巧,以便无法通过猜测其名称来下载网上的CSV - 它必须只能通过我的PHP脚本或FTP访问。)

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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);