2010-08-03 3 views
1

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

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

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

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

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

Спасибо ..

+0

Почему вы хотите, чтобы счетчик работал? Счетчики всегда работают с потерей производительности, особенно когда они не оштукатурены. Кроме того, настаивание на совершенном первом-первом-обслуживании может также повредить работе. –

+0

Идея заключается в том, чтобы отслеживать несколько деталей в DB.Want, чтобы сохранить детали в файлах, этот счет будет использован для этой цели. – Hulk

+1

Это звучит как ошибочный подход к любой проблеме, которую вы пытаетесь решить. Общий ресурс между параллельными выполнением веб-запросов - деликатная вещь и склонна к условиям гонки или проблемам с блокировкой. Каковы эти «несколько деталей», которые вы хотите отслеживать? – deceze

ответ

1

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

Первые замки вызова 01,
Второй блокировки вызовов 02,
3-замки вызова 03,
01 получает разблокирована,
замки 4-й вызов 01

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

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

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


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

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

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

  1. Каждый запрос имеет "замок-файл", и сохраняет идентификатор блокировки (номер) в $ замка.
  2. три посетителей размещать одновременно с замком-ID 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++; 
} 

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

Если вы хотите, чтобы показать комментарии вы просто сортировать их по имени файла ....

+0

См. Edit .. – Hulk

+0

В этом случае суффикс будет увеличен в случае, если несколько файлов, но с учетом трех разных суффиксов $ запроса будет 0. Чтобы отслеживать это, я пишу $ суффикс в файле , – Hulk

+0

(код здесь, похоже, не работает здесь, переместился выше) –

1

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

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

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

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

0

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

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

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

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

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

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

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

Смежные вопросы