{"id":206752,"date":"2013-12-20T12:11:03","date_gmt":"2013-12-20T08:11:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=206752"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=206752","title":{"rendered":"<span class=\"post_title\">\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0435\u0431-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0412 \u0434\u0430\u043b\u0435\u043a\u0438\u0435 \u0434\u0435\u0442\u0441\u043a\u0438\u0435 \u0433\u043e\u0434\u044b \u044f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043f\u044b\u0442 \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0433\u043e\u0440\u044c\u043a\u0438\u0439. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0443\u0431\u0438\u0432\u0430\u043b \u0431\u0430\u0437\u0443 \u0441\u0430\u0439\u0442\u0430 <a href=\"http:\/\/mathinfinity.net.ru\">MathInfinity<\/a>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0435\u0449\u0435 \u0432 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u043e\u0434\u044b.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u0448\u044c \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0435. \u042d\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  \u0418\u0434\u0435\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 Dropbox, Ubuntu One, \u042f\u043d\u0434\u0435\u043a\u0441 \u0414\u0438\u0441\u043a, \u0414\u0438\u0441\u043a Google \u0438 \u0434\u0440. \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u043b\u0430 \u043c\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0414\u0435\u0441\u044f\u0442\u043a\u0438 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u042f\u043d\u0434\u0435\u043a\u0441 \u0414\u0438\u0441\u043a.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041d\u0430 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438\u0434\u0435\u0438 \u044f \u043d\u0435 \u043f\u0440\u0435\u0442\u0435\u043d\u0434\u0443\u044e. \u0418, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043f\u043e\u0438\u0441\u043a\u0430 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435. \u0412\u0435\u0441\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043b\u0438\u0431\u043e \u0443\u0436\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043b\u0438\u0431\u043e \u0438\u043c\u0435\u043b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434. \u042f \u0436\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u044e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u043e\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u041d\u0435 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e API \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u0435\u043c \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044b. \u042d\u0442\u043e\u0433\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0437\u0430\u0434\u0430\u0447\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0441\u043f\u0430\u043b\u0430\u0441\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0443\u043d\u043a\u0442\u044b:<\/p>\n<ol>\n<li><a href=\"#ank1\">\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/a><\/li>\n<li><a href=\"#ank2\">\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 OAuth<\/a><\/li>\n<li><a href=\"#ank3\">\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a\u043e\u043c<\/a><\/li>\n<li><a href=\"#ank4\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a<\/a><\/li>\n<li><a href=\"#ank5\">\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u043a\u0440\u043e\u043d\u0443<\/a><\/li>\n<\/ol>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u0434\u0432\u0430 \u043f\u0443\u043d\u043a\u0442\u0430 \u2014 \u0434\u0435\u043b\u043e \u0442\u0435\u0445\u043d\u0438\u043a\u0438, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0445 \u0432 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. <\/p>\n<p>  \u042f \u0434\u0430\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Limb. \u0418 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0435\u0441 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434\u0443 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043a\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <br \/>   \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u0412\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u043c lmb \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 Limb.<br \/>  <a name=\"ank1\"><\/a>  <\/p>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442. \u0414\u0430\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0432 <a href=\"http:\/\/api.yandex.ru\/oauth\/doc\/dg\/tasks\/register-client.xml\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u042f\u043d\u0434\u0435\u043a\u0441\u0430<\/a>.<br \/>  \u041e\u0442 \u0432\u0430\u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u043e\u0440\u043c\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u0440\u0435\u0434\u0438 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0447\u0435\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0430\u0448\u0435\u0433\u043e \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0430\u043c \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0434\u0430\u043d\u044b id \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0418\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430. \u0423 \u043c\u0435\u043d\u044f \u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0437\u0430\u043d\u044f\u043b 3 \u043c\u0438\u043d\u0443\u0442\u044b.<br \/>  <a name=\"ank2\"><\/a>  <\/p>\n<h4>\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u042f\u043d\u0434\u0435\u043a\u0441\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 OAuth<\/h4>\n<p>  \u0414\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0438\u0441\u043a\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c OAuth \u0442\u043e\u043a\u0435\u043d. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0435 OAuth \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430. \u0422\u0443 \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0434\u0442\u0438 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c. \u0412 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c OAuth \u043f.4.3.2 \u0442\u043e\u043a\u0435\u043d \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u043c \u043b\u043e\u0433\u0438\u043d\u0430 \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u043e\u0442 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u042f\u043d\u0434\u0435\u043a\u0441\u0430 (\u0443\u0447\u0435\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439).<br \/>  \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">class YaAuth {   protected $token;   protected $error;   protected $create_time;   protected $ttl;   protected $app_id;   protected $conf;   protected $logger;      function __construct($conf,$logger)   {     $this-&gt;logger = $logger;     $this-&gt;app_id = $conf-&gt;get('oauth_app_id');     $this-&gt;clear();     $this-&gt;conf = $conf;   }    function getToken()   {     if($this-&gt;checkToken())       return $this-&gt;token;      $url = $this-&gt;conf-&gt;get('oauth_token_url');     $curl = lmbToolkit::instance()-&gt;getCurlRequest();          $curl-&gt;setOpt(CURLOPT_HEADER,0);     $curl-&gt;setOpt(CURLOPT_REFERER,$this-&gt;conf-&gt;get('oauth_referer_url'));     $curl-&gt;setOpt(CURLOPT_URL,$url);          $curl-&gt;setOpt(CURLOPT_CONNECTTIMEOUT,1);     $curl-&gt;setOpt(CURLOPT_FRESH_CONNECT,1);     $curl-&gt;setOpt(CURLOPT_RETURNTRANSFER,1);     $curl-&gt;setOpt(CURLOPT_FORBID_REUSE,1);     $curl-&gt;setOpt(CURLOPT_TIMEOUT,4);      $curl-&gt;setOpt(CURLOPT_SSL_VERIFYPEER,false);        $post = 'grant_type=password&client_id='.$this-&gt;conf-&gt;get('oauth_app_id').             '&client_secret='.$this-&gt;conf-&gt;get('oauth_app_secret').             '&username='.$this-&gt;conf-&gt;get('oauth_login').             '&password='.$this-&gt;conf-&gt;get('oauth_password');      $header = array(\/*'Host: oauth.yandex.ru',*\/                     'Content-type: application\/x-www-form-urlencoded',                     'Content-Length: '.strlen($post)                    );          $curl-&gt;setOpt(CURLOPT_HTTPHEADER,$header);      $json = $curl-&gt;open($post);      if(!$json)     {       $this-&gt;error = $curl-&gt;getError();       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }      $http_code = $curl-&gt;getRequestStatus();      if(($http_code!='200') && ($http_code!='400'))     {       $this-&gt;error = &quot;Request Status is &quot;.$http_code;       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }        $result = json_decode($json, true);      if (isset($result['error']) && ($result['error'] != ''))     {       $this-&gt;error = $result['error'];       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }      $this-&gt;token = $result['access_token'];     $this-&gt;ttl = (int)$result['expires_in'];      $this-&gt;create_time = (int)time();     return $this-&gt;token;   }     function clear()   {     $this-&gt;token = '';     $this-&gt;error = '';     $this-&gt;counter_id = '';     $this-&gt;create_time = 0;     $this-&gt;ttl = -1;   }          function checkToken()   {     if ($this-&gt;ttl &lt;= 0) return false;        if (time()&gt;($this-&gt;ttl+$this-&gt;create_time))     {       $this-&gt;error = 'token_outdated';       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }     return true;   }      function getError()   {     return $this-&gt;error;   }    } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u043d\u043e\u0441\u0438\u043c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439 get \u0438 set \u043c\u0435\u0442\u043e\u0434\u044b.<br \/>  \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430 \u0440\u0430\u0431\u043e\u0442\u044b. \u0415\u0433\u043e \u043a\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c.<br \/>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 getToken \u0438 checkToken. \u041f\u0435\u0440\u0432\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 cUrl \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430, \u0430 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b \u043b\u0438 \u0442\u043e\u043a\u0435\u043d.<br \/>  <a name=\"ank3\"><\/a>  <\/p>\n<h4>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a\u043e\u043c<\/h4>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430, \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u043e\u043c.<br \/>  \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0414\u043b\u044f \u043c\u043e\u0438\u0445 \u0446\u0435\u043b\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438:  <\/p>\n<ul>\n<li>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u043f\u043a\u0438<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a<\/li>\n<li>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0430<\/li>\n<li>\u0421\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0430<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445\u0441\u044f \u0432 \u043f\u0430\u043f\u043a\u0435<\/li>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0430 \u0438 \u0435\u0433\u043e \u0442\u0438\u043f<\/li>\n<\/ul>\n<p>  \u0412\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 cUrl. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u043a\u0435\u0442\u043e\u0432, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u0430 \u043a\u043e\u0434\u0430. \u0412\u0441\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u043e\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 WebDav. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 API \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043d\u0438\u0436\u0435:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441 \u0434\u0438\u0441\u043a\u043e\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">class YaDisk {    protected $auth;   protected $config;   protected $error;   protected $token;   protected $logger;   protected $url;      function __construct($token,$config,$logger)   {     $this-&gt;auth = $auth;     $this-&gt;config = $config;      $this-&gt;token = $token;     $this-&gt;logger = $logger;   }     function getCurl($server_dst)   {     $curl = lmbToolkit::instance()-&gt;getCurlRequest();     $curl-&gt;setOpt(CURLOPT_SSL_VERIFYPEER,false);     $curl-&gt;setOpt(CURLOPT_PORT,$this-&gt;config-&gt;get('disk_port'));     $curl-&gt;setOpt(CURLOPT_CONNECTTIMEOUT,2);     $curl-&gt;setOpt(CURLOPT_RETURNTRANSFER,1);     $curl-&gt;setOpt(CURLOPT_HEADER, 0);     $curl-&gt;setOpt(CURLOPT_HTTP_VERSION,CURL_HTTP_VERSION_1_1);     $uri = new lmbUri($this-&gt;config-&gt;get('disk_server_url'));     $uri = $uri-&gt;setPath($server_dst)-&gt;toString();     $curl-&gt;setOpt(CURLOPT_URL,$uri);     $header = array('Accept: *\/*',                     &quot;Authorization: OAuth {$this-&gt;token}&quot;                    );     $curl-&gt;setOpt(CURLOPT_HTTPHEADER,$header);     return $curl;   }    function getResult($curl, $codes = array())   {     if($curl-&gt;getError())     {       $this-&gt;error = $curl-&gt;getError();       echo $this-&gt;error;       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }      else     {       if (!in_array($curl-&gt;getRequestStatus(),$codes))       {         $this-&gt;error = 'Response http error:'.$curl-&gt;getRequestStatus();         $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);         return false;       }       else       {         return true;       }     }   }    function mkdir($server_dst)   {     $curl = $this-&gt;getCurl($server_dst);     $curl-&gt;setOpt(CURLOPT_CUSTOMREQUEST,&quot;MKCOL&quot;);     $response = $curl-&gt;open();     return $this-&gt;getResult($curl, array(201,405));\/\/405 \u0420\u0454\u0420\u0455\u0420\u0491 \u0420\u0454\u0420\u0455\u0420\u2022\u0420\u0406\u0421\u0402\u0420\u00b0\u0421\u2030\u0420\u00b0\u0420\u00b5\u0421\u201a\u0421\u0403\u0421\u040f \u0420\u00b5\u0421\u0403\u0420\u00bb\u0420\u0451 \u0420\u0457\u0420\u00b0\u0420\u0457\u0420\u0454\u0420\u00b0 \u0421\u0453\u0420\u00b6\u0420\u00b5 \u0420\u00b5\u0421\u0403\u0421\u201a\u0421\u040a \u0420\u0405\u0420\u00b0 \u0421\u0403\u0420\u00b5\u0421\u0402\u0420\u0406\u0420\u00b5\u0421\u0402\u0420\u00b5   }    function upload($local_src,$server_dst)   {     $local_file = fopen($local_src,&quot;r&quot;);     $curl = $this-&gt;getCurl($server_dst);     \/\/$curl-&gt;setOpt(CURLOPT_CUSTOMREQUEST,&quot;PUT&quot;);     $curl-&gt;setOpt(CURLOPT_PUT, 1);     $curl-&gt;setOpt(CURLOPT_INFILE,$local_file);     $curl-&gt;setOpt(CURLOPT_INFILESIZE, filesize($local_src));     $header = array('Accept: *\/*',                     &quot;Authorization: OAuth {$this-&gt;token}&quot;,                     'Expect: '                    );     $curl-&gt;setOpt(CURLOPT_HTTPHEADER,$header);     $response = $curl-&gt;open();     fclose($local_file);     return $this-&gt;getResult($curl, array(200,201,204));       }    function download($server_src,$local_dst)   {     $local_file = fopen($local_dst,&quot;w&quot;);     $curl = $this-&gt;getCurl($server_src);     $curl-&gt;setOpt(CURLOPT_HTTPGET, 1);     $curl-&gt;setOpt(CURLOPT_HEADER, 0);     $curl-&gt;setOpt(CURLOPT_FILE,$local_file);     $response = $curl-&gt;open();     fclose($local_file);     return $this-&gt;getResult($curl, array(200));       }    function rm($server_src)   {     $curl = $this-&gt;getCurl($server_src);     $curl-&gt;setOpt(CURLOPT_CUSTOMREQUEST,&quot;DELETE&quot;);     $response = $curl-&gt;open();     return $this-&gt;getResult($curl, array(200));       }        function ls($server_src)   {     $curl = $this-&gt;getCurl($server_src);     $curl-&gt;setOpt(CURLOPT_CUSTOMREQUEST,&quot;PROPFIND&quot;);     $header = array('Accept: *\/*',                     &quot;Authorization: OAuth {$this-&gt;token}&quot;,                     'Depth: 1',                    );     $curl-&gt;setOpt(CURLOPT_HTTPHEADER,$header);     $response = $curl-&gt;open();     if($this-&gt;getResult($curl, array(207)))     {       $xml = simplexml_load_string($response,&quot;SimpleXMLElement&quot; ,0,&quot;d&quot;,true);       $list = array();       foreach($xml as $item)       {         if(isset($item-&gt;propstat-&gt;prop-&gt;resourcetype-&gt;collection))           $type = 'd';         else           $type = 'f';         $list[]=array('href'=&gt;(string)$item-&gt;href,'type'=&gt;$type);       }       return $list;      }     return false;       }    \/\/Ugly.    function exists($server_src)   {      $path = dirname($server_src);     $list = $this-&gt;ls($path);     if($list === false)     {       $this-&gt;error = '\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432';       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }     foreach($list as $item)       if(rtrim($item['href'],'\/')==rtrim($server_src,'\/'))         return true;     return false;   }    \/\/Ugly.   function is_file($server_src)   {      $path = dirname($server_src);     $list = $this-&gt;ls($path);     if($list === false)     {       $this-&gt;error = '\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432';       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }     foreach($list as $item)       if( (rtrim($item['href'],'\/')==rtrim($server_src,'\/') ) && ($item['type']=='f') )         return true;     return false;   }    \/\/Ugly.    function is_dir($server_src)   {      $path = dirname($server_src);     $list = $this-&gt;ls($path);     if($list === false)     {       $this-&gt;error = '\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432';       $this-&gt;logger-&gt;log('','ERROR', $this-&gt;error);       return false;     }     foreach($list as $item)       if( (rtrim($item['href'],'\/')==rtrim($server_src,'\/') ) && ($item['type']=='d') )         return true;     return false;   } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 mkdir, upload, download, ls, rm, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0438\u0445 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c. \u0412\u0441\u0435 \u0441\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e cUrl. \u041a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043a\u0435\u043d, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435.<br \/>  \u0414\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043e\u0442\u0432\u0435\u0442\u0430, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u043b\u043e \u043b\u0435\u043d\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c, \u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0439 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0412 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043b\u043e\u0433.<br \/>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 is_dir, is_file, exists \u0443\u0436\u0430\u0441\u043d\u0430, \u043d\u043e \u044f \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0430\u043f\u043a\u0430\u043c\u0438 \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u0435 10 \u0444\u0430\u0439\u043b\u043e\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043c\u0435\u0442\u043e\u0434\u0430 ls.<br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432 \u043c\u043e\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u043c. \u041f\u0443\u0441\u0442\u044c \u043e\u043d \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0449\u0435\u0440\u0431\u043d\u044b\u0439, \u043d\u043e \u0432\u0441\u0435 \u0436\u0435 \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442.<br \/>  <a name=\"ank4\"><\/a>  <\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u043a\u043e\u043f\u0438\u0438 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a<\/h4>\n<p>  \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:  <\/p>\n<ol>\n<li>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0441 \u042f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0430 \u043b\u0438\u0448\u043d\u0438\u0435 \u0431\u044d\u043a\u0430\u043f\u044b. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0441\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0431\u043e\u043b\u0435\u0435 n \u0431\u044d\u043a\u0430\u043f\u043e\u0432, \u0442\u043e \u0441\u0442\u0430\u0440\u044b\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c., \u0447\u0438\u0441\u043b\u043e n \u0431\u0435\u0440\u0435\u043c \u0438\u0437 \u043a\u043e\u043d\u0444\u0438\u0433\u0430.<\/li>\n<li>\u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0430\u043c\u043f \u0431\u0430\u0437\u044b Mysql. \u0412 \u043c\u043e\u0435\u043c \u043a\u043e\u0434\u0435 \u044d\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b mysqldump.<\/li>\n<li>\u0412 \u044d\u0442\u0443 \u0436\u0435 \u043f\u0430\u043f\u043a\u0443 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0434\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c.<\/li>\n<li>\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u0430\u043c\u0438.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0432 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441 \u0414\u0438\u0441\u043a<\/li>\n<li>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/li>\n<\/ol>\n<p>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0432\u0430\u0440\u0438\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u0422\u0443\u0442 \u043f\u043e\u043b\u0435\u0442 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438 \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d. \u041c\u043d\u0435 \u0436\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430.<br \/>  \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0435\u0433\u043e \u043d\u0430 \u0434\u0438\u0441\u043a<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">class YaBackup {   protected $disk;   protected $db;   protected $logger;   protected $backup_number;      function __construct($backupconfig)   {     $config = lmbToolkit::instance()-&gt;getConf('yandex');     $this-&gt;logger = YaLogger::instance();              $auth = new YaAuth($config,$this-&gt;logger);     $token = $auth-&gt;getToken();     if($token == '') throw Exception('\u041d\u0435 \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d');     $this-&gt;disk = new YaDisk($token,$config,$this-&gt;logger);      $this-&gt;db = $backupconfig-&gt;get('db');     $this-&gt;folders = $backupconfig-&gt;get('folders');     $this-&gt;tmp_dir = $backupconfig-&gt;get('tmp_dir');     $this-&gt;project = $backupconfig-&gt;get('project');     $this-&gt;backup_number = $backupconfig-&gt;get('stored_backups_number');     $this-&gt;server_dir = $backupconfig-&gt;get('dir');          $time = time();     $this-&gt;archive = date(&quot;Y-m-d&quot;,$time).'-'.$time;   }    function execute()   {     $this-&gt;logger-&gt;log(&quot;\u041d\u0430\u0447\u0430\u0442 \u0431\u0435\u043a\u0430\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 &quot;.$this-&gt;project,&quot;START_PROJECT&quot;);     $this-&gt;_clean();     $this-&gt;logger-&gt;log(&quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u043a\u043e\u043f\u0438\u0439&quot;);     $this-&gt;_deleteOld();     $this-&gt;logger-&gt;log(&quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0430\u043c\u043f\u0430 \u0431\u0430\u0437\u044b&quot;);     $this-&gt;_makeDump();     $this-&gt;logger-&gt;log(&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432&quot;);      $this-&gt;_copyFolders();     $this-&gt;logger-&gt;log(&quot;\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u0430&quot;);      $this-&gt;_createArchive();     $this-&gt;logger-&gt;log(&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a&quot;);     $this-&gt;_upload();     $this-&gt;logger-&gt;log(&quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432&quot;);      $this-&gt;_clean();     $this-&gt;logger-&gt;log(&quot;\u0411\u0435\u043a\u0430\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 &quot;.$this-&gt;project.&quot; \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d&quot;, &quot;END_PROJECT&quot;);   }    protected function _clean()   {      lmbFs::rm($this-&gt;getProjectDir());   }    protected function _deleteOld()   {     $list = $this-&gt;disk-&gt;ls($this-&gt;server_dir.'\/'.$this-&gt;project);     $paths=array();     $n=0;     foreach($list as $item)     {       \/\/\u0418\u043c\u0435\u043d\u0430 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u0432\u0438\u0434 Y-m-d-timestamp.tar.gz. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c timestamp.       $parts = explode('-',basename(rtrim($item['href'],'\/')));       if(isset($parts[3]) && ($item['type']=='f'))       {          $tm = explode('.',$parts[3]);         $paths[(integer)$tm[0]] = $item['href'];         $n++;       }     }     ksort($paths);\/\/\u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u043e \u043a\u043b\u044e\u0447\u0430\u043c \u043e\u0442 \u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u043a \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443     for($i=$n;$i&gt;$this-&gt;backup_number-1;$i--)     {       $item = array_shift($paths);       $this-&gt;logger-&gt;log(&quot;\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 &quot;.$item);       $this-&gt;disk-&gt;rm($item);      }       }    protected function _upload()   {     $archive = $this-&gt;archive.'.tar.gz';          \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 \u044f\u043d\u0434\u0435\u043a\u0441 \u0434\u0438\u0441\u043a\u0435      $this-&gt;logger-&gt;log(&quot;\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0438 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a\u0435&quot;);      $this-&gt;disk-&gt;mkdir($this-&gt;server_dir);     $res = $this-&gt;disk-&gt;mkdir($this-&gt;server_dir.'\/'.$this-&gt;project);     \/\/\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0430\u0440\u0445\u0438\u0432         $this-&gt;logger-&gt;log(&quot;\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0430\u0440\u0445\u0438\u0432 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a&quot;);      $this-&gt;disk-&gt;upload($this-&gt;getProjectDir().'\/'.$archive,$this-&gt;server_dir.'\/'.$this-&gt;project.'\/'.$archive);          if($res)        $this-&gt;logger-&gt;log(&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e&quot;);      else       $this-&gt;logger-&gt;log(&quot;\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0438\u0441\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439&quot;);    }    protected function getProjectDir()   {     return $this-&gt;tmp_dir.'\/'.$this-&gt;project;   }    protected function _copyFolders()   {     lmbFs:: mkdir($this-&gt;getProjectDir() . '\/folders');      $folders = $this-&gt;folders;      foreach($folders as $key =&gt; $value)     {       lmbFs:: mkdir($this-&gt;getProjectDir() . '\/folders\/' . $key);       lmbFs:: cp($value, $this-&gt;getProjectDir() . '\/folders\/' . $key);     }   }    protected function _createArchive()   {     $archive = $this-&gt;archive;     $dir = $this-&gt;getProjectDir();     \/\/\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 system     `cd $dir && find . -type f -exec tar rvf &quot;$archive.tar&quot; '{}' \\;`;       `cd $dir && gzip $archive.tar`;   }      protected function _makeDump()   {     $host = $this-&gt;db['host'];     $user = $this-&gt;db['user'];     $password = $this-&gt;db['password'];     $database = $this-&gt;db['database'];     $charset = $this-&gt;db['charset'];      lmbFs:: mkdir($this-&gt;getProjectDir() . '\/base');     $sql_schema = $this-&gt;getProjectDir() . '\/base\/schema.mysql';     $sql_data = $this-&gt;getProjectDir() . '\/base\/data.mysql';          \/\/\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0430\u043c\u043f     $this-&gt;mysql_dump_schema($host, $user, $password, $database, $charset, $sql_schema);     $this-&gt;mysql_dump_data($host, $user, $password, $database, $charset, $sql_data);   }      \/\/\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043b\u0443\u0447\u0448\u0435 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b   protected function mysql_dump_schema($host, $user, $password, $database, $charset, $file, $tables = array())   {     $password = ($password)? '-p' . $password : '';     $cmd = &quot;mysqldump -u$user $password -h$host &quot; .            &quot;-d --default-character-set=$charset &quot; .            &quot;--quote-names --allow-keywords --add-drop-table &quot; .            &quot;--set-charset --result-file=$file &quot; .            &quot;$database &quot; . implode('', $tables);           $this-&gt;logger-&gt;log(&quot;\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043c\u043f \u0431\u0430\u0437\u044b \u0432 '$file' file...&quot;);      system($cmd, $ret);      if(!$ret)       $this-&gt;logger-&gt;log(&quot;\u0414\u0430\u043c\u043f \u0431\u0430\u0437\u044b \u0441\u043e\u0437\u0434\u0430\u043d (&quot; . filesize($file) . &quot; bytes)&quot;);     else       $this-&gt;logger-&gt;log(&quot;\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0430\u043c\u043f\u0430 \u0431\u0430\u0437\u044b&quot;);;   }    protected function mysql_dump_data($host, $user, $password, $database, $charset, $file, $tables = array())   {     $password = ($password)? '-p' . $password : '';     $cmd = &quot;mysqldump -u$user $password -h$host &quot; .            &quot;-t --default-character-set=$charset &quot; .            &quot;--add-drop-table --create-options --quick &quot; .            &quot;--allow-keywords --max_allowed_packet=16M --quote-names &quot; .            &quot;--complete-insert --set-charset --result-file=$file &quot; .            &quot;$database &quot; . implode('', $tables);       $this-&gt;logger-&gt;log(&quot;\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043c\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 '$file' file...&quot;);      system($cmd, $ret);      if(!$ret)       $this-&gt;logger-&gt;log(&quot;\u0414\u0430\u043c\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0437\u0434\u0430\u043d! (&quot; . filesize($file) . &quot; bytes)&quot;);     else      $this-&gt;logger-&gt;log(&quot;\u041e\u0448\u0438\u0431\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0434\u0430\u043c\u043f\u0430 \u0431\u0430\u0437\u044b&quot;);;   }    } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u0438\u0447\u0435\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0435 \u0441\u0442\u0430\u043b. \u0414\u0443\u043c\u0430\u044e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u0430\u043c \u0441\u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0443\u0431\u0440\u0430\u0442\u044c \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 execute<br \/>  <a name=\"ank5\"><\/a>  <\/p>\n<h4>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u043a\u0440\u043e\u043d\u0443<\/h4>\n<p>  \u0422\u0430\u043a \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043a\u0440\u043e\u043d\u0430 \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u0432 \u0432\u0438\u0434\u0435 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">CronJob<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">abstract class CronJob {   abstract function run(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0442\u0443\u0442 \u0438\u0437\u043b\u0438\u0448\u043d\u0438.<br \/>  \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043b\u0430\u0441\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044e<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">class YaBackupJob extends CronJob {   protected $conf;   protected $conf_name = 'adevelop';      function __construct()   {     $this-&gt;conf = lmbToolkit::instance()-&gt;getConf($this-&gt;conf_name);   }      function run()   {     $backup = new YaBackup($this-&gt;conf);     $backup-&gt;execute();   }    } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043a\u0430\u043a \u0438 \u0432\u0435\u0437\u0434\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0438\u0437 Limb. \u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c, \u043d\u043e \u044d\u0442\u043e \u043a\u043e\u043c\u0443 \u043a\u0430\u043a \u0443\u0434\u043e\u0431\u043d\u043e.<br \/>  \u041e\u0441\u0442\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0421\u0430\u043c\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 cron_runner.php. \u041a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 \u0441\u043b\u0435\u0434\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u043e\u0441\u044c \u0434\u0432\u0443\u043c\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043b\u043e\u043a\u043e\u0432).  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">cron_runner.php<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">set_time_limit(0); require_once(dirname(__FILE__) . '\/..\/setup.php'); lmb_require('limb\/core\/src\/lmbBacktrace.class.php'); lmb_require('limb\/fs\/src\/lmbFs.class.php'); lmb_require('ya\/src\/YaLogger.class.php'); new lmbBacktrace; function write_error_in_log($errno, $errstr, $errfile, $errline) {   global $logger;   $back_trace = new lmbBacktrace(10, 10);   $error_str = &quot; error: $errstr\\nfile: $errfile\\nline: $errline\\nbacktrace:&quot;.$back_trace-&gt;toString();   $logger-&gt;log($error_str,&quot;ERROR&quot;,$errno); }  set_error_handler('write_error_in_log'); error_reporting(E_ALL); ini_set('display_errors', true);  if($argc &lt; 2)   die('Usage: php cron_runner.php cron_job_file_path(starting from include_file_path)' . PHP_EOL);  $cron_job_file_path = $argv[1]; $logger = YaLogger::instance();  $lock_dir = LIMB_VAR_DIR . '\/cron_job_lock\/'; if(!file_exists($lock_dir))   lmbFs :: mkdir($lock_dir, 0777);  $name = array_shift(explode('.', basename($cron_job_file_path))); $lock_file = $lock_dir . $name; if(!file_exists($lock_file)) {   file_put_contents($lock_file, '');   chmod($lock_file, 0777); }  $fp = fopen($lock_file, 'w');  if(!flock($fp, LOCK_EX + LOCK_NB)) {   $logger-&gt;logConflict();   return; }  flock($fp, LOCK_EX + LOCK_NB);    try {     lmb_require($cron_job_file_path);     $job  = new $name;      if(!in_array('-ld', $argv))       $logger-&gt;log('',&quot;START&quot;);      ob_start();       echo $name . ' started' . PHP_EOL;       $result = $job-&gt;run();       $output = ob_get_contents();     ob_end_clean();      if(!in_array('-ld', $argv))       $logger-&gt;log($output,&quot;END&quot;,$result);   }   catch (lmbException $e)   {     $logger-&gt;logException($e-&gt;getNiceTraceAsString());     throw $e;   }  flock($fp, LOCK_UN); fclose($fp);  if(in_array('-v', $argv)) {   echo $output;   var_dump($logger-&gt;getRecords()); }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043a\u0440\u043e\u043d\u0442\u0430\u0431 \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430:  <\/p>\n<pre><code class=\"bash\">  php \/path\/to\/cron_runner.php ya\/src\/YaBackupJob.class.php <\/code><\/pre>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e include_path \u0434\u043e \u0444\u0430\u0439\u043b\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c. \u0418\u043c\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0411\u0443\u0434\u0443 \u0440\u0430\u0434, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0442 \u043a\u043e\u0434. \u0421\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u044b \u043d\u0438\u0436\u0435.<br \/>  \u041a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u0438\u0432\u043d\u0430\u044f \u043a\u0440\u0438\u0442\u0438\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442\u0441\u044f. \u0416\u0434\u0443 \u0432\u0430\u0448\u0438\u0445 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439 \u0438 \u043e\u0442\u0437\u044b\u0432\u043e\u0432.<\/p>\n<h4>\u0421\u0441\u044b\u043b\u043a\u0438 \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h4>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u0430 c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u0430 <a href=\"http:\/\/yadi.sk\/d\/SI7JZJ4YEcbZN\">\u0442\u0443\u0442<\/a> \u0438\u043b\u0438 <a href=\"http:\/\/a-develop.ru\/catalog\/product\/3\">\u0442\u0443\u0442<\/a><\/li>\n<li>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u042f\u043d\u0434\u0435\u043a\u0441 <a href=\"http:\/\/api.yandex.ru\/oauth\/doc\/dg\/concepts\/About.xml\">OAuth<\/a> \u0438 <a href=\"http:\/\/api.yandex.ru\/disk\/doc\/dg\/concepts\/about.xml\">\u0414\u0438\u0441\u043a<\/a><br \/>   <a href=\"http:\/\/tools.ietf.org\/html\/rfc6749\">\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 OAuth<\/a><br \/>   <a href=\"http:\/\/www.webdav.org\/specs\/rfc4918.html\">\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 WebDav<\/a><br \/>   <a href=\"https:\/\/github.com\/limb-php-framework\/limb\">\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Limb<\/a>  <\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/206752\/\"> http:\/\/habrahabr.ru\/post\/206752\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0412 \u0434\u0430\u043b\u0435\u043a\u0438\u0435 \u0434\u0435\u0442\u0441\u043a\u0438\u0435 \u0433\u043e\u0434\u044b \u044f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u043b \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u043e, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f, \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441 \u043e\u043f\u044b\u0442\u043e\u043c. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043e\u043f\u044b\u0442 \u0431\u044b\u0432\u0430\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0433\u043e\u0440\u044c\u043a\u0438\u0439. \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u0443\u0431\u0438\u0432\u0430\u043b \u0431\u0430\u0437\u0443 \u0441\u0430\u0439\u0442\u0430 <a href=\"http:\/\/mathinfinity.net.ru\">MathInfinity<\/a>, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0435\u0449\u0435 \u0432 \u0441\u0442\u0443\u0434\u0435\u043d\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u043e\u0434\u044b.<\/p>\n<p>  \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0441\u0435\u0431\u0435 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043b\u0438\u0448\u044c \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u044d\u043d\u0442\u0443\u0437\u0438\u0430\u0437\u043c\u0435. \u042d\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u043d\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u043c \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.<\/p>\n<p>  \u0418\u0434\u0435\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445 \u0432\u0440\u043e\u0434\u0435 Dropbox, Ubuntu One, \u042f\u043d\u0434\u0435\u043a\u0441 \u0414\u0438\u0441\u043a, \u0414\u0438\u0441\u043a Google \u0438 \u0434\u0440. \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u0440\u0438\u0442\u044f\u0433\u0438\u0432\u0430\u043b\u0430 \u043c\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0414\u0435\u0441\u044f\u0442\u043a\u0438 \u0433\u0438\u0433\u0430\u0431\u0430\u0439\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. <\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u043e\u043f\u043b\u043e\u0449\u0435\u043d\u0438\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u042f\u043d\u0434\u0435\u043a\u0441 \u0414\u0438\u0441\u043a.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-206752","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206752","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=206752"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/206752\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=206752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=206752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=206752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}