PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

Foreword

рдореЗрд░реЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ, рдЬреБрди рдореИрд▓реЗ рд╢реМрдХрдХреЛ рд░реВрдкрдорд╛ рдЪрд▓рд╛рдЙрдБрдЫреБ, рд░реЛрдЪрдХ рдЧреГрд╣ рдкреГрд╖реНрдард╣рд░реВ рд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рд╛рдЗрдЯрд╣рд░реВ рд╣реЛрд╕реНрдЯ рдЧрд░реНрди рдбрд┐рдЬрд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рд╣реЛред рдпреЛ рд╡рд┐рд╖рдп рдореЗрд░реЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рдпрд╛рддреНрд░рд╛рдХреЛ рд╢реБрд░реБрд╡рд╛рддрдорд╛ рдиреИ рдорд▓рд╛рдИ рдЪрд╛рд╕реЛ рд▓рд╛рдЧреНрди рдерд╛рд▓реНрдпреЛ; рддреНрдпрд╕ рдХреНрд╖рдгрдорд╛ рдо рдЖрдлреИрдВ, рдЙрдиреАрд╣рд░реВрдХреЛ рд╢реМрдХ рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд▓реЗрдЦреНрдиреЗ рдорд╣рд╛рди рдкреЗрд╢реЗрд╡рд░рд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрд░ рдореЛрд╣рд┐рдд рднрдПрдБред рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ рдмрд╛рдиреА рдЖрдЬ рдкрдирд┐ рд░рд╣рдиреНрдЫ: рд▓рдЧрднрдЧ рд╣рд░реЗрдХ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд░ рдзреЗрд░реИ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рд╕рд╛рдЗрдЯрд╣рд░реВрдорд╛, рдо рд▓реЗрдЦрдХрд╣рд░реВрдХреЛ рд▓рд┐рдЩреНрдХрд╣рд░реВрдХреЛ рдЦреЛрдЬреАрдорд╛ рдлреБрдЯрд░рдорд╛ рд╣реЗрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреБред

рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдкрд╣рд┐рд▓реЛ рд╕рдВрд╕реНрдХрд░рдг рдореЗрд░реЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡реЗрдмрд╕рд╛рдЗрдЯрдорд╛ рдХреЗрд╡рд▓ рдПрдХ html рдкреГрд╖реНрда рдерд┐рдпреЛ, рдЬрд╣рд╛рдБ рдореИрд▓реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд╣рд░реВрд╕рдБрдЧ рд▓рд┐рдЩреНрдХрд╣рд░реВ рдЙрд▓ рд╕реВрдЪреАрдорд╛ рд░рд╛рдЦреЗрдВред рд╕рдордп рдЕрд╡рдзрд┐рдорд╛ 20 рдкреГрд╖реНрдард╣рд░реВ рдЯрд╛рдЗрдк рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдореИрд▓реЗ рд╕реЛрдЪреНрди рдерд╛рд▓реЗ рдХрд┐ рдпреЛ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рдЫреИрди рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред рд╕реНрдЯреНрдпрд╛рдХрдУрднрд░рдлреНрд▓реЛрдорд╛, рдореИрд▓реЗ рдпрд╛рдж рдЧрд░реЗрдВ рдХрд┐ рдзреЗрд░реИ рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрд▓реЗ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓рдорд╛ рд╕рд╛рдЗрдЯрд╣рд░реВ рд╕рдВрдХреЗрдд рдЧрд░реНрдЫрдиреН, рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ php рдорд╛ рдкрд╛рд░реНрд╕рд░ рд▓реЗрдЦреЗрдВ, рдЬреБрди рдХреЗрд╡рд▓ рдкрд╣рд┐рд▓реЛрдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдБрджреИ рдкреНрд░реЛрдлрд╛рдЗрд▓рд╣рд░реВ рдорд╛рд░реНрдлрдд рдЧрдпреЛ (SO рдорд╛ рдЖрдЬрдХреЛ рдареЗрдЧрд╛рдирд╛рд╣рд░реВ рдпрд╕ рдкреНрд░рдХрд╛рд░рдХрд╛ рдЫрдиреН: `/users/1` ), рдЗрдЪреНрдЫрд┐рдд рдЯреНрдпрд╛рдЧрдмрд╛рдЯ рд▓рд┐рдЩреНрдХрд╣рд░реВ рдирд┐рдХрд╛рд▓рд┐рдпреЛ рд░ SQLite рдорд╛ рдердкрд┐рдпреЛред

рдпрд╕рд▓рд╛рдИ рджреЛрд╕реНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг рднрдиреНрди рд╕рдХрд┐рдиреНрдЫ: SQLite рддрд╛рд▓рд┐рдХрд╛рдорд╛ рд╣рдЬрд╛рд░реМрдВ URL рдХреЛ рд╕рдЩреНрдХрд▓рди, рдЬрд╕рд▓реЗ html рдорд╛ рд╕реНрдерд┐рд░ рд╕реВрдЪреАрд▓рд╛рдИ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдЧрд░реНрдпреЛред рдореИрд▓реЗ рдпреЛ рд╕реВрдЪреАрдорд╛ рд╕рд╛рдзрд╛рд░рдг рдЦреЛрдЬ рдЧрд░реЗрдВред рдХрд┐рдирднрдиреЗ рддреНрдпрд╣рд╛рдБ рдХреЗрд╡рд▓ URL рд╣рд░реВ рдерд┐рдП, рддреНрдпрд╕рдкрдЫрд┐ рдЦреЛрдЬ рдХреЗрд╡рд▓ рддрд┐рдиреАрд╣рд░реВрдорд╛ рдЖрдзрд╛рд░рд┐рдд рдерд┐рдпреЛред

рдпреЛ рдЪрд░рдгрдорд╛ рдореИрд▓реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рддреНрдпрд╛рдЧреЗ рд░ рд▓рд╛рдореЛ рд╕рдордп рдкрдЫрд┐ рдлрд░реНрдХреЗред рдпрд╕ рдЪрд░рдгрдорд╛, рдореЗрд░реЛ рдХрд╛рдордХреЛ рдЕрдиреБрднрд╡ рдкрд╣рд┐рд▓реЗ рдиреИ рддреАрди рд╡рд░реНрд╖ рднрдиреНрджрд╛ рдмрдвреА рдерд┐рдпреЛ рд░ рдорд▓рд╛рдИ рд▓рд╛рдЧреНрдпреЛ рдХрд┐ рдо рдЕрдЭ рдЧрдореНрднреАрд░ рдХреЗрд╣рд┐ рдЧрд░реНрди рд╕рдХреНрдЫреБред рдердк рд░реВрдкрдорд╛, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛рдБ рдкреНрд░рд╡рд┐рдзрд┐рд╣рд░реВ рдорд╛рд╕реНрдЯрд░ рдЧрд░реНрдиреЗ рдареВрд▓реЛ рдЗрдЪреНрдЫрд╛ рдерд┐рдпреЛред

рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдг

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдбрдХрд░рдорд╛ рддреИрдирд╛рде рдЧрд░рд┐рдПрдХреЛ, рдбрд╛рдЯрд╛рдмреЗрд╕ mongoDb рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рд░ рд╣рд╛рд▓рд╕рд╛рд▓реИ, рдореВрд▓рд╛ рдердкрд┐рдпреЛ, рдЬреБрди рд╕реБрд░реБрдорд╛ рдХреНрдпрд╛рд╕рд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдерд┐рдпреЛред PHP рдорд╛рдЗрдХреНрд░реЛрдлреНрд░реЗрдорд╡рд░реНрдХрд╣рд░реВ рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЖрдзрд╛рд░рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫред

рд╕рдорд╕реНрдпрд╛

рдирдпрд╛рдБ рд╕рд╛рдЗрдЯрд╣рд░реВ рдХрдиреНрд╕реЛрд▓ рдЖрджреЗрд╢рджреНрд╡рд╛рд░рд╛ рдердкрд┐рдПрдХрд╛ рдЫрдиреН рдЬрд╕рд▓реЗ рдирд┐рдореНрди рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рдордХреНрд░рдордг рдЧрд░реНрджрдЫ:

  • URL рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрджрдЫ
  • HTTPS рдЙрдкрд▓рдмреНрдз рдЫ рдХрд┐ рдЫреИрди рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрдиреЗ рдЭрдгреНрдбрд╛ рд╕реЗрдЯ рдЧрд░реНрджрдЫ
  • рд╡реЗрдмрд╕рд╛рдЗрдЯрдХреЛ рд╕рд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрджрдЫ
  • рд╕реНрд░реЛрдд HTML рд░ рд╣реЗрдбрд░рд╣рд░реВ "рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛" рдЗрддрд┐рд╣рд╛рд╕рдорд╛ рдмрдЪрдд рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН
  • рд╕рд╛рдордЧреНрд░реА рдкрд╛рд░реНрд╕ рдЧрд░реНрджрдЫ, рд╢реАрд░реНрд╖рдХ рд░ рд╡рд┐рд╡рд░рдг рдирд┐рдХрд╛рд▓реНрдЫ
  • рдбреЗрдЯрд╛рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рд╕рдЩреНрдХрд▓рдирдорд╛ рдмрдЪрдд рдЧрд░реНрдЫ

рдпреЛ рдХреЗрд╡рд▓ рд╕рд╛рдЗрдЯрд╣рд░реВ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реВрдЪреАрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рдкрд░реНрдпрд╛рдкреНрдд рдерд┐рдпреЛ:

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рддрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛, рд╡рд░реНрдЧреАрдХрд░рдг рд░ рд╕рдмреИ рдЪреАрдЬрдХреЛ рд╢реНрд░реЗрдгреАрдХрд░рдг рдЧрд░реНрдиреЗ, рд╕рдмреИ рдХреБрд░рд╛рд▓рд╛рдИ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рд░рд╛рдЦреНрдиреЗ рд╡рд┐рдЪрд╛рд░ рдпрд╕ рдкреНрд░рддрд┐рдорд╛рдирдорд╛ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рдлрд┐рдЯ рднрдПрдиред рд╕рдореНрднрд╛рд╡рд┐рдд DDoS рдмрд╛рдЯ рдмрдЪреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреГрд╖реНрдард╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдирдХреНрдХрд▓ рд░ рдЕрд╡рд░реБрджреНрдз рдердкреНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╡реЗрдм рд╡рд┐рдзрд┐ рдердкреНрджрд╛ рдкрдирд┐ред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рд╕рдмреИ рдХреБрд░рд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдкрдорд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд░ рд╡реЗрдм рд╡рд┐рдзрд┐рдорд╛ рддрдкрд╛рдИрд▓реЗ URL рдмрдЪрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рддрд╛рдХрд┐ рд░рд╛рдХреНрд╖рд╕реА рдбреЗрдордирд▓реЗ рд╕реВрдЪреАрдмрд╛рдЯ URL рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рдЧрд░реНрджрдЫред рддрд░ рдЕрдЭреИ, рдпрд╣рд╛рдБ рдкрдирд┐ рд╢рдмреНрдж "рд▓рд╛рдо" рдЖрдлреИрд▓реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫред рд░ рдпрджрд┐ рд▓рд╛рдо рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рднрд╛рдЬрд┐рдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рд░ рдХрдореНрддрд┐рдорд╛ рдПрд╕рд┐рдиреНрдХреНрд░реЛрдирд╕ рд░реВрдкрдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдирд┐рд░реНрдгрдп

рд▓рд╛рдорд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рд╕рдмреИ рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрди рдШрдЯрдирд╛-рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реНред рд░ рдо рд▓рд╛рдореЛ рд╕рдордпрджреЗрдЦрд┐ Redis рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред

PHP рдорд╛ Redis рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдХрд┐рдирднрдиреЗ рдореЗрд░реЛ рдврд╛рдБрдЪрд╛ Symfony, Laravel, Yii рддреАрди рд╡рд┐рд╢рд╛рд▓ рдордзреНрдпреЗ рдПрдХ рд╣реЛрдЗрди, рдо рдПрдХ рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬреНрди рдЪрд╛рд╣рдиреНрдЫреБред рддрд░, рдпреЛ рдмрд╛рд╣рд┐рд░ (рдкрд╣рд┐рд▓реЛ рдкрд░реАрдХреНрд╖рд╛ рдорд╛), рдпреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧрдореНрднреАрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЕрд╕рдореНрднрд╡ рдЫред рд▓рд╛рдорд╣рд░реВрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕рдмреИ рдХреБрд░рд╛ рдпрд╛ рдд 3 рдХрдорд┐рдЯрд╣рд░реВрдмрд╛рдЯ рдкрд╛рдБрдЪ рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реЛ, рд╡рд╛ рдлреНрд░реЗрдорд╡рд░реНрдХрдорд╛ рдмрд╛рдБрдзрд┐рдПрдХреЛ рдЫред

рдореИрд▓реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрдкрдпреЛрдЧреА рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВрдХреЛ рдЖрдкреВрд░реНрддрд┐рдХрд░реНрддрд╛рдХреЛ рд░реВрдкрдорд╛ рд╕рд┐рдореНрдлрдиреАрдХреЛ рдмрд╛рд░реЗрдорд╛ рдзреЗрд░реИ рд╕реБрдиреЗрдХреЛ рдЫреБ, рд░ рдо рддреА рдордзреНрдпреЗ рдХреЗрд╣реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫреБред рд░ Laravel рдмрд╛рдЯ рдХреЗрд╣рд┐ рдЪреАрдЬрд╣рд░реВ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐ рддрд┐рдиреАрд╣рд░реВрдХреЛ ORM, рдлреНрд░реЗрдорд╡рд░реНрдХрдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрд┐рдирд╛ред

рд╕рд┐рдореНрдлрдиреА/рдореЗрд╕реЗрдиреНрдЬрд░

рдкрд╣рд┐рд▓реЛ рдЙрдореНрдореЗрджреНрд╡рд╛рд░ рддреБрд░реБрдиреНрддреИ рдЖрджрд░реНрд╢ рджреЗрдЦрд┐рдиреНрдереНрдпреЛ рд░ рдХреБрдиреИ рд╢рдВрдХрд╛ рдмрд┐рдирд╛ рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдВред рддрд░ рдпреЛ Symfony рдмрд╛рд╣рд┐рд░ рдкреНрд░рдпреЛрдЧрдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдЧреБрдЧрд▓ рдЧрд░реНрди рдЕрдЭ рдЧрд╛рд╣реНрд░реЛ рднрдпреЛред рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ, рдЕрд░реНрдерд╣реАрди рдирд╛рдорд╣рд░реВ, рд░ рд░реЗрдбрд┐рд╕рдорд╛ рдкрдирд┐ рдХрдХреНрд╖рд╛рд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛рдмрд╛рдЯ рд╕рдиреНрджреЗрд╢рд╣рд░реВ рдкрд╛рд╕ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдмрд╕ рдХрд╕рд░реА рдЬрдореНрдорд╛ рдЧрд░реНрдиреЗ?

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯрдорд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рдзреЗрд░реИ рд╡рд┐рд╕реНрддреГрдд рдерд┐рдпреЛ, рддрд░ рдкреНрд░рд╛рд░рдореНрднрд┐рдХрд░рдг рдХреЗрд╡рд▓ рд╕рд┐рдореНрдлреЛрдиреАрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдиреАрд╣рд░реВрдХреЛ рдордирдкрд░реНрдиреЗ YML рд░ рдЧреИрд░-рд╕рд┐рдореНрдлреЛрдирд┐рд╕реНрдЯрдХрд╛ рд▓рд╛рдЧрд┐ рдЕрдиреНрдп рдЬрд╛рджреБрдИ рд╡рд┐рдзрд┐рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред рдорд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдорд╛ рдХреБрдиреИ рдЪрд╛рд╕реЛ рдерд┐рдПрди, рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдирдпрд╛рдБ рд╡рд░реНрд╖рдХреЛ рдмрд┐рджрд╛рдорд╛ред рддрд░ рдореИрд▓реЗ рдпреЛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдкрдорд╛ рд▓рд╛рдореЛ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛред

рд╕рд┐рдореНрдлрдиреА рд╕реНрд░реЛрддрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рдгрд╛рд▓реА рдХрд╕рд░реА рдЗрдиреНрд╕реНрдЯреНрдпрд╛рдиреНрдЯреЗрдЯ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреБ рдкрдирд┐ рдХрдбрд╛ рд╕рдордпрд╕реАрдорд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИрднрдиреНрджрд╛ рд╕рд╛рдиреЛ рдХрд╛рдо рд╣реЛрдЗрди:

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рдпреА рд╕рдмреИрдХреЛ рдЦреЛрдЬреА рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐ рд░ рд╣рд╛рддрд▓реЗ рдХреЗрд╣реА рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдкрдЫрд┐, рдо рдпреЛ рдирд┐рд╖реНрдХрд░реНрд╖рдорд╛ рдкреБрдЧреЗрдВ рдХрд┐ рдореИрд▓реЗ рдХреЗрд╣реА рдкреНрд░рдХрд╛рд░рдХреЛ рдмреИрд╕рд╛рдЦреА рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫреБ рд░ рдХреЗрд╣рд┐ рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗрдВред

рдЙрдЬреНрдпрд╛рд▓реЛ / рд▓рд╛рдо

рдпреЛ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрдпреЛ рдХрд┐ рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд╛рд░рд╛рд╡реЗрд▓ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рд░ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВрдХреЛ рдЧреБрдЪреНрдЫрд╛рд╕рдБрдЧ рдХрдбрд╛ рд░реВрдкрдорд╛ рдмрд╛рдБрдзрд┐рдПрдХреЛ рдерд┐рдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдореИрд▓реЗ рдпрд╕рдорд╛ рдзреЗрд░реИ рд╕рдордп рдЦрд░реНрдЪ рдЧрд░рд┐рди: рдореИрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрдВ, рдпрд╕рд▓рд╛рдИ рд╣реЗрд░реЗ, рдирд┐рд░реНрднрд░рддрд╛рд╣рд░реВ рджреЗрдЦреЗ рд░ рдпрд╕рд▓рд╛рдИ рдореЗрдЯрд╛рдПред

yiisoft/yii2-queue

рдареАрдХ рдЫ, рдпрд╣рд╛рдБ рдпреЛ рддреБрд░реБрдиреНрддреИ рдирд╛рдордмрд╛рдЯ рдЧреНрд░рд╣рдг рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ, рдлреЗрд░рд┐, Yii2 рдорд╛ рдХрдбрд╛ рдЬрдбрд╛рдиред рдореИрд▓реЗ рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНтАНрдпреЛ рд░ рдпреЛ рдирд░рд╛рдореНрд░реЛ рдерд┐рдПрди, рддрд░ рдпреЛ рдкреВрд░реНрдгрддрдпрд╛ Yii2 рдорд╛ рдирд┐рд░реНрднрд░ рдЫ рднрдиреНрдиреЗ рддрдереНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдореИрд▓реЗ рд╕реЛрдЪрд┐рдиред

рдмрд╛рдБрдХреА

рдореИрд▓реЗ GitHub рдорд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реЗрдХрд╛ рдЕрд░реВ рд╕рдмреИ рдХреБрд░рд╛рд╣рд░реВ рддрд╛рд░рд╛рд╣рд░реВ, рдлреЛрд░реНрдХрд╣рд░реВ рд░ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛рдорд╛ рдХрдорд┐рдЯрд╣рд░реВ рдмрд┐рдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рдкреБрд░рд╛рдиреЛ рд░ рдкрд░рд┐рддреНрдпрд╛рдЧ рдЧрд░рд┐рдПрдХрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдерд┐рдПред

рд╕рд┐рдореНрдлрдиреА/рдореЗрд╕реЗрдиреНрдЬрд░, рдкреНрд░рд╛рд╡рд┐рдзрд┐рдХ рд╡рд┐рд╡рд░рдгрд╣рд░реВрдорд╛ рдлрд░реНрдХрдиреБрд╣реЛрд╕реН

рдореИрд▓реЗ рдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреБрдкрд░реНтАНрдпреЛ рд░, рдХреЗрд╣рд┐ рд╕рдордп рдмрд┐рддрд╛рдПрдкрдЫрд┐, рдо рд╕рдХреНрд╖рдо рднрдПрдБред рдпреЛ рдмрд╛рд╣рд┐рд░ рднрдпреЛ рдХрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдПрдХрджрдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░ рд╕рд░рд▓ рдерд┐рдпреЛред рдмрд╕ рд╕реБрд░реБ рдЧрд░реНрди, рдореИрд▓реЗ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдПрдХреЛ рдЫреБ, рдХрд┐рдирдХрд┐... рдорд╕рдБрдЧ рдзреЗрд░реИ рдЯрд╛рдпрд░рд╣рд░реВ рд░ рд╡рд┐рднрд┐рдиреНрди рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рд╣реБрдиреБ рдкрд░реНрдиреЗ рдерд┐рдпреЛред

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рдХреЗрд╡рд▓ рдХреЗрд╣рд┐ рдЪрд░рдгрд╣рд░реВ:

  • рд╣рд╛рдореА рд╕рдиреНрджреЗрд╢ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ рдЬреБрди рдХреЗрд╡рд▓ рдХрд▓ рдЧрд░реНрди рдпреЛрдЧреНрдп рд╣реБрдиреБрдкрд░реНрдЫ
  • рд╣рд╛рдореА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ HandlerDescriptor рдорд╛ рдмреЗрд░реНрдЫреМрдВ (рдкреБрд╕реНрддрдХрд╛рд▓рдпрдмрд╛рдЯ рдХрдХреНрд╖рд╛)
  • рд╣рд╛рдореА рдпреА "рд╡рд░реНрдгрдирдХрд░реНрддрд╛рд╣рд░реВ" рд▓рд╛рдИ рд╣реНрдпрд╛рдиреНрдбрд▓рд░ рд▓реЛрдХреЗрдЯрд░ рдЙрджрд╛рд╣рд░рдгрдорд╛ рд▓рдкреЗрдЯреНрдЫреМрдВ
  • MessageBus рдЙрджрд╛рд╣рд░рдгрдорд╛ HandlersLocator рдердкреНрджреИ
  • рд╣рд╛рдореАрд▓реЗ 'SenderInterface' рдХреЛ рд╕реЗрдЯ SendersLocator рд▓рд╛рдИ рдкрд╛рд╕ рдЧрд░реНрдЫреМрдВ, рдореЗрд░реЛ рдорд╛рдорд▓рд╛рдорд╛ 'RedisTransport' рдХрдХреНрд╖рд╛рд╣рд░реВрдХреЛ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ, рдЬреБрди рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫред
  • MessageBus рдЙрджрд╛рд╣рд░рдгрдорд╛ рдкреНрд░реЗрд╖рдХ рд▓реЛрдХреЗрдЯрд░ рдердкреНрджреИ

MessageBus рд╕рдБрдЧ `->рдбрд┐рд╕реНрдкреНрдпрд╛рдЪ()` рд╡рд┐рдзрд┐ рдЫ рдЬрд╕рд▓реЗ HandlersLocator рдорд╛ рдЙрдкрдпреБрдХреНрдд рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рдЦреЛрдЬреНрдЫ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдБрдЫ, рд╕рдореНрдмрдиреНрдзрд┐рдд `SenderInterface` рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдмрд╕ (Redis рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВ) рдорд╛рд░реНрдлрдд рдкрдард╛рдЙрдБрдЫред

рдХрдиреНрдЯреЗрдирд░ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ (рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ php-di), рдпреЛ рд╕рдореНрдкреВрд░реНрдг рдмрдиреНрдбрд▓рд▓рд╛рдИ рдпрд╕рд░реА рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ:

        CONTAINER_REDIS_TRANSPORT_SECRET => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_TRANSPORT_LOG => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_STREAM_RECEIVER_SECRET => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_RECEIVER_LOG => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_BUS => function (ContainerInterface $c) {
            $sendersLocator = new SendersLocator([
                AppMessagesSecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET],
                AppMessagesDaemonLogMessage::class => [CONTAINER_REDIS_TRANSPORT_LOG],
            ], $c);
            $middleware[] = new SendMessageMiddleware($sendersLocator);

            return new MessageBus($middleware);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_SECRET => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'secret',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_LOG => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'log',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },

рдпрд╣рд╛рдБ рддрдкрд╛рдИрдВрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдХрд┐ SenderLocator рдорд╛ рд╣рд╛рдореАрд▓реЗ рджреБрдИ рдлрд░рдХ рд╕рдиреНрджреЗрд╢рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рднрд┐рдиреНрди "рдЯреНрд░рд╛рдиреНрд╕рдкреЛрд░реНрдЯрд╣рд░реВ" рддреЛрдХреЗрдХрд╛ рдЫреМрдВ, рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╕реНрдЯреНрд░рд┐рдорд╣рд░реВрдорд╛ рдЖрдлреНрдиреИ рдЬрдбрд╛рди рдЫред

рдореИрд▓реЗ рдПрдЙрдЯрд╛ рдЫреБрдЯреНрдЯреИ рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдХреЛ рдЫреБ рдЬрд╕рдорд╛ рдирд┐рдореНрди рдмрд╕ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдХрдЕрд░реНрдХрд╛рд╕рдБрдЧ рд╕рдЮреНрдЪрд╛рд░ рдЧрд░реНрдиреЗ рддреАрдирд╡рдЯрд╛ рдбреЗрдордирд╣рд░реВрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджрдЫ: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

рддрд░ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рджреЗрдЦрд╛рдЙрдиреЗрдЫреБ рдХрд┐ рдЙрдкрднреЛрдХреНрддрд╛ рдХрд╕рд░реА рд╕рдВрд░рдЪрд┐рдд рд╣реБрди рд╕рдХреНрдЫ:

use AppMessagesDaemonLogMessage;
use SymfonyComponentMessengerHandlerHandlerDescriptor;
use SymfonyComponentMessengerHandlerHandlersLocator;
use SymfonyComponentMessengerMessageBus;
use SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
use SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
use SymfonyComponentMessengerTransportSenderSendersLocator;

require_once __DIR__ . '/../vendor/autoload.php';
/** @var PsrContainerContainerInterface $container */
$container = require_once('config/container.php');

$handlers = [
    DaemonLogMessage::class => [
        new HandlerDescriptor(
            function (DaemonLogMessage $m) {
                error_log('DaemonLogHandler: message handled: / ' . $m->getMessage());
            },
            ['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
        )
    ],
];
$middleware = [];
$middleware[] = new HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = new SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = new SendMessageMiddleware($sendersLocator);

$bus = new MessageBus($middleware);
$receivers = [
    CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = new SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();

рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдпреЛ рдкреВрд░реНрд╡рд╛рдзрд╛рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ

рдореЗрд░реЛ рдмреНрдпрд╛рдХрдПрдиреНрдбрдорд╛ рдмрд╕ рд▓рд╛рдЧреВ рдЧрд░рд┐рд╕рдХреЗрдкрдЫрд┐, рдореИрд▓реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪрд░рдгрд╣рд░реВрд▓рд╛рдИ рдкреБрд░рд╛рдиреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЖрджреЗрд╢рдмрд╛рдЯ рдЕрд▓рдЧ рдЧрд░реЗрдВ рд░ рдЫреБрдЯреНрдЯреИ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рдмрдирд╛рдП, рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрд▓реЗ рдЖрдлреНрдиреИ рдХрд╛рдо рдЧрд░реНрдЫред

рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдирдпрд╛рдБ рд╕рд╛рдЗрдЯ рдердкреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдпрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдереНрдпреЛ:

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рд░ рддреНрдпрд╕ рдкрдЫрд┐ рддреБрд░реБрдиреНрддреИ, рдорд▓рд╛рдИ рдирдпрд╛рдБ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдердкреНрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рднрдпреЛ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Rss рдирд┐рдХрд╛рд▓реНрдиреЗ рд░ рдкрд╛рд░реНрд╕ рдЧрд░реНрдиреЗред рдХрд┐рдирднрдиреЗ рдпрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдкрдирд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ RSS рд▓рд┐рдЩреНрдХ рдПрдХреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реНрдпрд╛рдиреНрдбрд▓рд░, рдЬрд╕реНрддреИ WebsiteIndexHistoryPersistor, "рд╕рд╛рдордЧреНрд░реА/Html рд╕рд╛рдордЧреНрд░реА" рд╕рдиреНрджреЗрд╢рдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреНрдЫ, рдпрд╕рд▓рд╛рдИ рдкреНрд░рд╢реЛрдзрди рдЧрд░реНрджрдЫ рд░ рдЗрдЪреНрдЫрд┐рдд рд╕рдиреНрджреЗрд╢рд▓рд╛рдИ рдпрд╕рдХреЛ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдорд╛ рдЕрдЧрд╛рдбрд┐ рд▓реИрдЬрд╛рдиреНрдЫред

PHP рдмреНрдпрд╛рдХрдЗрдиреНрдбрд▓рд╛рдИ Redis рд╕реНрдЯреНрд░рд┐рдо рдмрд╕рдорд╛ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрджреИ рд░ рдлреНрд░реЗрдорд╡рд░реНрдХ-рд╕реНрд╡рддрдиреНрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫрдиреМрдЯ рдЧрд░реНрджреИ

рдЕрдиреНрддрдорд╛, рд╣рд╛рдореАрд▓реЗ рдзреЗрд░реИ рдбреЗрдордирд╣рд░реВрд╕рдБрдЧ рд╕рдорд╛рдкреНрдд рдЧрд░реНрдпреМрдВ, рдЬрд╕рдордзреНрдпреЗ рдкреНрд░рддреНрдпреЗрдХрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдорд╛рддреНрд░ рдЬрдбрд╛рди рд░рд╛рдЦреНрдЫред рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА рдПрдХ рд░рд╛рдХреНрд╖рд╕ crawlers рд╕рдмреИ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ рдЬрд╕рд▓рд╛рдИ рд╕рд╛рдордЧреНрд░реАрдХреЛ рд▓рд╛рдЧрд┐ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдЬрд╛рди рдЖрд╡рд╢реНрдпрдХ рдЫ, рд░ рдбреЗрдорди рдирд┐рд░рдиреНрддрд░рддрд╛ рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдЬрдбрд╛рди рд░рд╛рдЦреНрдЫред

рдЕрдм, рдбрд╛рдЯрд╛рдмреЗрд╕рдмрд╛рдЯ рдЪрдпрди рдЧрд░реНрдиреБрдХреЛ рд╕рдЯреНрдЯрд╛, рдкрд░реНрд╕рд┐рд╕реНрдЯрд░рджреНрд╡рд╛рд░рд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдЧрд░реЗрдкрдЫрд┐ рдЖрд╡рд╢реНрдпрдХ рдЖрдЗрдбреАрд╣рд░реВ рдмрд╕ рдорд╛рд░реНрдлрдд рд╕рдмреИ рдЗрдЪреНрдЫреБрдХ рд╣реНрдпрд╛рдиреНрдбрд▓рд░рд╣рд░реВрд▓рд╛рдИ рдкрдард╛рдЗрдиреНрдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди