Обработка HTTP-запроса - PullRequest
       16

Обработка HTTP-запроса

1 голос
/ 03 августа 2010

Если на веб-сервер поступает HTTP-запрос от многих клиентов, запросы будут обрабатываться в следующем порядке.

Для всех http-запросов я хочу использовать систему токенов.Поэтому при первом запросе я записываю число в файл и увеличиваю число для следующего запроса и т. Д.

Я не хочу делать это в БД, поскольку размер БД увеличивается ..

Это правильный способ сделать это. Пожалуйста, предложите

Редактировать: поэтому, если пользователь публикует комментарий, комментарий должен быть сохранен в файле, а не в БД.есть переменная, которая увеличивается для каждого запроса. Этот номер будет использоваться при записи имени файла и будет ссылаться на него в будущем. Поэтому, если есть много запросов, это правильный способ сделать это ..

Спасибо ..

Ответы [ 3 ]

1 голос
/ 03 августа 2010

Почему бы не заблокировать (http://php.net/manual/en/function.flock.php) файлы в папке?

Блокировка первого вызова 01,
Блокировка второго вызова 02,
Блокировка третьего вызова 03,
01разблокируется,
4-й вызов блокируется 01

В основном каждый php-скрипт пытается заблокировать первый файл, который он может, и когда это сделано, он разблокирует / стирает файл.

Я используюэто в системе с 250+ дочерними процессами, порожденными «менеджером процессов».Пытался использовать базу данных, но все это замедлилось.

Если вы хотите продолжать увеличивать номер файла для некоторого контента, я бы предложил использовать mktime () или time () и использовать


$now=time();
$suffix=0;
while(is_file($dir.$now.'_'.$suffix)) {
  $suffix++;
} 

Но опять же, в зависимости от того, как вы хотите прочитать данные или использовать их, есть много вариантов.Не могли бы вы предоставить более подробную информацию?

----- EDIT 1 -----

  1. Каждый запрос имеет «файл блокировки» и сохраняет идентификатор блокировки (номер) находится в $ lock.
  2. одновременно три посетителя публикуют сообщения с идентификатором блокировки 01, 02, 03 (последний шаг в описанной ситуации)

$now=time();
$suffix=0;
$post_id=30;
$dir='posts/'.$post_id.'/';
if(!is_dir($dir)) { mkdir($dir,0777,true); }
while(is_file($dir.$mktime.'_'.$lock.'_'.$suffix.'.txt')) {
  $suffix++;
}

В то время как не должно быть необходимости, но я обычно держу это так или иначе на всякий случай :).Это должно создать текстовый файл 30 / 69848968695_01_0.txt и ..02_0.txt и ..03_0.txt.

Когда вы хотите показать комментарии, вы просто сортируете их по имени файла ....

1 голос
/ 03 августа 2010

Размер базы данных не нужно увеличивать.Все, что вам нужно, это один ряд.В принципе логика звучит так:

 Read row, taking lock, getting the current count
 Write row with count incremented, releasing lock

Обратите внимание, что вы используете блокировки базы данных, чтобы справиться с возможностью одновременной обработки нескольких запросов.предлагая использовать базу данных в качестве места для управления вашим счетом.Вы все еще можете записать свои другие данные в файлы, если хотите.Тем не менее, вам все равно понадобится домашнее хозяйство для файлов.Это намного сложнее с базой данных?

0 голосов
/ 13 мая 2011

Я согласен с некоторыми другими комментаторами в том, что, независимо от того, какую проблему вы пытаетесь решить, вы, возможно, усложняете ее.

В вашем примере упоминается помещение комментариев в файл и их хранение вне базы данных.

Какова цель вашего подсчета, точно? Вы хотите посчитать количество комментариев, сделанных пользователем? Или общее количество запросов комментариев точно?

Если вам не нужно обновлять счет в любом месте в реальном времени, вы можете написать простой скрипт, который читает журналы доступа к вашему серверу и суммирует итоговые данные.

Кроме того, как указывает Мэтью выше, если вы хотите, чтобы запросы обрабатывались в определенном порядке, вы быстро столкнетесь со странными ошибками параллелизма и проблемами производительности.

Если вы обновите свой пост, добавив более подробные сведения, мы сможем помочь вам в дальнейшем.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...