Лучшая практика для ввода-вывода файлов с высокой нагрузкой? - PullRequest
3 голосов
/ 27 декабря 2010

Какую рекомендацию вы рекомендуете для сервера LAMP с высокой одновременной загрузкой, и мне нужно обрабатывать файловый ввод-вывод, не слишком зацикливаясь на блокировке файла?

Я имею в виду, скажем, яхотите иметь файл SUBSCRIBERS.CSV, в котором есть несколько имен и адресов электронной почты.Но я хочу, чтобы люди могли заполнить форму, чтобы отписаться.Действие отмены подписки прокручивает этот файл, чтобы удалить соответствующую строку, если она существует для данного адреса электронной почты.Это кажется простой задачей в PHP, но что происходит, когда у вас есть 10 человек, пытающихся отписаться сразу, и 10 новых подписчиков добавляются?Вот где я думаю, что PHP может столкнуться с проблемами и из-за блокировки файла может возникнуть ошибка, если только Linux или PHP не обладают большей способностью, чем я думаю.

Обратите внимание, что мой клиент хочет файл CSV, а не таблицу базы данных,В таблице базы данных это не будет проблемой, но как файловый ввод-вывод, я могу столкнуться с потенциальной проблемой, верно?

(Кстати, чтобы предотвратить кражу личных данных, я использую трюк .htaccess, такчто нельзя загрузить CSV через Интернет, угадав его имя - к нему должен обращаться только мой PHP-скрипт или FTP.)

Ответы [ 2 ]

8 голосов
/ 27 декабря 2010

Если требуется, чтобы клиент взаимодействовал с файлом 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 голос
/ 27 декабря 2010
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);
...