Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Tlhaloso

Sebaka sa ka sa marang-rang, seo ke se tsamaisang e le mokhoa oa ho itlosa bolutu, se etselitsoe ho amohela maqephe a lehae a khahlisang le libaka tsa botho. Sehlooho sena se qalile ho nthahasella qalong ea leeto la ka la mananeo; ka nako eo ke ne ke khahliloe ke ho fumana litsebi tse hloahloa tse ngolang ka bona, lintho tseo ba li ratang le merero ea bona. Tloaelo ea ho iphumanela tsona e ntse e le teng ho fihlela kajeno: hoo e batlang e le sebaka se seng le se seng sa khoebo le eseng sa khoebo, ke tsoela pele ho sheba ka tlaase ho batla lihokelo ho bangoli.

Phethahatso ya mohopolo

Phetolelo ea pele e ne e le leqephe la html feela sebakeng sa ka sa marang-rang, moo ke kentseng likhokahano le li-signature lethathamong la ul. Ha ke se ke thaepile maqephe a 20 ka nako e telele, ke ile ka qala ho nahana hore sena ha se sebetse haholo mme ka etsa qeto ea ho leka ho iketsetsa mokhoa ona. Ka stackoverflow, ke hlokometse hore batho ba bangata ba bonts'a libaka tsa marang-rang liprofinseng tsa bona, kahoo ke ngotse parser ho php, e ileng ea feta ka har'a li-profiles, ho qala ka ea pele (liaterese ho SO ho fihlela kajeno li tjena: `/users/1` ), e ntšitse lihokelo ho tsoa ho tag e lakatsehang ebe e e kenyelletsa ho SQLite.

Sena se ka bitsoa mofuta oa bobeli: pokello ea li-URL tse mashome a likete tafoleng ea SQLite, e nkileng sebaka sa lethathamo le tsitsitseng ho HTML. Ke entse patlisiso e bonolo lethathamong lena. Hobane ho ne ho e-na le li-URL feela, joale patlo e ne e ipapisitse le tsona.

Mothating ona ke ile ka tlohela morero ona 'me ka khutlela ho oona ka mor'a nako e telele. Mothating ona, phihlelo ea ka ea mosebetsi e ne e se e ntse e feta lilemo tse tharo 'me ke ne ke ikutloa hore nka etsa ho hong ho tebileng haholoanyane. Ho phaella moo, ho ne ho e-na le takatso e kholo ea ho tseba mekhoa e mecha ea theknoloji.

Phetolelo ea kajeno

Morero e kentsoe Docker, database e fetiselitsoe ho mongoDb, 'me haufinyane tjena, radish e ile ea eketsoa, ​​​​eo qalong e neng e le bakeng sa caching feela. E 'ngoe ea li-microframeworks tsa PHP e sebelisoa e le motheo.

bothata

Liwebsaete tse ncha li eketsoa ke taelo ea console e etsang se latelang:

  • Khoasolla litaba ka URL
  • E beha folakha e bontšang hore na HTTPS e teng
  • E boloka boleng ba sebaka sa marang-rang
  • Mohloli oa HTML le lihlooho li bolokiloe nalaneng ea "indexing".
  • Hlalosa litaba, li qotsa Sehlooho le Tlhaloso
  • E boloka data pokellong e fapaneng

Sena se ne se lekane ho boloka libaka tsa marang-rang le ho li hlahisa lenaneng:

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Empa khopolo ea ho iketsetsa indexing, ho arola le ho beha ntho e 'ngoe le e' ngoe, ho boloka ntho e 'ngoe le e' ngoe e le morao tjena, ha ea ka ea lumellana hantle le paradigm ena. Le ho kenyelletsa mokhoa oa webo ho eketsa maqephe a hlokahalang ho pheta-pheta khoutu le ho thibela ho qoba DDoS e ka bang teng.

Ka kakaretso, ehlile, ntho e ngoe le e ngoe e ka etsoa ka mokhoa o ts'oanang, 'me ka mokhoa oa webo o ka boloka URL e le hore daemon e makatsang e etse mesebetsi eohle ea li-URL tse tsoang lenaneng. Leha ho le joalo, le mona lentsoe "queue" le itlhalosa. 'Me haeba mokoloko o kenngoa ts'ebetsong, joale mesebetsi eohle e ka aroloa' me ea etsoa bonyane asynchronously.

u etsa qeto ea

Kenya tšebetsong mela le ho etsa sistimi e tsamaisoang ke liketsahalo bakeng sa ho sebetsana le mesebetsi eohle. 'Me esale ke batla ho leka Redis Streams nako e telele.

Ho sebelisa melapo ea Redis ho PHP

Hobane Kaha moralo oa ka ha se o mong oa linatla tse tharo tsa Symfony, Laravel, Yii, ke kopa ho fumana laebrari e ikemetseng. Empa, joalo ka ha ho ile ha fumaneha (tlhahlobo ea pele), ho ke ke ha khoneha ho fumana lilaebrari tse tebileng tsa motho ka mong. Ntho e 'ngoe le e 'ngoe e amanang le mela ke projeke ea ho tloha ho tse 3 tse entsoeng lilemong tse hlano tse fetileng, kapa e hokahane le moralo.

Ke utloile ho hongata ka Symfony joalo ka morekisi oa lisebelisoa tsa bohlokoa, 'me ke se ke ntse ke sebelisa tse ling tsa tsona. Hape le lintho tse ling tse tsoang ho Laravel li ka sebelisoa, mohlala, ORM ea bona, ntle le boteng ba moralo ka boeona.

symfony/ messenger

Mokhethoa oa pele hang-hang o ile a bonahala a loketse 'me ntle le pelaelo ke e kentse. Empa ho ile ha e-ba thata haholoanyane ho sebelisa mehlala ea google ka ntle ho Symfony. Mokhoa oa ho bokana ho tsoa sehlopheng sa lihlopha tse nang le mabitso a bokahohleng, a se nang moelelo, bese ea ho fetisa melaetsa, esita le ho Redis?

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Litokomane tse sebakeng sa molao li ne li na le lintlha tse ngata, empa ho qalisoa ho ile ha hlalosoa feela bakeng sa Symfony ho sebelisa YML eo ba e ratang haholo le mekhoa e meng ea boselamose bakeng sa bao e seng symphonist. Ke ne ke se na thahasello mosebetsing oa ho kenya ka boeona, haholo-holo nakong ea matsatsi a phomolo a Selemo se Secha. Empa ke ile ka tlameha ho etsa sena ka nako e telele ke sa lebella.

Ho leka ho fumana mokhoa oa ho kenya sistimi e sebelisang mehloli ea Symfony hape ha se mosebetsi o bobebe ka ho fetesisa bakeng sa nako e behiloeng e tiileng:

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Ka mor’a ho phenya-phenya sena sohle le ho leka ho etsa ho hong ka matsoho a ka, ke ile ka fihlela qeto ea hore ke ne ke etsa mofuta o itseng oa liikokotlelo ’me ka etsa qeto ea ho leka ho hong.

illuminated/ queue

Ho ile ha fumaneha hore laebrari ena e ne e tlameletsoe ka thata ho thepa ea motheo ea Laravel le lihlopha tse ling tse itšetlehileng ka eona, kahoo ha kea ka ka qeta nako e ngata ho eona: Ke ile ka e kenya, ka e sheba, ka bona ho itšetleha ka eona 'me ka e hlakola.

yiisoft/yii2-queue

Hantle, mona e ne e nkoa hang-hang ho tloha ka lebitso, hape, ho amana ka thata le Yii2. Ke ile ka tlameha ho sebelisa laebrari ena mme e ne e se mpe, empa ha kea ka ka nahana ka taba ea hore e itšetlehile ka ho feletseng ho Yii2.

Ba bang kaofela

Ntho e 'ngoe le e' ngoe eo ke e fumaneng ho GitHub e ne e sa tšepahale, e siiloe ke nako ebile e lahliloe merero e se nang linaleli, lifereko le palo e kholo ea boitlamo.

Khutlela ho symfony/messenger, lintlha tsa tekheniki

Ke ile ka tlameha ho fumana laebrari ena, 'me, ka mor'a ho qeta nako e eketsehileng, ke ile ka khona. Ho ile ha fumaneha hore ntho e 'ngoe le e 'ngoe e ne e le khutšoanyane ebile e le bonolo. Ho tiisa bese, ke ile ka etsa feme e nyane, hobane... Ke ne ke lokela ho ba le lithaere tse 'maloa le tse nang le batho ba fapaneng.

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Mehato e seng mekae feela:

  • Re theha melaetsa ea melaetsa e lokelang ho lelekoa habonolo
  • Re li phuthela ka HandlerDescriptor (sehlopha se tsoang laebraring)
  • Re phuthela "Descriptors" tsena molemong oa HandlersLocator
  • Ho eketsa HandlersLocator ho mohlala oa MessageBus
  • Re fetisa sehlopha sa `SenderInterface` ho SendersLocator, maemong a ka a litlelase tsa `RedisTransport`, tse hlophisitsoeng ka tsela e hlakileng.
  • Ho eketsa SendersLocator ho mohlala oa MessageBus

MessageBus e na le `->dispatch()` mokhoa o shebang batho ba sebetsang hantle ho HandlersLocator ebe o fetisetsa molaetsa ho bona, o sebelisa `SenderInterface` e tsamaisanang le eona ho romella ka bese (Redis streams).

Ka tlhophiso ea setshelo (tabeng ena php-di), bongata bona kaofela bo ka hlophisoa ka tsela ena:

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

Mona u ka bona hore ho SendersLocator re fane ka "lipalangoang" tse fapaneng bakeng sa melaetsa e 'meli e fapaneng, e' ngoe le e 'ngoe e na le khokahano ea eona le melapo e tsamaisanang.

Ke entse projeke e fapaneng ea demo e bonts'ang ts'ebeliso ea li-daemone tse tharo tse buisanang ka bese e latelang: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Empa ke tla u bontša hore na moreki a ka hlophisoa joang:

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

Ho sebelisa sesebelisoa sena molemong oa ts'ebeliso

Ha ke se ke kentse ts'ebetso ea bese sebakeng sa ka se ka morao, ke ile ka arola methati e le 'ngoe ho tloha ho taelo ea khale ea synchronous mme ka etsa bahlokomeli ba arohaneng, bao e mong le e mong a iketsetsang ntho ea hae.

Tsela ea ho kenya sebaka se secha ho database e ne e shebahala tjena:

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

'Me hang ka mor'a moo, ho ile ha e-ba bonolo ho' na ho eketsa ts'ebetso e ncha, mohlala, ho ntša le ho arola Rss. Hobane ts'ebetso ena e boetse e hloka litaba tsa mantlha, ebe RSS link extractor handler, joalo ka WebsiteIndexHistoryPersistor, e ingolisa ho molaetsa oa "Content/HtmlContent", e e sebetsa le ho fetisa molaetsa o lakatsehang ho ea pele.

Ho fetisetsa mokokotlo oa PHP ho bese ea Redis le ho khetha laebrari e ikemetseng

Qetellong, re ile ra qetella re e-na le li-daemone tse 'maloa, tseo e' ngoe le e 'ngoe ea tsona e bolokang likhokahano feela ho lisebelisoa tse hlokahalang. Ka mohlala, modemona boqhekanyetsi e na le lisebelisoa tsohle tse hlokang ho ea Marang-rang bakeng sa litaba, le daemon pheella e na le khokahanyo ho database.

Hona joale, ho e-na le ho khetha ho tswa ho database, li-id tse hlokahalang ka mor'a ho kenngoa ke persist li fetisetsoa feela ka bese ho bohle ba nang le thahasello.

Source: www.habr.com

Eketsa ka tlhaloso