Лучший способ получить случайное слово для скрипта капчи в PHP

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

Как лучше всего обрабатывать этот список для производительности на сайте с высоким трафиком?

Читать слова из текстового файла при каждой загрузке
Сохранить в массиве
другое?


person JasonDavis    schedule 01.08.2009    source источник
comment
Почему бы не использовать бесплатные сервисы капчи, доступные в сети? например: captchas.net   -  person Ganesh R.    schedule 01.08.2009
comment
Я не хочу, чтобы внешний сервис, как держать вещи внутри, я думаю, что это более профессионально   -  person JasonDavis    schedule 01.08.2009
comment
На указанном выше сайте представлены php-скрипты, которые будут размещены на вашем веб-сервере. Вам не нужно общаться с их сервером. Просто они предоставляют вам готовый код. В любом случае просто предложение. Хотя бы взгляните на их код.   -  person Ganesh R.    schedule 01.08.2009
comment
о, хорошо, да, я посмотрю на это, на самом деле причина, по которой я сделал свой, заключалась в том, что я просмотрел много разных готовых, и ни один не соответствовал моим потребностям, поэтому я закодировал свой собственный, и я очень доволен этим, я просто хочу добавьте несколько слов в дополнение к случайным символам, спасибо, хотя я проверю код   -  person JasonDavis    schedule 01.08.2009
comment
Есть компромисс между доморощенным и готовым. Homebrew может быть очень легко взломан скриптом, и вы можете создать огромные дыры в безопасности своего приложения, даже не осознавая этого. С другой стороны, в более традиционных пакетах, вероятно, есть кто-то, кто активно пытается их обойти.   -  person Kitson    schedule 01.08.2009
comment
мой доморощенный - лучший из 4 предварительно упакованных капч, во всяком случае, я бы сказал, что его намного сложнее взломать   -  person JasonDavis    schedule 02.08.2009


Ответы (5)


Использование фиксированного списка слов может сделать вашу капчу слабой, поскольку она ограничивает количество вариантов до n! / (n - k)! опции. При n = 300 слов и k=2 разных слов на капчу будет всего 89700 вариантов, независимо от длины слов.

Если бы вы использовали последовательность из четырех случайных букв (a-z), вы бы получили больше вариантов (ровно n^k = 26^4 = 456976).

person Gumbo    schedule 01.08.2009
comment
вау, это какая-то сумасшедшая математика, я даже не знал, что вы можете это узнать, в любом случае я в конечном итоге отказался от слова идея и использовал 4 символа, ну, я сделал свою функцию, в которой я могу легко изменить ее, чтобы иметь больше, интересно, сколько 5 или 6 символов было бы лол - person JasonDavis; 01.08.2009
comment
Вы можете рассчитать это с помощью формулы n*^*k, где n — количество символов в вашем наборе символов, а k — количество символов. вы хотите использовать. - person Gumbo; 01.08.2009
comment
Это наука, называемая дискретной математикой. - person Alfred; 30.08.2009

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

person JeremyWeir    schedule 01.08.2009
comment
или сериализованный объект также может помочь. - person dusoft; 01.08.2009

Лучший вариант производительности

  1. Было бы лучше поместить список случайных чисел в память (APC или Memcache => google/stackoverflow для поиска APC или Memcache), чтобы получить максимальную производительность, потому что дисковый ввод-вывод - это то, что будет замедлять работу вашего сайта большую часть времени. Для этого у вас должна быть коробка с достаточным объемом памяти (>= 128MB) и вы можете установить программное обеспечение (APC/Memcache). Если вам нужна хорошая производительность на сайте с высоким трафиком, вы должны быть готовы платить за !!!

  2. Если вы используете общий хостинг-провайдер (но тогда вы не получите наилучшей производительности), то лучше всего поместить слова в массив в том же файле, потому что каждый оператор require будет извлекать файл с диска.

вернуть случайное слово

Как повезло, вы можете получить случайное число простым вызовом функции rand

return ($words[rand(0, count($words)-1);

Где $words — массив со всеми словами.

VPS-хостинг

Это несколько дешевых хостингов VPS, которые я нашел с помощью Google, но я думаю, вам следует провести дополнительное исследование, чтобы найти лучший хостинг VPS для вашего высокопроизводительного сайта.

person Alfred    schedule 01.08.2009
comment
Спасибо за информацию, сейчас я работаю на 2 серверах, просто всегда ищу лучшую производительность везде, и я только вчера начал использовать memcache, я хотел бы попробовать APC, хотя я думал, что APC основан на диске? В любом случае, я закончил тем, что не делал список случайных слов, но я сделал список случайных шрифтов, чтобы построить своих персонажей с массивом шрифтов, и вместо использования функции rand массива я подумал, может быть, обычная функция rand может быть быстрее? ТАК Я использовал это, чтобы выбрать число, соответствующее моему номеру массива - person JasonDavis; 01.08.2009
comment
NOO APC основан на памяти, а также (в первую очередь) является кешем кода операции, который будет помещать байт-код в память, что значительно ускорит ваш php. Если возможно, вы действительно должны установить его, потому что это значительно ускорит ваш сайт. Еще одна вещь, которую может сделать APC, это поместить переменные в память (память намного быстрее, чем дисковый ввод-вывод) en .wikipedia.org/wiki/ - person Alfred; 01.08.2009

Вместо 300 слов вы можете просто сгенерировать случайное число и отобразить его. Нет необходимости в списке или загрузке списка или управлении списком, ....

person Ira Baxter    schedule 01.08.2009
comment
уже сделано, я расширяю возможности этого, я ищу лучший способ получить список любой длины и выбрать из него 1 случайное слово - person JasonDavis; 01.08.2009
comment
Я не думаю, что вы поняли мой ответ. Вместо списка слов, из которых вы выбрали случайным образом, вы просто выбираете случайное число и отображаете само число. Слова не нужны. Список не нужен. Управление списками не требуется. Он довольно безмозглый. - person Ira Baxter; 01.08.2009
comment
это была бы самая слабая капча, которую я когда-либо видел, там всего 10 чисел, верно? - person JasonDavis; 01.08.2009
comment
Вы должно шутить. Генераторы случайных чисел почти на каждом известном мне языке могут создавать 56-битное случайное значение, используя 64-битную случайную функцию с плавающей запятой. ДАЖЕ безмозглый PHP имеет генератор случайных чисел (который соответствует форме PHP, гарантирует только 15 бит), но имеет диапазон, намного превышающий 10 чисел. php.net/manual/en/function.rand.php - person Ira Baxter; 01.08.2009
comment
Я признаю, что мало что знаю об этом, но вы говорите, что число 1-10 или 9+0 более безопасно, чем использование всего алфавита? Как я уже сказал, я не понимаю всей этой причудливой математики, кажется, что комбинация из 27 символов составляет где-то около 456 976 возможных капч. - person JasonDavis; 02.08.2009
comment
N-битное число имеет 2 в степени n возможных значений; PHP-функция rand выдает как минимум 15 бит или 2^15 комбинаций ==> 32768 различных возможных чисел. Если это реализовано разумно, то будет получено 56 бит или 2^56 комбинаций ~~ 10^15 == 1 триллион возможных случайных чисел. Попробуйте запустить его; см. ссылку выше. Вы предлагаете около 450 000 возможных комбинаций. Вам нужно поговорить с другим программистом в течение 30 минут, если вы этого не понимаете. - person Ira Baxter; 02.08.2009
comment
PS: если вы хотите стать серьезным программистом: работайте усердно над пониманием сложной математики. - person Ira Baxter; 02.08.2009

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

Я бы начал с простого текстового файла, по одному слову в строке, и сделал бы что-нибудь простое, например

$words = file("wordlist.txt");
return ($words[rand(0, count($word)-1);

и только если бы это действительно оказалось узким местом, я бы изменил его, чтобы сделать случайный fseek() или какой-нибудь другой трюк с «высокой производительностью».

person Lucky    schedule 01.08.2009