Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Ọrọ iṣaaju

Oju opo wẹẹbu mi, eyiti Mo nṣiṣẹ bi ifisere, jẹ apẹrẹ lati gbalejo awọn oju-iwe ile ti o nifẹ ati awọn aaye ti ara ẹni. Koko-ọrọ yii bẹrẹ si nifẹ si mi ni ibẹrẹ ti irin-ajo siseto mi; ni akoko yẹn o ṣe mi lẹnu nipasẹ wiwa awọn alamọdaju nla ti o kọ nipa ara wọn, awọn iṣẹ aṣenọju ati awọn iṣẹ akanṣe wọn. Iwa ti wiwa wọn fun ara mi wa titi di oni: lori fere gbogbo iṣowo ati kii ṣe aaye ti iṣowo pupọ, Mo tẹsiwaju lati wo ni ẹlẹsẹ ni wiwa awọn ọna asopọ si awọn onkọwe.

Imuse ti awọn agutan

Ẹya akọkọ jẹ oju-iwe html nikan lori oju opo wẹẹbu ti ara ẹni, nibiti Mo ti fi awọn ọna asopọ pẹlu awọn ibuwọlu sinu atokọ ul kan. Lehin ti o ti tẹ awọn oju-iwe 20 ni akoko kan, Mo bẹrẹ si ro pe eyi ko munadoko pupọ ati pinnu lati gbiyanju lati ṣe adaṣe ilana naa. Lori ṣiṣan ṣiṣan, Mo ṣe akiyesi pe ọpọlọpọ eniyan tọka si awọn aaye ninu awọn profaili wọn, nitorinaa Mo kọ parser kan ni php, eyiti o lọ nipasẹ awọn profaili nirọrun, bẹrẹ pẹlu akọkọ (awọn adirẹsi lori SO titi di oni jẹ bii eyi: `/users/1` ), awọn ọna asopọ jade lati aami ti o fẹ ati fi kun ni SQLite.

Eyi ni a le pe ni ẹya keji: ikojọpọ awọn ẹgbẹẹgbẹrun awọn URL ni tabili SQLite, eyiti o rọpo atokọ aimi ni HTML. Mo ṣe wiwa ti o rọrun lori atokọ yii. Nitori Awọn URL nikan ni o wa, lẹhinna wiwa naa da lori wọn lasan.

Ni ipele yii Mo kọ iṣẹ naa silẹ ati pada si ọdọ rẹ lẹhin igba pipẹ. Ni ipele yii, iriri iṣẹ mi ti ju ọdun mẹta lọ ati pe Mo ro pe MO le ṣe nkan to ṣe pataki julọ. Ni afikun, ifẹ nla wa lati ṣakoso awọn imọ-ẹrọ tuntun jo.

Modern version

Ise agbese na ransogun ni Docker, awọn database ti a ti gbe lọ si mongoDb, ati siwaju sii laipe, radish ti a fi kun, eyi ti ni akọkọ je o kan fun caching. Ọkan ninu awọn PHP microframeworks ti lo bi ipilẹ.

Isoro

Awọn aaye tuntun ni a ṣafikun nipasẹ aṣẹ console ti o ṣe atẹle naa ni amuṣiṣẹpọ:

  • Ṣe igbasilẹ akoonu nipasẹ URL
  • Ṣeto asia kan ti n tọka boya HTTPS wa
  • Ṣe itọju pataki ti oju opo wẹẹbu naa
  • HTML orisun ati awọn akọle ti wa ni fipamọ ni itan-akọọlẹ “titọka”.
  • Ntu akoonu, jade Akọle ati Apejuwe
  • Fi data pamọ si ikojọpọ lọtọ

Eyi to lati tọju awọn aaye nirọrun ki o ṣafihan wọn ninu atokọ kan:

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Ṣugbọn imọran ti atọka ni aifọwọyi, tito lẹšẹšẹ ati ipo ohun gbogbo, titọju ohun gbogbo titi di oni, ko baamu daradara sinu apẹrẹ yii. Paapaa nirọrun fifi ọna wẹẹbu kan kun lati ṣafikun awọn oju-iwe ti o nilo ẹda koodu ati idinamọ lati yago fun DDoS ti o pọju.

Ni gbogbogbo, nitorinaa, ohun gbogbo le ṣee ṣe ni iṣọpọ, ati ni ọna wẹẹbu o le ṣafipamọ URL nirọrun ki daemon ibanilẹru ṣe gbogbo awọn iṣẹ ṣiṣe fun awọn URL lati atokọ naa. Ṣugbọn sibẹ, paapaa nibi ọrọ "isinyi" ni imọran funrararẹ. Ati pe ti isinyi ba wa ni imuse, lẹhinna gbogbo awọn iṣẹ-ṣiṣe le pin pin ati ṣe o kere ju asynchronously.

Ipinnu

Ṣe imuse awọn isinyi ati ṣe eto ṣiṣe-iṣẹlẹ kan fun sisẹ gbogbo awọn iṣẹ ṣiṣe. Ati pe Mo ti nfẹ gbiyanju Awọn ṣiṣan Redis fun igba pipẹ.

Lilo awọn ṣiṣan Redis ni PHP

Nitori Niwọn bi ilana mi kii ṣe ọkan ninu awọn omiran mẹta Symfony, Laravel, Yii, Emi yoo fẹ lati wa ile-ikawe ominira kan. Ṣugbọn, bi o ti wa ni jade (ni idanwo akọkọ), ko ṣee ṣe lati wa awọn ile-ikawe pataki kọọkan. Ohun gbogbo jẹmọ si queues jẹ boya ise agbese kan lati 3 dá odun marun seyin, tabi ti wa ni ti so si awọn ilana.

Mo ti gbọ pupọ nipa Symfony gẹgẹbi olutaja ti awọn paati iwulo kọọkan, ati pe Mo ti lo diẹ ninu wọn tẹlẹ. Ati pe diẹ ninu awọn nkan lati Laravel tun le ṣee lo, fun apẹẹrẹ ORM wọn, laisi wiwa ti ilana funrararẹ.

symfony / ojiṣẹ

Oludije akọkọ lẹsẹkẹsẹ dabi ẹnipe o dara julọ ati laisi iyemeji Mo fi sii. Ṣugbọn o wa ni iṣoro diẹ sii si awọn apẹẹrẹ google ti lilo ni ita Symfony. Bii o ṣe le pejọ lati ẹgbẹpọ awọn kilasi pẹlu gbogbo agbaye, awọn orukọ ti ko ni itumọ, ọkọ akero fun gbigbe awọn ifiranṣẹ, ati paapaa lori Redis?

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Awọn iwe lori awọn osise ojula wà oyimbo alaye, ṣugbọn awọn initialization ti a nikan apejuwe fun Symfony lilo wọn ayanfẹ YML ati awọn miiran idan awọn ọna fun awọn ti kii-symphonist. Emi ko ni anfani ninu ilana fifi sori ẹrọ funrararẹ, paapaa lakoko awọn isinmi Ọdun Tuntun. Ṣugbọn Mo ni lati ṣe eyi fun igba pipẹ lairotẹlẹ.

Gbiyanju lati ṣawari bi o ṣe le ṣe imudara eto kan nipa lilo awọn orisun Symfony tun kii ṣe iṣẹ-ṣiṣe ti o kere julọ fun akoko ipari ipari:

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Lẹhin ti o ṣawari sinu gbogbo eyi ati igbiyanju lati ṣe nkan pẹlu ọwọ mi, Mo wa si ipari pe Mo n ṣe iru awọn crutches kan ati pinnu lati gbiyanju nkan miiran.

itana / isinyi

O wa jade pe ile-ikawe yii ni asopọ ni wiwọ si awọn amayederun Laravel ati opo ti awọn igbẹkẹle miiran, nitorinaa Emi ko lo akoko pupọ lori rẹ: Mo fi sii, wo, rii awọn igbẹkẹle ati paarẹ rẹ.

yiisoft / yii2-quee

O dara, nibi o ti gba lẹsẹkẹsẹ lati orukọ, lẹẹkansi, asopọ ti o muna si Yii2. Mo ni lati lo ile-ikawe yii ati pe ko buru, ṣugbọn Emi ko ronu nipa otitọ pe o da lori Yii2 patapata.

Iyoku

Gbogbo ohun miiran ti Mo rii lori GitHub ko ni igbẹkẹle, igba atijọ ati awọn iṣẹ akanṣe laisi awọn irawọ, orita ati nọmba nla ti awọn iṣẹ.

Pada si symfony/ojiṣẹ, imọ awọn alaye

Mo ni lati ṣawari ile-ikawe yii ati, lẹhin lilo diẹ ninu akoko diẹ sii, Mo ni anfani lati. O wa ni jade wipe ohun gbogbo wà oyimbo ṣoki ti ati ki o rọrun. Lati lesekese ọkọ akero naa, Mo ṣe ile-iṣẹ kekere kan, nitori… Mo yẹ lati ni awọn taya pupọ ati pẹlu awọn oluṣakoso oriṣiriṣi.

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

O kan awọn igbesẹ diẹ:

  • A ṣẹda ifiranṣẹ handlers ti o yẹ ki o wa nìkan callable
  • A fi ipari si wọn ni HandlerDescriptor (kilasi lati ile-ikawe)
  • A fi ipari si awọn “Apejuwe” wọnyi ni apẹẹrẹ HandlerLocator kan
  • Ṣafikun HandlerLocator si apẹẹrẹ MessageBus
  • A ṣe eto 'SenderInterface' kan si SendersLocator, ninu ọran mi awọn apẹẹrẹ ti awọn kilasi 'RedisTransport', eyiti a tunto ni ọna ti o han gbangba.
  • Fifi SendersLocator kun si apẹẹrẹ MessageBus

MessageBus ni ọna `-> disipashi ()` ti o n wo awọn olutọju ti o yẹ ni HandlersLocator ti o si fi ifiranṣẹ ranṣẹ si wọn, ni lilo `SenderInterface` ti o baamu lati firanṣẹ nipasẹ ọkọ akero (awọn ṣiṣan Redis).

Ninu iṣeto eiyan (ninu ọran yii php-di), gbogbo lapapo yii le tunto bii eyi:

        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);
        },

Nibi o le rii pe ni SendersLocator a ti sọtọ awọn “awọn gbigbe” oriṣiriṣi fun awọn ifiranṣẹ oriṣiriṣi meji, ọkọọkan eyiti o ni asopọ tirẹ si awọn ṣiṣan ti o baamu.

Mo ṣe iṣẹ akanṣe demo lọtọ ti n ṣe afihan ohun elo ti awọn daemons mẹta ti n ba ara wọn sọrọ nipa lilo ọkọ akero atẹle: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Ṣugbọn Emi yoo fihan ọ bi olumulo kan ṣe le ṣeto:

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();

Lilo amayederun yii ni ohun elo kan

Lehin ti o ti ṣe ọkọ akero ni ẹhin mi, Mo yapa awọn ipele kọọkan kuro ninu aṣẹ amuṣiṣẹpọ atijọ ati ṣe awọn olutọju lọtọ, ọkọọkan wọn ṣe ohun tiwọn.

Opo gigun fun fifi aaye tuntun kun si ibi ipamọ data dabi eyi:

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Ati lẹsẹkẹsẹ lẹhin iyẹn, o rọrun pupọ fun mi lati ṣafikun iṣẹ ṣiṣe tuntun, fun apẹẹrẹ, yiyo ati sisọ Rss. Nitori ilana yii tun nilo akoonu atilẹba, lẹhinna oluṣakoso ọna asopọ RSS, bii WebsiteIndexHistoryPersistor, ṣe alabapin si ifiranṣẹ “Akoonu/HtmlContent”, ṣe ilana rẹ ati firanṣẹ ifiranṣẹ ti o fẹ pẹlu opo gigun ti epo rẹ siwaju.

Gbigbe ẹhin PHP lọ si ọkọ akero ṣiṣan Redis ati yiyan ile-ikawe olominira ilana kan

Ni ipari, a pari pẹlu ọpọlọpọ awọn daemons, ọkọọkan eyiti o ṣetọju awọn asopọ nikan si awọn orisun pataki. Fun apẹẹrẹ eṣu awọn onigbese ni gbogbo awọn olutọju ti o nilo lilọ si Intanẹẹti fun akoonu, ati daemon tẹsiwaju di asopọ kan si database.

Ni bayi, dipo yiyan lati ibi ipamọ data, awọn ids ti o nilo lẹhin fifi sii nipasẹ alafojusi ni a tan kaakiri nipasẹ ọkọ akero si gbogbo awọn olutọju ti o nifẹ si.

orisun: www.habr.com

Fi ọrọìwòye kun