2013-05-29 5 views
6

Я запускаю PHP-приложение уровня предприятия. Это браузерная игра с тысячами пользователей в Интернете по инфраструктуре, которую мой босс отказывается обновлять, а оборудование работает на 2-3 системной нагрузке (yep linux) в любое время. Во всяком случае, это не настоящая проблема. Реальная проблема заключается в том, что некоторые пользователи ждут загрузки сервера (в прайм-тайм), и они приносят свои клики мыши, и они нажимают одну и ту же кнопку отправки, как 10-20 раз, одновременно отправляя 10-20 запросов, пока сервер по-прежнему создавая первоначальный запрос, тем самым не обновляя кэш и базу данных.PHP, связанный с параллелизмом

В настоящее время у меня есть выходная переменная для каждого запроса, которая действительна в течение 2 минут, и у меня есть блокировка «мьютекса», которая в основном является флагом внутри memcache, который, если найден, блокирует выполнение сценария дальше, но кликер мыши делает так много запросов одновременно, что они работают почти одновременно, что является большой проблемой для меня.

Как вы, большинство людей StackOverflow, занимающихся этой проблемой. Я думал о том, чтобы помечать cookie/сессию, но я думаю, что я попаду в ту же проблему, если сервер будет перегружен. Оптимизация невозможна, источник 7 лет и довольно оптимизирован, без запросов на большинстве страниц (отключение кэш-памяти) и только запрос базы данных на определенный пользовательский ввод, как тот, который я пытаюсь предотвратить.

Да, это процедурный код без реальных объектов. Машины запускают PHP 5, но сам код больше связан с PHP 4. Я знаю, что я знаю, что это старое и прочее, но мы не можем избавить ресурс от переписывания всего этого беспорядка, поскольку большинство оригинальных разработчиков оставили это знать, как материал переплетается и да, я в основном исправляю старые дыры. Но насколько я знаю, это общая проблема на загруженных PHP-сайтах.

P.S: Отключение кнопки с помощью javascript для отправки не является вариантом. Настоящие читеры - это продвинутые пользователи. Один из них написал бот-кликер и упаковал его в качестве расширения Google Chrome. Не спрашивайте, как я с этим справился.

+3

Как вы с этим справились? :) –

+2

Я использую websockets. Модель процесса за запрос очень плохо подходит для такого рода вещей. – rdlowrey

+0

Да, приложение устарело, и у него нет такой модной истории MVC/Bigpipe/JSON/HTML5, которую используют современные веб-сайты. У него слишком много «исправлений», чтобы просто поместить этот интерфейс поверх – Sk1ppeR

ответ

1

Я бы поискал решение вне вашего кода.

Не знаете, какой сервер вы используете, но apache имеет некоторые модули, например mod_evasive.

Вы также можете ограничить соединений в секунду из IP в брандмауэре

+0

Я использую Nginx и PHP как CGI P.S: Я не спустил вас вниз – Sk1ppeR

0

ограничения IP-соединения только сделает ваши игроки сердится. Я исправил и переписал много вещей в некоторых известных клонтерах с открытым исходным кодом со старым кодом стиля: ну, я должен сказать, что обман может всегда избегать выполнения правильных запросов и логики. , например, смотрите здесь http://www.xgproyect.net/2-9-x-fixes/9407-2-9-9-cheat-buildings-page.html

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

О скриптах: в моих играх у меня есть php-модуль, который автоматически переписывает ссылки, добавляя случайный идентификатор, сохраненный в базе данных, своего рода CSRF-защиту. Пользователь будет нажимать на измененную ссылку, поэтому они не будут видеть изменения, но скрипты будут пытаться запросить старую ссылку и после некоторой попытки там запрещены! другие скрипты используют DOM, поэтому его легко избежать, добавив некоторые бесполезные DIV вокруг страницы.

редактировать: вы можете увеличить ваше приложение с https://github.com/facebook/hiphop-php/wiki

1

Я получаю чувство этого трогательное больше о том, чтобы обновить базу коды устаревшей, чем все остальное.В то время как реализация некоторого типа параллелизма была бы хорошей, старая база кода - ваша настоящая проблема.

Я настоятельно рекомендую this video, в котором обсуждается Технический долг.

Наблюдайте за этим, тогда, если вы еще этого не сделали, объясните своему начальнику в деловых условиях, что Технический долг есть. Вероятно, он это понимает. Объясните, что, поскольку код плохо управляется (задолженность выплачивается), существует очень высокий уровень технического долга. Предложите ему/ей, как решить эту проблему, используя небольшие инкрементные итерации, чтобы улучшить ситуацию.

+0

Это видеоролик. –

0

Я не знаю, есть ли уже реализация, но я занимаюсь написанием кеш-сервера, который несет ответственность за заполнение промахов в кэше. Этот подход может хорошо работать в этом сценарии.

В принципе, вам нужен механизм для отметки кэш-памяти в ожидании промаха; чтение ожидающего значения должно заставлять клиента спать небольшое, но случайное количество времени и повторить попытку; совокупность ожидающих данных в традиционной модели будет выполняться клиентом, сталкивающимся с пропуском, а не ожидающим.

В этом контексте сценарий является клиентом, а не браузером.

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