2010-04-08 23 views
7

Conceptualmente hablando, ¿cómo se podría escribir un sistema de logros para un sitio web usando PHP y MySQL?Un sistema de logros como el de stackoverflow en php?

¿La única forma real de hacerlo es hacer constantemente consultas MySQL para comprobar logros y cosas por el estilo?

+0

i Diría que esa fue la única forma real de hacerlo, ya que necesitaría poder hacer un seguimiento de los logros que ya se han logrado. – studioromeo

+0

Como hablamos a nivel conceptual, no creo que esta pregunta tenga nada que ver con MySQL o PHP. – pkaeding

+0

PHP y MySQL tienen limitaciones, en el desarrollo de juegos tengo un motor que tiene un sistema de eventos, todo lo que tengo que hacer es escuchar los logros para determinar si se logró un logro. Es sedoso y eficiente, pero no se puede hacer en php de manera eficiente. – tweetypi

Respuesta

1

Es posible que desee plantear una pregunta similar en meta, para ver si Jeff está dispuesto a compartir cualquiera de sus lecciones aprendidas en este campo. Si lo hace, la pregunta debe ser específicamente sobre la forma en que SO se acercó al problema. Esta pregunta, sin embargo, es una pregunta perfectamente válida para este sitio (ya que está preguntando sobre la creación de un nuevo proyecto, inspirado en lo que se hizo en SO).

Sospecho, sin embargo, que el equipo SO tiene un trabajo que periódicamente ejecuta un conjunto de consultas para buscar nuevas insignias para otorgar, y luego las premia. Esta es la razón por la cual las insignias no se otorgan inmediatamente después de que se toma la acción para ganarlas.

+0

¡ah, en realidad es un buen punto!Ni siquiera me di cuenta de que las insignias no se otorgaron tan pronto como se otorgaron, pero tiene sentido porque estas consultas serían bastante lentas ... lástima que no se pueda hacer al instante ... – tweetypi

+20

Esto ** NO ** pertenecen a meta –

+2

no, no quise decir que esta pregunta perteneciera a meta. Quería decir que preguntarle al equipo de SO las ideas aprendidas durante el desarrollo de SO podría ser una pregunta hermana adecuada a esta. He agregado una aclaración sobre esto. – pkaeding

14

tiene dos opciones, y lo más probable puede combinarlos:

Puede tener un trabajo programado que se ejecute cada X minutos, y se ejecuta sobre la base de datos mirando cada usuario y comprueba si se merecen un nuevo distintivo.

Por ejemplo, StackOverflow implementa esto para el distintivo Nice Answer. Cada vez que se ejecuta, comprueba cuántas Respuestas con +10 votaciones ascendentes tiene, y ve si necesita que se le otorgue otra insignia. (Ve 5 publicaciones con 10 votaciones ascendentes y 4 insignias de respuesta agradables, obtienes una insignia). Jeff ya ha declarado que esto significa que si obtienes una respuesta que recibe un 10 voto, luego una votación negativa, y luego otra publicación obtiene 10 votos, no obtendrás una insignia.

La segunda opción es desencadenadores basados ​​en eventos. Que son realmente simples:

$badgeSystem->giveBadge("Some Badge Name", $User_ID); 

Esto se puede utilizar para eventos que usted sabe que están sucediendo. Como la insignia Autobiographer. Lo más probable es que el usuario no complete su perfil a menos que se presione el botón de enviar, por lo que el sitio podría simplemente verificar si el usuario ha completado todo, y si lo han hecho, y todavía necesitan la insignia, la obtienen.

El cron-job debe utilizarse para acciones que se comprueban constantemente. Cosas como objetivos cuantitativos como visitar el sitio durante 150 días o editar 500 veces.

El desencadenador basado en eventos debe ocurrir cuando un evento solo ocurrirá si el usuario realiza una acción específica, como enviar un formulario.

(Probablemente se podría utilizar ya sea para casi cualquier situación. El disparador basada en eventos proporciona una retroalimentación más rápida, aunque ..)

Cuestiones relacionadas