{"id":412131,"date":"2024-06-29T22:22:16","date_gmt":"2024-06-29T22:22:16","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=412131"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=412131","title":{"rendered":"<span>\u0417\u0430\u043c\u0435\u0442\u043a\u0438 KPHP: \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/span>"},"content":{"rendered":"<div><!--[--><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/www.facebook.com\/tr?id=981564558927545&amp;ev=Habr\" style=\"display:none;\" width=\"1\"><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 &#171;\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c KPHP \u0432 open source?&#187;<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/527420\/\">KPHP<\/a>, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044f \u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/vkcom.github.io\/kphp\/\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/getcomposer.org\/\">composer<\/a> \u0441 KPHP<\/li>\n<li>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c unit-\u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f KPHP<\/li>\n<li>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433 KPHP-\u043a\u043e\u0434\u0430 (\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437)<\/li>\n<li>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/li>\n<\/ul>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"predislovie\">\u041f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c KPHP \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0445 &#171;\u0431\u043e\u0435\u0432\u044b\u0445&#187; \u0437\u0430\u0434\u0430\u0447 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u041f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438 \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043c\u0430\u043b\u043e, \u043e\u0441\u0432\u0430\u0438\u0432\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0443\u043b\u0438\u043d\u0433\u0430 \u0441\u043b\u043e\u0436\u043d\u043e<\/li>\n<li>\u041e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e PHP-\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 KPHP \u0431\u0435\u0437 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0439<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u043e\u0432 \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043c\u0435\u043d\u0435\u0435 \u044f\u0440\u043a\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 KPHP \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 <a href=\"https:\/\/vk.com\">\u0412\u041a<\/a>: \u0432 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0438 \u0440\u0430\u043d\u0442\u0430\u0439\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0444\u0438\u0447\u0438, \u0430 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0439, \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<h2 id=\"podgotavlivaemsya-k-rabote\">\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435<\/h2>\n<p>  <\/p>\n<p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e <a href=\"https:\/\/vkcom.github.io\/kphp\/kphp-basics\/installation.html\">\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c KPHP<\/a>. <\/p>\n<p>  <\/p>\n<blockquote><p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0441\u0442\u0430\u0432\u0438\u0442\u044c KPHP \u0438\u0437 <a href=\"https:\/\/vkcom.github.io\/kphp\/kphp-basics\/installation.html#install-kphp-from-deb-packages\">deb-\u043f\u0430\u043a\u0435\u0442\u0430<\/a>. \u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u043d\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p><\/blockquote>\n<p>  <\/p>\n<pre><code class=\"bash\"># \u041a\u0430\u0447\u0430\u0435\u043c Docker-\u043e\u0431\u0440\u0430\u0437 $ docker pull vkcom\/kphp<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>~\/kphp-uuid<\/code>, \u0442\u043e \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043f\u0440\u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"># \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u043d\u0435\u043c\u0443 $ docker run -ti -v ~\/kphp-uuid\/:\/tmp\/kphp-uuid:rw -p 8080:8080 vkcom\/kphp<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>kphp<\/code>.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kphp --version kphp2cpp compiled at ...<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e \u0445\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/github.com\/vkcom\/ktest\">ktest<\/a> \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u042f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a <code>ktest<\/code> \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>~\/kphp-uuid<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0445\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0438\u0434, \u0447\u0442\u043e <code>kphp<\/code> \u0443 \u0432\u0430\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0445\u043e\u0442\u044f, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<h2 id=\"sozdayom-minimalnyy-proekt\">\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ mkdir kphp-uuid $ cd kphp-uuid<\/code><\/pre>\n<p>  <\/p>\n<p>\u041b\u044e\u0431\u043e\u0439 \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f <code>[K]PHP<\/code> \u043f\u0430\u043a\u0435\u0442 \u0445\u043e\u0447\u0435\u0442 \u0434\u0440\u0443\u0436\u0438\u0442\u044c \u0441 composer, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d <code>composer.json<\/code> \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0440\u043d\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"json\">{     \"name\": \"quasilyte\/kphp-uuid\",     \"description\": \"A simple UUID generation package for KPHP\",     \"type\": \"library\",     \"license\": \"MIT\",     \"autoload\": {         \"psr-4\": {\"Quasilyte\\\\KPHP\\\\Uuid\\\\\": \"src\/\"}     },     \"require\": {} }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>KPHP \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <code>autoload.files<\/code>. \u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 <code>autoload.psr-0<\/code> \u0438 <code>autoload.classmap<\/code> \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u044d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441, <a href=\"https:\/\/github.com\/VKCOM\/kphp\/issues\/49\">\u0434\u0430\u0439\u0442\u0435 \u043d\u0430\u043c \u0437\u043d\u0430\u0442\u044c<\/a>.<\/p><\/blockquote>\n<p>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043d\u0430\u0448 \u043f\u0430\u043a\u0435\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <a href=\"https:\/\/en.wikipedia.org\/wiki\/Universally_unique_identifier\">UUID<\/a>. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432 \u0444\u0430\u0439\u043b\u0435 <code>src\/UUID.php<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php  namespace Quasilyte\\KPHP\\Uuid;  class UUID {     \/\/ \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0430 \u043e\u0442\u0441\u044e\u0434\u0430:     \/\/ https:\/\/www.php.net\/manual\/en\/function.uniqid.php#94959     \/\/ \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0430\u043f\u0438\u0441\u0430\u043d Andrew Moore \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435     \/\/ \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043a\u0430\u043a \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430 \"\u0447\u0438\u0441\u0442\u043e\u043c PHP\".     public static function v4(): string {         return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',             \/\/ 32 bits for \"time_low\"             mt_rand(0, 0xffff), mt_rand(0, 0xffff),             \/\/ 16 bits for \"time_mid\"             mt_rand(0, 0xffff),             \/\/ 16 bits for \"time_hi_and_version\",             \/\/ four most significant bits holds version number 4             mt_rand(0, 0x0fff) | 0x4000,             \/\/ 16 bits, 8 bits for \"clk_seq_hi_res\",             \/\/ 8 bits for \"clk_seq_low\",             \/\/ two most significant bits holds zero and             \/\/ one for variant DCE1.1             mt_rand(0, 0x3fff) | 0x8000,             \/\/ 48 bits for \"node\"             mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)         );     } }<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p><strong>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong>: \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f UUIDv4 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445. \u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/p><\/blockquote>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/packagist.org\/packages\/quasilyte\/kphp-uuid\">\u0432\u044b\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 packagist<\/a>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 PHP\/KPHP \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445.<\/p>\n<p>  <\/p>\n<h2 id=\"ustanavlivaem-i-ispolzuem-kphp-uuid\">\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c kphp-uuid<\/h2>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c <code>kphp-uuid<\/code> \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430\u0448 hello world, \u043f\u0435\u0447\u0430\u0442\u0430\u044e\u0449\u0438\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 UUIDv4.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ mkdir kphp-helloworld $ cd kphp-helloworld  # \u041b\u0438\u0431\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c `composer init` $ echo '{}' > composer.json  $ composer require quasilyte\/kphp-uuid:dev-master<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0440\u043d\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u043d\u0430\u0448 <code>main.php<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php  require_once __DIR__ . '\/vendor\/autoload.php';  use Quasilyte\\KPHP\\Uuid\\UUID;  var_dump(UUID::v4());<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ kphp --composer-root=$(pwd) --mode=cli main.php<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>--composer-root<\/code> \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 composer-\u0440\u0435\u0436\u0438\u043c. \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li><code>--mode<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c; <code>cli<\/code> \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 <code>.\/kphp_out<\/code>.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 \u0441 \u0440\u0435\u0436\u0438\u043c\u043e\u043c <code>cli<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 <code>.\/kphp_out\/cli<\/code>. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0435\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/kphp_out\/cli string(36) \"9f21785c-01a5-44aa-bc72-5fe262c10ca6\"<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u044d\u0442\u043e\u0442 main \u0444\u0430\u0439\u043b \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 PHP-\u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ php -f main.php string(36) \"489ee573-5f1a-4b1f-8090-162029e0f428\"<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"phpunit--php\">PHPUnit + PHP<\/h2>\n<p>  <\/p>\n<p>\u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043a\u043e\u0434\u0443 \u0432 <code>kphp-uuid<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 KPHP, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u2014 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043a\u043e\u0434 \u043d\u0430 KPHP \u043b\u0435\u0433\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <code>php<\/code>, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0438\u0434\u0435\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 KPHP-\u043a\u043e\u0434\u0430 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/phpunit.de\/\">phpunit<\/a>. \u042d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u043d\u0451\u043c \u043c\u044b \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0451.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>tests<\/code>. \u0421\u043b\u0435\u0434\u0443\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0442\u043e\u043d\u0430, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f <code>UUID<\/code> \u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u0432<code>tests\/UUIDTest.php<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php  use PHPUnit\\Framework\\TestCase; use Quasilyte\\KPHP\\Uuid\\UUID;  class UUIDTest extends TestCase {     \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439     public function testUnique() {         $set = [];         $n = 10;         for ($i = 0; $i &lt; $n; $i++) {             $set[UUID::v4()] = true;         }         $this->assertSame(count($set), $n);     }      public function testLength() {         $this->assertSame(strlen(UUID::v4()), 36);     }      \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e UUID \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435     public function testValid() {         \/\/ Sanity test \u043d\u0430 \u0442\u043e \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 isValid \u043c\u043e\u0436\u0435\u0442         \/\/ \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0437\u0430\u0432\u0435\u0434\u043e\u043c\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435\/\u043f\u043b\u043e\u0445\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438          $example = 'f37ac10b-58cc-4372-a567-0e02b2c3d170';         $this->assertTrue(self::isValid($example));         $this->assertFalse(self::isValid('foo'));          \/\/ \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f         for ($i = 0; $i &lt; 100; $i++) {             $this->assertTrue(self::isValid(UUID::v4()));         }     }      private static function isValid(string $uuid): bool {         $w = '[0-9a-f]';         $pattern = \"\/^$w{8}-$w{4}-4$w{3}-[89ab]$w{3}-$w{12}$\/\";         return preg_match($pattern, $uuid) === 1;     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c \u0434\u043b\u044f \u043d\u0430\u0441 \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ phpunit --bootstrap vendor\/autoload.php tests  OK (3 tests, 104 assertions)<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u042f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 <code>UUIDTest<\/code> \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u0438\u043c\u0451\u043d. \u0415\u0441\u0442\u044c \u0438 <a href=\"https:\/\/stackoverflow.com\/questions\/12117254\/organizing-phpunit-tests-in-namespaces\">\u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b<\/a>, \u043d\u043e \u043d\u0435\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e.<\/p><\/blockquote>\n<p>\u041c\u044b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u0430\u0448 KPHP-\u043a\u043e\u0434 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 PHP-\u043a\u043e\u0434. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0432\u0435\u0434\u044c \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u043c KPHP:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u043d\u044c\u0448\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 PHP \u0438 KPHP<\/li>\n<li>\u0412\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430 CI \u0442\u043e, \u0447\u0442\u043e \u0432\u0430\u0448 \u043a\u043e\u0434 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f<\/li>\n<li>\u0421\u0430\u043c \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c\u0441\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u043c, \u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043e\u043d \u2014 \u043d\u0430\u0448 \u043b\u0443\u0447\u0448\u0438\u0439 \u0434\u0440\u0443\u0433<\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"vstrechayte---ktest\">\u0412\u0441\u0442\u0440\u0435\u0447\u0430\u0439\u0442\u0435 \u2014 ktest<\/h2>\n<p>  <\/p>\n<p><a href=\"https:\/\/github.com\/VKCOM\/ktest\">ktest<\/a> \u2014 \u044d\u0442\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 KPHP \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0435\u0451 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 composer:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ composer require --dev vkcom\/ktest-script<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 ktest \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest --help Usage:    .\/ktest COMMAND  Possible commands are:    phpunit         run phpunit tests using KPHP   benchstat       compute and compare statistics about benchmark results   bench           run benchmarks using KPHP   bench-php       run benchmarks using PHP   bench-vs-php    run benchmarks using both KPHP and PHP, compare results   env             print ktest-related env variables information  Run '.\/ktest COMMAND -h' to see more information about a command.<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"ktest-testiruem-kphp-vmeste-s-php\">ktest: \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c KPHP \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 PHP<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0448 \u043f\u0430\u043a\u0435\u0442 <code>kphp-uuid<\/code> \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 <a href=\"https:\/\/github.com\/vkcom\/kphpunit\">kphpunit<\/a>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ composer require --dev vkcom\/kphpunit:dev-master<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u042d\u0442\u043e\u0442 \u043f\u0430\u043a\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 ktest \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435 \u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 KPHP:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest phpunit tests  OK (3 tests, 104 assertions)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 ktest<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f (*)<\/li>\n<li>\u0417\u0430\u0442\u0435\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442-\u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/li>\n<li>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u043e\u0439 ktest<\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>(*) \u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c <code>PHPUnit\\Framework\\TestCase<\/code> -> <code>KPHPUnit\\Framework\\TestCase<\/code><br \/>  \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p><\/blockquote>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u0443 <code>ktest phpunit<\/code> \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 <code>phpunit<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"ktest-benchmarki-dlya-kphp\">ktest: \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0434\u043b\u044f KPHP<\/h2>\n<p>  <\/p>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>v4()<\/code>. \u0412 \u043d\u0435\u0439 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u0432 <code>mt_rand<\/code>. \u041f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"php\">public static function v4fast(): string {     return sprintf('%08x-%04x-%04x-%04x-%08x%04x',         mt_rand(0, 0xffffffff),         mt_rand(0, 0xffff),         mt_rand(0, 0x0fff) | 0x4000,         mt_rand(0, 0x3fff) | 0x8000,         mt_rand(0, 0xffffffff), mt_rand(0, 0xffff)     ); }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e. \u041d\u043e \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 \u043a\u043e\u0434?<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u0430 <code>ktest bench<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441.<\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438) \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043f\u043e\u0445\u043e\u0436\u0435\u043c \u043d\u0430 \u0442\u0435\u0441\u0442\u044b \u0441\u0442\u0438\u043b\u0435: \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0441\u043e\u0431\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u043c \u043c\u0435\u0442\u043e\u0434\u044b. \u0412 \u0441\u0432\u043e\u0451\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0443 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <code>benchmarks<\/code> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0444\u0430\u0439\u043b\u0430 <code>benchmarks\/BenchmarkUUID.php<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"php\">&lt;?php  use Quasilyte\\KPHP\\Uuid\\UUID;  class BenchmarkUUID {     public function benchmarkV4() {         return UUID::v4();     }      public function benchmarkV4Fast() {         return UUID::v4fast();     } }<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430<\/li>\n<li>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>Benchmark<\/code><\/li>\n<li>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430-\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0435\u0444\u0438\u043a\u0441 <code>benchmark<\/code><\/li>\n<li>\u0412\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b-\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043d\u0435\u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest bench .\/benchmarks\/BenchmarkUUID.php BenchmarkV4      72553   5507.0 ns\/op BenchmarkV4Fast  180310  4112.0 ns\/op<\/code><\/pre>\n<p>  <\/p>\n<blockquote><p>\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, <code>v4fast()<\/code> \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0447\u0435\u043c <code>v4()<\/code>, \u043d\u043e \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0434\u043d\u0435\u0435.<\/p><\/blockquote>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 (\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e) \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0434\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0438 <code>static<\/code> \u043f\u043e\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 (\u0432\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0430\u043c\u0438\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0446\u0438\u043a\u043b\u044b). \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u0435\u043b\u043f\u0435\u0440-\u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432, \u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u044d\u0442\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u0430 \u043d\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0435\u0442\u043e\u0434\u0430-\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0423\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0443\u043c\u0430<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<hr\/>\n<p>  <\/p>\n<p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u2014 \u044d\u0442\u043e \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430. \u041d\u043e \u044f \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043e\u0434\u0438\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043b\u0430\u0439\u0444\u0445\u0430\u043a.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f Intel \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c Turbo Boost.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u041b\u0438\u043d\u0443\u043a\u0441\u0430\u0445 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ echo \"1\" | sudo tee \/sys\/devices\/system\/cpu\/intel_pstate\/no_turbo<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0440\u0430\u0437\u0431\u0440\u043e\u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435, \u0447\u0435\u043c 3-5%, \u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043b\u0438\u0431\u043e \u0432 \u043f\u043b\u043e\u0445\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u043b\u0438\u0431\u043e \u0432 \u0441\u0430\u043c\u043e\u043c \u043a\u043e\u0434\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430. \u0416\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0442\u044c \u0440\u0430\u0437\u0431\u0440\u043e\u0441\u0430 \u0432 1-2%.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432, \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0431\u044b\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u044b \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0438 \u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u0435 (\u043b\u0438\u0431\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0438 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0436\u0435\u043b\u0435\u0437\u043e).<\/p>\n<p>  <\/p>\n<p><strong>\u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/strong>: \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a \u0434\u043b\u044f PHP \u0438 KPHP \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0447\u0438\u0441\u043b\u0430.<\/p>\n<p>  <\/p>\n<p><strong>\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e<\/strong>: \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f PHP\/KPHP \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0438\u0445 \u0441 \u0432\u0430\u0448\u0438\u043c\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<hr\/>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"pravilnaya-interpretaciya-rezultatov-benchmarkov\">\u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/h2>\n<p>  <\/p>\n<p><code>ktest bench<\/code> \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437, \u043f\u044b\u0442\u0430\u044f\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439 <code>N<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0434\u0430\u0436\u0435 \u044d\u0442\u043e \u043d\u0435 \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b \u0441 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c\u0438 \u0432 Go (<code>go test -bench<\/code>), \u0442\u043e \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0443\u0436\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u043b\u0438\u0441\u044c, \u043e \u0447\u0451\u043c \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0439\u0434\u0451\u0442 \u0440\u0435\u0447\u044c.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u0432\u044b\u044f\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043e\u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b <code>v4<\/code> \u0438 <code>v4fast<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u044d\u043c\u043f\u043b\u043e\u0432, <code>ktest bench<\/code> \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <code>count<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest bench -count 5 .\/benchmarks\/UUIDBenchmark.php | tee results.txt BenchmarkV4 48574   7408.0 ns\/op BenchmarkV4Fast 129920  5415.0 ns\/op BenchmarkV4 19351   7672.0 ns\/op BenchmarkV4Fast 136986  5367.0 ns\/op BenchmarkV4 24950   7799.0 ns\/op BenchmarkV4Fast 133315  5450.0 ns\/op BenchmarkV4 17505   7755.0 ns\/op BenchmarkV4Fast 137931  5408.0 ns\/op BenchmarkV4 27552   7801.0 ns\/op BenchmarkV4Fast 111049  5512.0 ns\/op<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 <a href=\"https:\/\/pkg.go.dev\/golang.org\/x\/perf\/cmd\/benchstat\">benchstat<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><code>benchstat<\/code> \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 ktest, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u043b\u0435\u0433\u043a\u043e \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u0431\u0440\u043e\u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest benchstat results.txt name    time\/op V4      7.54\u00b5s \u00b1 3% V4Fast  5.33\u00b5s \u00b1 2%<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0440\u043e\u0441 \u0432 <code>2-3%<\/code> \u2014 \u044d\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u0441 \u044d\u0442\u0438\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<\/p>\n<p>  <\/p>\n<p><code>benchstat<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c \u043d\u0430\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c <code>V4<\/code> \u0438 <code>V4Fast<\/code> \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043d\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f <code>V4Fast<\/code> \u043c\u044b \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, <code>new.txt<\/code><\/li>\n<li>\u0412\u0441\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043b\u044f <code>V4<\/code> \u043c\u044b \u043a\u043b\u0430\u0434\u0451\u043c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, <code>old.txt<\/code><\/li>\n<li>\u0412 <code>new.txt<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c <code>BenchmarkV4Fast<\/code> \u043d\u0430 <code>BenchmarkV4<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ grep 'V4Fast\\b' results.txt > new.txt $ grep 'V4\\b' results.txt > old.txt $ sed -i 's\/V4Fast\/V4\/g' new.txt<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0445\u043e\u0436\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b: <code>old.txt<\/code> \u0438 <code>new.txt<\/code>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0445 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest benchstat old.txt new.txt  name  old time\/op  new time\/op  delta V4    7.54\u00b5s \u00b1 3%  5.33\u00b5s \u00b1 2%  -29.27%  (p=0.008 n=5+5)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e <code>fast<\/code> \u0432\u0435\u0440\u0441\u0438\u044f (new) \u043d\u0430 <strong>29.27%<\/strong> \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u041d\u0438\u0437\u043a\u0438\u0439 <code>p=0.008<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c, \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>-count<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0432\u044b\u0448\u0435, \u0447\u0435\u043c 5. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 10. \u0427\u0435\u043c \u0431\u043e\u043b\u0435\u0435 &#171;\u0448\u0443\u043c\u043d\u044b\u0439&#187; \u0432\u0430\u0448 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a, \u0442\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u044d\u043c\u043f\u043b\u043e\u0432 \u0432\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0445\u043e\u0442\u0435\u0442\u044c\u0441\u044f.<\/p>\n<p>  <\/p>\n<p>\u042f \u0441\u0447\u0438\u0442\u0430\u044e \u043f\u0440\u0430\u0432\u0438\u043b\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u0442\u043e\u043d\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 <code>benchstat<\/code> \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e. \u042d\u0442\u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044e \u044f \u043f\u0435\u0440\u0435\u043d\u044f\u043b \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u043d\u0430\u0434 <a href=\"https:\/\/github.com\/golang\/go\">golang\/go<\/a>.<\/p>\n<p>  <\/p>\n<h2 id=\"zapusk-benchmarka-v-rezhime-php-vs-kphp\">\u0417\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 PHP vs KPHP<\/h2>\n<p>  <\/p>\n<p>ktest \u0443\u043c\u0435\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 PHP:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest bench-php .\/benchmarks\/UUIDBenchmark.php BenchmarkV4 3617        2057.0 ns\/op BenchmarkV4Fast 185288  850.0 ns\/op<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043e\u0434\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432 \u0444\u0430\u0439\u043b\u0438\u043a <code>php.txt<\/code>, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432 <code>kphp.txt<\/code>, \u0442\u043e \u0447\u0435\u0440\u0435\u0437 <code>benchstat<\/code> \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u043f\u043e\u0434\u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>bench-vs-php<\/code> \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0432\u0441\u0451 \u0437\u0430 \u043d\u0430\u0441:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ .\/vendor\/bin\/ktest bench-vs-php .\/benchmarks\/UUIDBenchmark.php name    PHP time\/op  KPHP time\/op  delta V4       1.14\u00b5s \u00b1 2%  7.54\u00b5s \u00b1 3%  +558.25%  (p=0.000 n=9+10) V4Fast   839ns \u00b1 1%   5359ns \u00b1 1%  +539.10%  (p=0.000 n=9+10)<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"nastraivaem-github-actions\">\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c GitHub Actions<\/h2>\n<p>  <\/p>\n<p>\u041e\u0431\u0449\u0438\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u043e\u0434\u0430 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 <code>phpunit<\/code><\/li>\n<li>\u0422\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>ktest phpunit<\/code><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 <a href=\"https:\/\/github.com\/features\/actions\">GitHub actions<\/a> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0432 PHP-only \u0440\u0435\u0436\u0438\u043c\u0435. \u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e KPHP \u0442\u0435\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 (\u0433\u0434\u0435 KPHP \u0442\u043e\u0447\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d).<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <code>Makefile<\/code> \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">.PHONY: ci-tests test php-test kphp-test  test:     @echo \"Run PHP tests\"     @make php-test     @echo \"Run KPHP tests\"     @make kphp-test     @echo \"Everything is OK\"  php-test:     @phpunit --bootstrap vendor\/autoload.php tests  kphp-test:     @ktest phpunit tests  ci-tests:     @curl -L -o phpunit.phar https:\/\/phar.phpunit.de\/phpunit.phar     @php phpunit.phar --bootstrap vendor\/autoload.php tests<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ make test <\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 GitHub Actions \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c <code>make ci-tests<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <code>.github\/workflows\/php.yml<\/code>:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">name: PHP on: [push, pull_request]  jobs:   build:     name: Build     runs-on: ubuntu-latest     steps:     - uses: actions\/checkout@v2     - uses: php-actions\/composer@v5     - name: Test       run: |         make ci-tests<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0443\u0448\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 Pull Request \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ut\/8b\/zl\/ut8bzl3ac9v0kna4ostvefit--4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ut\/8b\/zl\/ut8bzl3ac9v0kna4ostvefit--4.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c build status badge \u0432 \u0441\u0432\u043e\u0439 README:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">![Build Status](https:\/\/github.com\/$user\/$repo\/workflows\/PHP\/badge.svg)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <code>$user\/$repo<\/code> \u0431\u0443\u0434\u0435\u0442 <code>quasilyte\/kphp-uuid<\/code>.<\/p>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u0412\u0435\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 <code>kphp-uuid<\/code> \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Makefile \u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0442\u0443\u0442: <a href=\"https:\/\/github.com\/quasilyte\/kphp-uuid\">github.com\/quasilyte\/kphp-uuid<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/vkcom.github.io\/kphp\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f KPHP<\/a><\/li>\n<li>\u0410\u043d\u043e\u043d\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 KPHP \u0432 Open Source: <a href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/527420\/\">\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0441\u043d\u043e\u0432\u0430 \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 KPHP<\/a><\/li>\n<li>\u0417\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u043b\u0430\u0434\u0430 <a href=\"https:\/\/www.youtube.com\/watch?v=3vO2TAkq7zE\">KPHP \u0432\u043d\u0443\u0442\u0440\u0438 VK: \u0447\u0442\u043e \u0442\u0430\u043c \u0443 \u043d\u0430\u0441 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442<\/a><\/li>\n<li>\u0417\u0430\u043f\u0438\u0441\u044c \u0434\u043e\u043a\u043b\u0430\u0434\u0430 <a href=\"https:\/\/youtu.be\/nr1883za8tM?t=306\">PHP scripts -> Release binaries<\/a><\/li>\n<li>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 KPHP-\u0441\u043d\u0438\u043f\u043f\u0435\u0442\u044b \u0438 \u043e\u0431\u0451\u0440\u0442\u043a\u0438: <a href=\"https:\/\/github.com\/VKCOM\/kphp-snippets\">https:\/\/github.com\/VKCOM\/kphp-snippets<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/VKCOM\/kphp-polyfills\">KPHP-\u043f\u043e\u043b\u0438\u0444\u0438\u043b\u043b\u044b<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/572424\/\"> https:\/\/habr.com\/ru\/articles\/572424\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><img loading=\"lazy\" decoding=\"async\" height=\"1\" src=\"https:\/\/www.facebook.com\/tr?id=981564558927545&amp;ev=Habr\" style=\"display:none;\" width=\"1\"><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 &#171;\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c KPHP \u0432 open source?&#187;<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <a href=\"https:\/\/habr.com\/ru\/company\/vk\/blog\/527420\/\">KPHP<\/a>, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044f \u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0447\u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/vkcom.github.io\/kphp\/\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0435\u043c \u0432\u044b\u043f\u0443\u0441\u043a\u0435:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0411\u0430\u0437\u043e\u0432\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 <a href=\"https:\/\/getcomposer.org\/\">composer<\/a> \u0441 KPHP<\/li>\n<li>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c unit-\u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f KPHP<\/li>\n<li>\u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433 KPHP-\u043a\u043e\u0434\u0430 (\u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u044b \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437)<\/li>\n<li>\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432<\/li>\n<\/ul>\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-412131","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/412131","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=412131"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/412131\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=412131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=412131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=412131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}