PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА: рдЬрдм Xdebug рдХреА рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ

PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА: рдЬрдм Xdebug рдХреА рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ


рдбреАрдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП PHP рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдХреНрд╕рд░ Xdebug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, IDE рдФрд░ Xdebug рдХреА рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рд╣рдореЗрд╢рд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВред рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ Xdebug рдкреНрд░реЙрдХреНрд╕реА - pydbgpproxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рд╕рднреА рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ amphp рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдврд╛рдВрдЪреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред


рдХрдЯ рдХреЗ рддрд╣рдд, рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ pydbgpproxy рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ, рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ред рдореИрдВ рдпрд╣ рднреА рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдПред


Pydbgpproxy рдмрдирд╛рдо PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА


Xdebug рдкреНрд░реЙрдХреНрд╕реА, IDE рдФрд░ Xdebug (Xdebug рд╕реЗ IDE рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕реЗрд╡рд╛) рд╣реИред рдмрд╣реБрдзрд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдЙрджреНрджреЗрд╢реАрдп рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдФрд░ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВред


рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ pydbgpproxy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ:


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

GitHub рдФрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ PHP рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреА рдЦреЛрдЬ рдХреЗ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдорд┐рд▓реЗред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рд▓рд┐рдЦрд╛ред рд╣реБрдб рдХреЗ рддрд╣рдд, рдореИрдВрдиреЗ рдПрдореНрдлрд╝реАрдк рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред


Pydbgpproxy рдкрд░ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдореБрдЦреНрдп рд▓рд╛рдн:


  • PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:
    • рдЗрд╕рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ;
    • рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ;
  • PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ:
    • рдЖрдк рдХрд╛рдВрдЯрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
    • рдЖрдк рдПрдХ рд▓рд╛рдкрддрд╛ рд╕реБрд╡рд┐рдзрд╛ рдпрд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдкреБрд▓ рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред

PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ


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


PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рджреЗрд╡рддрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


composer.phar require mougrim/php-xdebug-proxy --dev 

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рдПрдХ рд╣реА рд╕рдВрдЧреАрддрдХрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 composer.phar create-project mougrim/php-xdebug-proxy cd php-xdebug-proxy 

PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХреНрд╕рдПрдордПрд▓ рдФрд░ рдПрдореНрдлрд╝рдкреА / рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрдб -рдбреЛрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (PHP рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИ):


 composer.phar require amphp/log '^1.0.0' 

рд▓рд╛рдВрдЪ


PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА


рдкреНрд░реЙрдХреНрд╕реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ:


 bin/xdebug-proxy 

рдкреНрд░реЙрдХреНрд╕реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдЧрд╛:


 Using config path /path/to/php-xdebug-proxy/config [2019-02-14 10:46:24] xdebug-proxy.NOTICE: Use default ide: 127.0.0.1:9000 array ( ) array ( ) [2019-02-14 10:46:24] xdebug-proxy.NOTICE: Use predefined ides array ( 'predefinedIdeList' => array ( 'idekey' => '127.0.0.1:9000', ), ) array ( ) [2019-02-14 10:46:24] xdebug-proxy.NOTICE: [Proxy][IdeRegistration] Listening for new connections on '127.0.0.1:9001'... array ( ) array ( ) [2019-02-14 10:46:24] xdebug-proxy.NOTICE: [Proxy][Xdebug] Listening for new connections on '127.0.0.1:9002'... array ( ) array ( ) 

рд▓реЙрдЧ рд╕реЗ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░реЙрдХреНрд╕реА:


  • рдЖрдИрдбреАрдИ рд▓реЙрдЧрд┐рди рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 127.0.0.1:9001 рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИ;
  • Xdebug рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП 127.0.0.1:9002 рд▓рд┐рдП рд╕реБрдирддрд╛ рд╣реИ;
  • рдбрд┐рдлрд╝реЙрд▓реНрдЯ IDE рдФрд░ idekey рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд IDE рдХреЗ рд░реВрдк рдореЗрдВ 127.0.0.1:9000 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдиреНрдпрд╛рд╕


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


 cp -r /path/to/php-xdebug-proxy/config /your/custom/path 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рддреАрди рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ:


  • config.php :
     <?php return [ 'xdebugServer' => [ // host:port    Xdebug 'listen' => '127.0.0.1:9002', ], 'ideServer' => [ //  proxy    IDE,     IDE  , //    IDE  ,     . // IDE   ,  proxy    . 'defaultIde' => '127.0.0.1:9000', //  IDE    'idekey' => 'host:port', //   IDE  ,     . //  IDE ,   proxy  , //           proxy. 'predefinedIdeList' => [ 'idekey' => '127.0.0.1:9000', ], ], 'ideRegistrationServer' => [ // host:port     IDE, //     IDE,     . 'listen' => '127.0.0.1:9001', ], ]; 
  • logger.php : рдЖрдк logger.php рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ \Psr\Log\LoggerInterface рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ \Amp\Log\StreamHandler рд╕рд╛рде \Amp\Log\StreamHandler \Monolog\Logger (рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП), \Amp\Log\StreamHandler рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ;
  • factory.php : рдЖрдк рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ; рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ Factory\Factory рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ Factory\DefaultFactory ред

рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдФрд░ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 bin/xdebug-proxy --configs=/your/custom/path/config 

рдбрд┐рдмрдЧрд┐рдВрдЧ


Xdebug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХрдИ рд▓реЗрдЦ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ред


[xdebug] рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ [xdebug] рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдпрджрд┐ рд╡реЗ рдорд╛рдирдХ рд▓реЛрдЧреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реИрдВ рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдХрд░реЗрдВ):


  • idekey = рд╡рд┐рдЪрд╛рд░рдзрд╛рд░рд╛
  • Remote_host = 127.0.0.1
  • рд░рд┐рдореЛрдЯ_рдкреЛрд░реНрдЯ = 9002
  • Remote_enable = рдкрд░
  • Remote_autostart = рдкрд░
  • Remote_connect_back = рдмрдВрдж

рддрдм рдЖрдк рдбреАрдмрдЧ рдХрд┐рдП рдЧрдП PHP рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:


 php /path/to/your/script.php 

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


рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░реЙрдХреНрд╕реА рд╕реБрд╡рд┐рдзрд╛рдПрдБ


рд╕рдм рдХреБрдЫ рд╣реИ рдХрд┐ рд╣рдо рдКрдкрд░ рдХреА рдЬрд╛рдВрдЪ рдХреА, pydbgpproxy рднреА рдПрдХ рдбрд┐рдЧреНрд░реА рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реИред


рдЕрдм рдЖрдЗрдП PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдлрд╝реИрдХреНрдЯрд░реА рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред factory.php рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди, рдКрдкрд░ рджреЗрдЦреЗрдВ)ред Factory\Factory рдХреЛ Factory\Factory рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рдмрд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рддрдерд╛рдХрдерд┐рдд рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рд╡реЗ Xdebug рд╕реЗ IDE рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрд╡реЗрд░реА Factory\DefaultFactory::createRequestPreparers() рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ Factory\DefaultFactory::createRequestPreparers() рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ рдЬреЛ RequestPreparer\RequestPreparer рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред XEebug рд╕реЗ IDE рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рдХреНрд░рдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЬрдм IDE рд╕реЗ Xdebug рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЙрд▓рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдХреНрд╡реЗрд░реА рд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓реЛрдВ (рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ) рдХреЗ рдкрде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдПред


рдбреАрдмрдЧ рдлрд╝рд╛рдЗрд▓ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░реЗрдВ


рдПрдХ рддреИрдпрд╛рд░реА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░реВрдВрдЧрд╛ред рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рд╣рдо рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ ( GitHub ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╢реАрддрд▓-рдордХреНрд╕ рдЖрдкрдХреЛ рдХрд╛рд░реНрдпреЛрдВ, рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐рдпреЛрдВ, рд╕реНрдерд┐рд░рд╛рдВрдХ рдЖрджрд┐ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд░рдирдХрд┐рдЯ рдФрд░ рдпреЛрдкреНрдЬрд╝ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрд╣ рдордХреНрдЦреА рдкрд░ PHP рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, AspectMock рдЕрднреА рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рд▓реЗрдХрд┐рди Xdebug рдФрд░ IDE рдХреА рдорд╛рдирдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдкреБрди: рд▓рд┐рдЦрд┐рдд (рдЕрд▓рдЧ рдкрде рд╣реЛрдиреЗ) рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред


рдЖрдЗрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдирд░рдо-рдирдХрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЛ рд▓реЗрдВ рдЬрд╣рд╛рдВ PHP рдХреЛрдб рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


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


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ xdebug_break() рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рдЕрдм рд╕реНрдерд┐рддрд┐ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдиреЗрдВ: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░рд┐рдореЛрдЯ рдорд╢реАрди рдкрд░ рдЪрд▓рддрд╛ рд╣реИред


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


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


AspectMock рдбрд┐рдмрдЧ рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдорд┐рд▓рд╛:


 public function init(array $options = []) { if (!isset($options['excludePaths'])) { $options['excludePaths'] = []; } $options['debug'] = true; $options['excludePaths'][] = __DIR__; parent::init($options); } 

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


рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдХреЗ рд╕рд╛рде Xdebug рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


Xdebug + рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕


рдЕрдм рдЬрдм рд╕рдорд╕реНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдореБрдЦреНрдп рднрд╛рдЧ RequestPreparer\SoftMocksRequestPreparer ред


рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВ (рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдкрде рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ):


 public function __construct(LoggerInterface $logger, string $initScript = '') { $this->logger = $logger; if (!$initScript) { $possibleInitScriptPaths = [ // proxy   , soft-mocks тАФ    __DIR__.'/../../vendor/badoo/soft-mocks/src/init_with_composer.php', // proxy  soft-mocks    __DIR__.'/../../../../badoo/soft-mocks/src/init_with_composer.php', ]; foreach ($possibleInitScriptPaths as $possiblInitScriptPath) { if (file_exists($possiblInitScriptPath)) { $initScript = $possiblInitScriptPath; break; } } } if (!$initScript) { throw new Error("Can't find soft-mocks init script"); } //  soft-mocks (       ..) require $initScript; } 

Xdebug + soft-mocks: Xdebug рд╕реЗ IDE рддрдХ


XEebug рд╕реЗ IDE рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрде рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:


 public function prepareRequestToIde(XmlDocument $xmlRequest, string $rawRequest): void { $context = [ 'request' => $rawRequest, ]; $root = $xmlRequest->getRoot(); if (!$root) { return; } foreach ($root->getChildren() as $child) { //         : // - 'stack': https://xdebug.org/docs-dbgp.php#stack-get // - 'xdebug:message': https://xdebug.org/docs-dbgp.php#error-notification if (!in_array($child->getName(), ['stack', 'xdebug:message'], true)) { continue; } $attributes = $child->getAttributes(); if (isset($attributes['filename'])) { //         ,      $filename = $this->getOriginalFilePath($attributes['filename'], $context); if ($attributes['filename'] !== $filename) { $this->logger->info("Change '{$attributes['filename']}' to '{$filename}'", $context); $child->addAttribute('filename', $filename); } } } } 

Xdebug + soft-mocks: IDE рд╕реЗ Xdebug рддрдХ


IDE рд╕реЗ Xdebug рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 public function prepareRequestToXdebug(string $request, CommandToXdebugParser $commandToXdebugParser): string { //       [$command, $arguments] = $commandToXdebugParser->parseCommand($request); $context = [ 'request' => $request, 'arguments' => $arguments, ]; if ($command === 'breakpoint_set') { //    -f,          // . https://xdebug.org/docs-dbgp.php#id3 if (isset($arguments['-f'])) { $file = $this->getRewrittenFilePath($arguments['-f'], $context); if ($file) { $this->logger->info("Change '{$arguments['-f']}' to '{$file}'", $context); $arguments['-f'] = $file; //    $request = $commandToXdebugParser->buildCommand($command, $arguments); } } else { $this->logger->error("Command {$command} is without argument '-f'", $context); } } return $request; } 

рдХрд╛рдо Factory\DefaultFactory рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА Factory\DefaultFactory рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╛ рддреЛ рдЗрд╕реЗ Factory\DefaultFactory рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдпрд╛ Factory\Factory рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рд╕реЙрдлреНрдЯ- Factory\SoftMocksFactory рд▓рд┐рдП, Factory\SoftMocksFactory рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 class SoftMocksFactory extends DefaultFactory { public function createConfig(array $config): Config { //       return new SoftMocksConfig($config); } public function createRequestPreparers(LoggerInterface $logger, Config $config): array { $requestPreparers = parent::createRequestPreparers($logger, $config); return array_merge($requestPreparers, [$this->createSoftMocksRequestPreparer($logger, $config)]); } public function createSoftMocksRequestPreparer(LoggerInterface $logger, SoftMocksConfig $config): SoftMocksRequestPreparer { //     init-   return new SoftMocksRequestPreparer($logger, $config->getSoftMocks()->getInitScript()); } } 

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд░реНрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдЗрдирд┐рдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧ \ рд╕реЙрдлреНрдЯрдореЙрдХреНрд╕рдХреЙрдиреНрдлрд╝ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ рд╣реА рд░рд╣ рдЧрдпрд╛: рдПрдХ рдирдпрд╛ рдХрд╛рд░рдЦрд╛рдирд╛ рдмрдирд╛рдиреЗ рдФрд░ рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдЗрдирд┐рдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдкрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕реЗ softMocksConfig рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрдкреАрдЖрдИ


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рд╣реБрдб рдХреЗ рддрд╣рдд рдПрдореНрдкреАрдкреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ I / O рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред Apmphp рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдореЗрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЧреИрд░-рдЕрд╡рд░реБрджреНрдз рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред


рдирд┐рд╖реНрдХрд░реНрд╖


PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдЕрднреА рднреА рдПрдХ рдХрд╛рдлреА рдпреБрд╡рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди Badoo рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЙрдлреНрдЯ-рдореЛрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА:


  • рдмрд╣реБ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдореЗрдВ pydbgpproxy рдХреА рдЬрдЧрд╣;
  • рдирд░рдо-рдирдХрд▓реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;
  • рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
    • рдЖрдк IDE рдФрд░ Xdebug рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ;
    • рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: рдбрд┐рдмрдЧ рдореЛрдб рдореЗрдВ, рдХрдо рд╕реЗ рдХрдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕рдВрджрд░реНрдн рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрдм рдбрд┐рдмрдЧрд┐рдВрдЧ (рдЪрд░ рдХреЗ рдорд╛рди рдФрд░ рдХреЛрдб рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд░реЗрдЦрд╛)ред

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


рдпрджрд┐ рдЖрдк pydbgpproxy рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп Xdebug рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ PHP Xdebug рдкреНрд░реЙрдХреНрд╕реА рдЖрдЬрд╝рдорд╛рдПрдВ, рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдВ, рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред рдЪрд▓реЛ рдПрдХ рд╕рд╛рде рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕! :)


PS рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА Yevgeny рдордЦрд░реЛрд╡ рдЙрд░реНрдл ez рдХреЛ рдкреНрд░реЙрдХреНрд╕реА smdbgpproxy рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж !


рдлрд┐рд░ рд╕реЗ рд▓рд┐рдВрдХ



рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!


рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред


рд░рд┐рдирдЯ рдЕрдЦрдорджреЗрд╡, рд╕реАрдирд┐рдпрд░ PHP рдбреЗрд╡рд▓рдкрд░


UPD : рд▓реЗрдЦ рдХрд╛ рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЕрдиреБрд╡рд╛рджред

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


All Articles