Redis рд╕реНрдЯреНрд░реАрдо рдмрд╕ рдореЗрдВ рдПрдХ PHP рдмреИрдХрдПрдВрдб рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЪреМрдЦрдЯреЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЪреБрдирдирд╛



рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


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

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


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

рдЗрд╕реЗ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: SQLite рдкреНрд▓реЗрдЯ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ URL рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдЬреЛ HTML рдореЗрдВ рд╕реНрдерд┐рд░ рд╕реВрдЪреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рд╕реВрдЪреА рдкрд░ рдПрдХ рд╕рд░рд▓ рдЦреЛрдЬ рдХреАред рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдЙрд░рд▓реЗ рдереЗ, рддрдм рдЦреЛрдЬ рд╕рд┐рд░реНрдл рдЙрдирдХреЗ рд▓рд┐рдП рдереАред

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

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


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбреЙрдХ рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдореЛрдВрдЧрдбреЙрдм рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░, рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореВрд▓реА рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдкрд╣рд▓реЗ рдХреЗрд╡рд▓ рдХреИрд╢рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдерд╛ред рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, PHP рдорд╛рдЗрдХреНрд░реЛрдлрд╝реНрд░реЗрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

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


рдирдИ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рдПрдХ рдХрдВрд╕реЛрд▓ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдирд┐рдореНрди рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ:

  • URL рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
  • рдПрдЪрдЯреАрдЯреАрдкреАрдПрд╕ рдЙрдкрд▓рдмреНрдз рдерд╛ рдпрд╛ рдирд╣реАрдВ
  • рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рд╕рд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддрд╛ рд╣реИ
  • рд╕реЛрд░реНрд╕ HTML рдФрд░ рд╣реЗрдбрд░реНрд╕ рдЗрдВрдбреЗрдХреНрд╕рд┐рдВрдЧ рд╣рд┐рд╕реНрдЯреНрд░реА рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ
  • рд╕рд╛рдордЧреНрд░реА, рд╢реАрд░реНрд╖рдХ рдФрд░ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреА рд╣реИ
  • рдПрдХ рдЕрд▓рдЧ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдмрдЪрд╛рддрд╛ рд╣реИред

рдпрд╣ рдХреЗрд╡рд▓ рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛:



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

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

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


рдХрддрд╛рд░реЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ рдФрд░ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдПрдВред рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдореИрдВ рд░реЗрдбрд┐рд╕ рд╕реНрдЯреНрд░реАрдо рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

PHP рдореЗрдВ Redis рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рддреАрди рджрд┐рдЧреНрдЧрдЬреЛрдВ рд╕рд┐рдореНрдлрдиреА, рд▓рд╛рд░рд╡реЗрд▓, рд╡рд╛рдИрдЖрдИрдЖрдИ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдореИрдВ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛ (рдкрд╣рд▓реА рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ), рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧрдВрднреАрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд╕рдм рдХреБрдЫ рдЬреЛ рдХрддрд╛рд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд╡рд╣ рдпрд╛ рддреЛ рдкрд╛рдВрдЪ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреЗ 3 рдЖрд╡рд╛рдЧрдорди рдХрд╛ рдПрдХ рдкреНрд░рдХреНрд╖реЗрдкрдг рд╣реИ, рдпрд╛ рдПрдХ рдврд╛рдВрдЪреЗ рд╕реЗ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИред

рдореИрдВрдиреЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рдореНрдлрдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ, рдФрд░ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рд▓рд╛рд░рд╡реЗрд▓ рд╕реЗ рднреА, рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдУрдЖрд░рдПрдо, рдмрд┐рдирд╛ рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗред

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


рдкрд╣рд▓рд╛ рдЙрдореНрдореАрджрд╡рд╛рд░ рддреБрд░рдВрдд рдЖрджрд░реНрд╢ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрджреЗрд╣ рдХреЗ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рдореНрдлрдиреА рдХреЗ рдмрд╛рд╣рд░ рдЙрдкрдпреЛрдЧ рдХреЗ Google рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдард┐рди рдерд╛ред рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдХреЗ рд╕рд╛рде рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдвреЗрд░ рд╕реЗ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ, рдХреБрдЫ рднреА рдирд╛рдо рдирд╣реАрдВ, рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд░реЗрдбрд┐рд╕ рдкрд░ рднреА?



рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдХрд╛рдлреА рд╡рд┐рд╕реНрддреГрдд рдерд╛, рд▓реЗрдХрд┐рди рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рд┐рдореНрдлрдиреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдкрд╕рдВрджреАрджрд╛ YML рдФрд░ рдЧреИрд░-рд╕рд┐рдореНрдлреЛрдирд┐рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдЬрд╛рджреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рдереА, рдЦрд╛рд╕рдХрд░ рдирдП рд╕рд╛рд▓ рдХреА рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рдиред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд░реВрдк рд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред

рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдХрд┐ рд╕рд┐рдореНрдлрдиреА рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдХреИрд╕реЗ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рднреА рддрдВрдЧ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ:



рдЗрд╕рдореЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕реЗ рдШреВрд░рдирд╛ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛, рдореИрдВ рдЗрд╕ рдирддреАрдЬреЗ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдореИрдВ рдХреБрдЫ рддрд░рд╣ рдХреА рдмреИрд╕рд╛рдЦреА рдХрд░ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рд░реЛрд╢рди / рдХрддрд╛рд░


рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд╛рд░рд╛рд╡реЗрд▓ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рд╕реЗ рдХрд╕рдХрд░ рдЬреБрдбрд╝реА рд╣реБрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдмрд╣реБрдд рд╕рдордп рдирд╣реАрдВ рдмрд┐рддрд╛рдпрд╛: рд╕реНрдерд╛рдкрд┐рдд, рджреЗрдЦрд╛, рдирд┐рд░реНрднрд░рддрд╛ рджреЗрдЦреА рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

yiisoft / yii2-queue


рдЦреИрд░, рдпрд╣рд╛рдБ рдпрд╣ рддреБрд░рдВрдд рдирд╛рдо рд╕реЗ рдорд╛рди рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рд╕реЗ Yii2 рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрдЧ рдмрдВрдзрдиред рдореБрдЭреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ рдФрд░ рдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ Yii2 рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

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


рдЧрд┐рддреБрдм рдкрд░ рдореБрдЭреЗ рдЬреЛ рдХреБрдЫ рднреА рдорд┐рд▓рд╛ рд╡рд╣ рд╕рдм рдХреБрдЫ рдмрд┐рдирд╛ рддрд╛рд░ рдХреЗ, рдХрд╛рдВрдЯреЗ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдорд╛рдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдкреБрд░рд╛рдирд╛ рдФрд░ рдкрд░рд┐рддреНрдпрдХреНрдд рдЕрдиреБрдорд╛рди рдерд╛ред

рд╕рд┐рдореНрдлрдиреА / рдореИрд╕реЗрдВрдЬрд░, рддрдХрдиреАрдХреА рд╡рд┐рд╡рд░рдг рдкрд░ рд▓реМрдЯреЗрдВ


рдореБрдЭреЗ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдерд╛ рдФрд░ рдХреБрдЫ рдФрд░ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рд╕рд░рд▓ рд╣реИред рдмрд╕ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдХрдИ рдЯрд╛рдпрд░ рдереЗред



рдмрд╕ рдХреБрдЫ рдХрджрдо:

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

рдореИрд╕реЗрдЬрдмрд╕ рдореЗрдВ `-> рдкреНрд░реЗрд╖рдг ()` рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рд╣реИрдВрдбрд▓рд░рд▓реЛрдХреЗрдЯрд░ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВрдбрд▓рд░ рдХреА рдЦреЛрдЬ рдХрд░рддреА рд╣реИ рдФрд░ рдмрд╕ (рд░реЗрдбрд┐рд╕ рд╕реНрдЯреНрд░реАрдо) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд 'рд╕реЗрдВрдбрд░рдЗрдВрдЯрд░рдлреЗрд╕' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЙрдиреНрд╣реЗрдВ рд╕рдВрджреЗрд╢ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

рдХрдВрдЯреЗрдирд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 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([ \App\Messages\SecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET], \App\Messages\DaemonLogMessage::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); }, 

рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ SendersLocator рдореЗрдВ рд╣рдордиреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ "рдкрд░рд┐рд╡рд╣рди" рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдЕрдкрдирд╛ рд╕рдВрдмрдВрдз рд╣реИред

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

рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 use App\Messages\DaemonLogMessage; use Symfony\Component\Messenger\Handler\HandlerDescriptor; use Symfony\Component\Messenger\Handler\HandlersLocator; use Symfony\Component\Messenger\MessageBus; use Symfony\Component\Messenger\Middleware\HandleMessageMiddleware; use Symfony\Component\Messenger\Middleware\SendMessageMiddleware; use Symfony\Component\Messenger\Transport\Sender\SendersLocator; require_once __DIR__ . '/../vendor/autoload.php'; /** @var \Psr\Container\ContainerInterface $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 \Symfony\Component\Messenger\Worker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER)); $w->run(); 

рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


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

рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдПрдХ рдирдИ рд╕рд╛рдЗрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:



рдФрд░ рдареАрдХ рдЗрд╕рдХреЗ рдмрд╛рдж рдореЗрд░реЗ рд▓рд┐рдП рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░реБрдкрдпреЗ рдирд┐рдХрд╛рд▓рдирд╛ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ред рдХреНрдпреЛрдВрдХрд┐ рдЪреВрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реНрд░реЛрдд рд╕рд╛рдордЧреНрд░реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП rss рд▓рд┐рдВрдХ рдХреЗ рд╣реИрдВрдбрд▓рд░-рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде WebsiteIndexHistoryPersistor, "рд╕рд╛рдордЧреНрд░реА / HtmlContent" рд╕рдВрджреЗрд╢ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрджреЗрд╢ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред



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

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

Source: https://habr.com/ru/post/hi483584/


All Articles