Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

Kauwehe

ʻO kaʻu pūnaewele, kahi aʻu e holo nei ma ke ʻano he leʻaleʻa, ua hoʻolālā ʻia e hoʻokipa i nā ʻaoʻao home hoihoi a me nā pūnaewele pilikino. Ua hoʻomaka kēia kumuhana i ka hoihoi iaʻu i ka hoʻomaka ʻana o kaʻu huakaʻi hoʻolālā; i kēlā manawa ua hauʻoli wau i ka ʻike ʻana i nā loea maikaʻi e kākau e pili ana iā lākou iho, kā lākou mau leʻaleʻa a me nā papahana. ʻO ka maʻamau o ka ʻike ʻana iā lākou noʻu iho ke mau nei a hiki i kēia lā: ma kahi kokoke i kēlā me kēia kahua pāʻoihana a ʻaʻole kūʻai nui loa, ke hoʻomau nei au i ka nānā ʻana i ka footer e ʻimi i nā loulou i nā mea kākau.

Ka hoʻokō ʻana i ka manaʻo

ʻO ka mana mua he ʻaoʻao html wale nō ma kaʻu pūnaewele pilikino, kahi aʻu e kau ai i nā loulou me nā pūlima i loko o kahi papa inoa ul. Ma hope o ka paʻi ʻana i nā ʻaoʻao 20 i kekahi manawa, hoʻomaka wau e noʻonoʻo ʻaʻole maikaʻi loa kēia a ua hoʻoholo wau e hoʻāʻo e hoʻokaʻawale i ke kaʻina hana. Ma ka stackoverflow, ʻike au he nui ka poʻe i hōʻike i nā pūnaewele i kā lākou profiles, no laila ua kākau wau i kahi parser ma php, e hele wale ana i nā profiles, e hoʻomaka ana me ka mua (nā ʻōlelo ma SO a hiki i kēia lā e like me kēia: `/users/1` ), unuhi i nā loulou mai ka inoa i makemake ʻia a hoʻohui ʻia i SQLite.

Hiki ke kapa ʻia kēia ʻo ka ʻaoʻao ʻelua: kahi hōʻiliʻili o nā ʻumi kaukani URL ma kahi papa SQLite, kahi i pani ai i ka papa inoa static ma HTML. Ua hana au i kahi hulina maʻalahi ma kēia papa inoa. No ka mea he mau URL wale nō, a laila ua hoʻokumu wale ʻia ka huli ʻana ma luna o lākou.

I kēia manawa ua haʻalele au i ka papahana a hoʻi hou i laila ma hope o ka manawa lōʻihi. I kēia manawa, ua ʻoi aku koʻu ʻike hana ma mua o ʻekolu mau makahiki a ua manaʻo wau hiki iaʻu ke hana i kahi mea koʻikoʻi. Eia kekahi, ua nui ka makemake e haku i nā ʻenehana hou.

Manaʻo hou

ʻO ka papahana i hoʻonoho ʻia ma Docker, ua hoʻoili ʻia ka waihona i mongoDb, a i kēia manawa, ua hoʻohui ʻia ka radish, ʻo ia ka mea ma mua no ka caching. Hoʻohana ʻia kekahi o nā microframeworks PHP ma ke ʻano he kumu.

pilikia

Hoʻohui ʻia nā pūnaewele hou e kahi kauoha console e hana like me kēia:

  • Hoʻoiho ma ka URL
  • Hoʻonohonoho i ka hae e hōʻike ana inā loaʻa iā HTTPS
  • E mālama i ke ʻano o ka pūnaewele
  • Mālama ʻia ke kumu HTML a me nā poʻo i ka mōʻaukala "indexing".
  • Hoʻopau i ka ʻike, unuhi i ke poʻo inoa a me ka wehewehe
  • Mālama i ka ʻikepili i kahi hōʻiliʻili ʻokoʻa

Ua lawa kēia no ka mālama ʻana i nā pūnaewele a hōʻike iā lākou i kahi papa inoa:

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

Akā ʻo ka manaʻo o ka hoʻopaʻa inoa ʻana, hoʻokaʻawale a hoʻonohonoho i nā mea āpau, mālama i nā mea āpau i kēia lā, ʻaʻole i kūpono i kēia paradigm. ʻO ka hoʻohui wale ʻana i kahi ala pūnaewele e hoʻohui i nā ʻaoʻao i koi ʻia ke kope kope a me ka pale ʻana e pale aku ai i ka DDoS.

Ma ka laulā, ʻoiaʻiʻo, hiki ke hana like nā mea āpau, a ma ke ʻano pūnaewele hiki iā ʻoe ke mālama i ka URL i hiki ai i ka daemon monstrous ke hana i nā hana āpau no nā URL mai ka papa inoa. Eia nō naʻe, ma ʻaneʻi ka huaʻōlelo "queue" e hōʻike iā ia iho. A inā hoʻokō ʻia kahi pila, a laila hiki ke hoʻokaʻawale ʻia nā hana āpau a hana ʻia ma ka liʻiliʻi loa.

olelo hooholo

E hoʻokō i nā queues a hana i kahi ʻōnaehana hoʻokele hanana no ka hana ʻana i nā hana āpau. A ua makemake wau e hoʻāʻo i nā kahawai Redis no ka manawa lōʻihi.

Ke hoʻohana nei i nā kahawai Redis ma PHP

No ka mea No ka mea, ʻaʻole koʻu hoʻolālā kekahi o nā nunui ʻekolu ʻo Symfony, Laravel, Yii, makemake wau e ʻimi i kahi waihona kūʻokoʻa. Akā, e like me ka mea i ʻike ʻia (ma ka hoʻokolokolo mua), ʻaʻole hiki ke ʻike i nā hale waihona puke koʻikoʻi. ʻO nā mea a pau e pili ana i nā queues he papahana ia mai 3 i hana i ʻelima mau makahiki i hala, a i ʻole i hoʻopaʻa ʻia i ka framework.

Ua lohe nui au e pili ana iā Symfony ma ke ʻano he mea hoʻolako i nā mea pono ponoʻī, a ua hoʻohana wau i kekahi o lākou. A hiki ke hoʻohana ʻia kekahi mau mea mai Laravel, no ka laʻana i kā lākou ORM, me ka ʻole o ke ʻano o ka framework ponoʻī.

symfony/ʻelele

Ua kūpono koke ka moho mua a me ke kānalua ʻole ua hoʻokomo wau. Akā ua lilo ia i mea paʻakikī loa i nā google examples o ka hoʻohana ʻana ma waho o Symfony. Pehea e hōʻuluʻulu ai mai kahi pūʻulu o nā papa me nā inoa āpau, ʻaʻohe manaʻo, kahi kaʻa no ka hoʻouna ʻana i nā leka, a ma Redis paha?

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

ʻO nā palapala ma ka pūnaewele kūlana he kikoʻī loa, akā ua wehewehe ʻia ka hoʻomaka ʻana no Symfony me ka hoʻohana ʻana i kā lākou YML punahele a me nā ʻano hana kilokilo ʻē aʻe no ka non-symphonist. ʻAʻohe oʻu hoihoi i ke kaʻina hana ponoʻī, ʻoi aku hoʻi i ka wā hoʻomaha makahiki hou. Akā, pono wau e hana i kēia no ka manawa lōʻihi i manaʻo ʻole ʻia.

ʻO ka hoʻāʻo ʻana e noʻonoʻo pehea e hoʻomaka koke ai i kahi ʻōnaehana me ka hoʻohana ʻana i nā kumu Symfony ʻaʻole ia he hana koʻikoʻi loa no kahi manawa paʻa.

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

Ma hope o ka noʻonoʻo ʻana i kēia mau mea āpau a hoʻāʻo e hana i kekahi mea me koʻu mau lima, ua hiki iaʻu i ka hopena e hana ana au i kekahi ʻano koʻokoʻo a hoʻoholo e hoʻāʻo i kahi mea ʻē aʻe.

i hoʻomālamalama ʻia/queue

Ua hoʻololi ʻia ua paʻa paʻa kēia waihona i ka ʻenehana Laravel a me kahi pūʻulu o nā mea hilinaʻi ʻē aʻe, no laila ʻaʻole wau i hoʻolilo nui i ka manawa ma luna: ua hoʻokomo wau, nānā iā ia, ʻike i nā hilinaʻi a holoi ʻia.

yiisoft/yii2-queue

ʻAe, eia ua manaʻo koke ʻia mai ka inoa, hou, kahi pili paʻa iā Yii2. Pono wau e hoʻohana i kēia waihona a ʻaʻole maikaʻi, akā ʻaʻole wau i noʻonoʻo e pili ana i ka hilinaʻi piha iā Yii2.

O ke koena

ʻO nā mea ʻē aʻe a pau aʻu i ʻike ai ma GitHub, ʻaʻole hiki ke hilinaʻi ʻia, nā hana kahiko a haʻalele ʻole ʻia me nā hōkū ʻole, nā mākia a me ka nui o nā hana.

E hoʻi i ka symfony/messenger, nā kikoʻī loea

Pono wau e noʻonoʻo i kēia waihona a, ma hope o ka hoʻolilo ʻana i kekahi manawa hou, ua hiki iaʻu. Ua ʻike ʻia ua maʻalahi a maʻalahi nā mea a pau. No ka hoʻomaka koke ʻana i ke kaʻa, hana wau i kahi hale hana liʻiliʻi, no ka mea... Ua manaʻo ʻia e loaʻa iaʻu nā huila he nui a me nā mea lawelawe like ʻole.

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

He mau ʻanuʻu wale nō:

  • Hoʻokumu mākou i nā mea lawe memo i hiki ke kāhea wale ʻia
  • Hoʻopili mākou iā lākou i HandlerDescriptor (papa mai ka hale waihona puke)
  • Hoʻopili mākou i kēia mau "Descriptors" i kahi hana HandlersLocator
  • Hoʻohui ʻia ʻo HandlersLocator i ka laʻana MessageBus
  • Hāʻawi mākou i kahi pūʻulu o 'SenderInterface' i SendersLocator, i koʻu hihia o nā papa 'RedisTransport', i hoʻonohonoho ʻia ma kahi ala maopopo.
  • Hoʻohui i ka SendersLocator i ka laʻana MessageBus

Loaʻa iā MessageBus kahi ala `-> dispatch ()` e nānā i nā mea lawelawe kūpono i ka HandlersLocator a hāʻawi i ka leka iā lākou, me ka hoʻohana ʻana i ka 'SenderInterface' pili e hoʻouna ma o ke kaʻa (Redis streams).

Ma ka hoʻonohonoho pahu (ma kēia hihia php-di), hiki ke hoʻonohonoho ʻia kēia pūʻulu holoʻokoʻa e like me kēia:

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

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

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

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

Maʻaneʻi hiki iāʻoe keʻike i loko o SendersLocator ua hāʻawi mākou i nā "transports" likeʻole no nā leka likeʻoleʻelua, i kēlā me kēia me kona pilina pono'ī i nā kahawai pili.

Ua hana au i kahi papahana demo kaʻawale e hōʻike ana i kahi noi o ʻekolu daemons e kamaʻilio pū ana me kekahi me ka hoʻohana ʻana i kēia kaʻa: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Akā e hōʻike wau iā ʻoe pehea e hoʻonohonoho ʻia ai kahi mea kūʻai:

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

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

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

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

Ke hoʻohana nei i kēia ʻōnaehana i kahi noi

Ma hope o ka hoʻokō ʻana i ke kaʻa ma koʻu hope, ua hoʻokaʻawale wau i nā pae hoʻokahi mai ke kauoha synchronous kahiko a hana i nā mea lawelawe ʻokoʻa, hana kēlā me kēia i kā lākou mea ponoʻī.

ʻO ka pipeline no ka hoʻohui ʻana i kahi pūnaewele hou i ka waihona i like me kēia:

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

A ma hope koke iho, ua maʻalahi iaʻu e hoʻohui i nā hana hou, no ka laʻana, ka unuhi ʻana a me ka parsing Rss. No ka mea pono kēia kaʻina hana i ka ʻike kumu, a laila ka mea nāna e hoʻopuka i ka loulou RSS, e like me WebsiteIndexHistoryPersistor, e kākau inoa i ka memo "Content/HtmlContent", e hana a hāʻawi i ka memo i makemake ʻia ma kāna pipeline.

Ke hoʻololi ʻana i ka hope PHP i ke kaʻa kahawai Redis a koho i kahi waihona kūʻokoʻa framework

I ka hopena, ua hoʻopau mākou i nā daemons, mālama kēlā me kēia i nā pilina i nā kumuwaiwai pono. No ka laʻana he daimonio nā lawaiʻa Loaʻa nā mea lawelawe āpau e pono ai e hele i ka Pūnaewele no ka ʻike, a me ka daemon hoʻomau paʻa i kahi pilina i ka waihona.

I kēia manawa, ma kahi o ke koho ʻana mai ka waihona, ʻo nā id i koi ʻia ma hope o ka hoʻokomo ʻia ʻana e ka mea hoʻomau e hoʻouna wale ʻia ma o ke kaʻa i nā mea lawelawe hoihoi.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka