Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

Kupuhipa

Ko taku paetukutuku, he mahi whakangahau ahau, i hangaia hei manaaki i nga wharangi kaainga me nga waahi whaiaro. I timata ahau ki tenei kaupapa i te timatanga o taku haerenga hootaka; i taua wa i miharo ahau ki te kimi i nga tohunga ngaio e tuhi ana mo ratou ano, mo o raatau mahi me o raatau kaupapa. Ko te tikanga o te hura i a raatau ake e mau tonu ana tae noa ki tenei ra: tata ki nga waahi hokohoko, ehara i te mea tino hokohoko, ka titiro tonu ahau ki te hiku ki te rapu hononga ki nga kaituhi.

Te whakatinanatanga o te whakaaro

Ko te putanga tuatahi he wharangi html noa iho i runga i taku paetukutuku whaiaro, ka hoatu e au nga hononga me nga hainatanga ki roto i te rarangi ul. I te patopato i nga wharangi 20 i roto i te waa, ka tiimata ahau ki te whakaaro kaore i tino whai hua tenei ka whakatau ahau ki te ngana ki te whakaaunoa i te mahi. I runga i te stackoverflow, i kite ahau he maha nga tangata e tohu ana i nga waahi kei roto i o raatau korero, no reira ka tuhia e ahau he parser ki te php, i haere noa i roto i nga korero, timata mai i te tuatahi (ko nga wahitau i runga i te SO tae noa ki tenei ra he penei: `/users/1` ), i tangohia nga hononga mai i te tohu e hiahiatia ana ka taapirihia ki SQLite.

Ka taea te kii ko te putanga tuarua: he kohinga o nga tekau mano o nga URL i roto i te ripanga SQLite, i whakakapi i te rarangi pateko i roto i te html. I rapu noa ahau i tenei rarangi. No te mea he URL anake, katahi ko te rapunga i runga noa iho.

I tenei wahanga ka whakarerea e ahau te kaupapa ka hoki mai ano ahau i muri i te wa roa. I tenei wa, kua neke atu i te toru tau taku wheako mahi, ka whakaaro ahau ka taea e au te mahi i tetahi mea nui ake. I tua atu, ko te hiahia nui ki te mohio ki nga hangarau hou.

Putanga hou

Ko te kaupapa I tukuna ki Docker, i whakawhitia te paataka korero ki mongoDb, a, no na tata nei, ka taapirihia te rarihi, i te tuatahi mo te keteroki anake. Ko tetahi o nga microframeworks PHP ka whakamahia hei turanga.

raruraru

Ko nga waahi hou ka taapirihia e te whakahau papatohu e mahi ana i enei e whai ake nei:

  • Ka tango ihirangi ma te URL
  • Ka tautuhi haki e tohu ana mena kei te waatea te HTTPS
  • Ka pupuri i te mauri o te paetukutuku
  • Ko te puna HTML me nga pane ka tiakina i roto i te hitori "taupu".
  • Ka poroporoaki ihirangi, tango i te Taitara me te Whakaahuatanga
  • Tiaki raraunga ki te kohinga motuhake

I ranea tenei ki te penapena noa i nga waahi ka whakaatu ki te raarangi:

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

Engari ko te whakaaro ki te whakariterite aunoa, ki te whakariterite me te whakariterite i nga mea katoa, kia mau tonu nga mea katoa, kaore i pai ki tenei tauira. Ahakoa te taapiri noa i tetahi tikanga paetukutuku hei taapiri i nga wharangi e hiahiatia ana te taapiri me te aukati hei karo i te DDoS.

I te nuinga o te waa, ko nga mea katoa ka taea te mahi i te wa kotahi, a ma te tikanga tukutuku ka taea e koe te tiaki noa i te URL kia mahia e te daemon nui nga mahi katoa mo nga URL mai i te rarangi. Heoi ano, ahakoa i konei ko te kupu "tutira" e whakaatu ana i a ia ano. A, ki te whakatinanahia he rarangi, katahi ka taea te wehewehe i nga mahi katoa me te mahi i te kore tukutahi.

whakatau

Whakaritehia nga rarangi me te hanga i tetahi punaha whakahaere-a-takahanga mo te tukatuka i nga mahi katoa. A kua roa ahau e hiahia ana ki te whakamatau i nga Redis Streams.

Te whakamahi i nga awa Redis i te PHP

No te mea I te mea ehara taku anga i tetahi o nga roroa e toru a Symfony, Laravel, Yii, ka hiahia ahau ki te kimi whare pukapuka motuhake. Engari, i te mea i puta (i te whakamatautau tuatahi), kaore e taea te kimi whare pukapuka tino nui. Ko nga mea katoa e pa ana ki nga rarangi he kaupapa mai i te 3 i mahia e rima tau ki muri, kua herea ranei ki te anga.

He maha nga korero kua rongo ahau mo Symfony hei kaiwhakarato o nga waahanga whai hua takitahi, a kua whakamahia e au etahi o enei. Ka taea hoki te whakamahi etahi mea mai i Laravel, hei tauira i a raatau ORM, me te kore o te anga ake.

symfony/messenger

Ko te kaitono tuatahi he ahua pai tonu me te kore e ruarua ka whakauruhia e ahau. Engari he uaua ake ki te google nga tauira o te whakamahi i waho o Symfony. Me pehea te kohi pahi mo te tuku karere mai i te roopu o nga karaehe me nga ingoa o te ao, kore tikanga, tae atu ki a Redis?

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

Ko nga tuhinga i runga i te paetukutuku mana he tino taipitopito, engari ko te timatanga i whakaahuahia mo Symfony ma te whakamahi i a raatau YML tino pai me etahi atu tikanga makutu mo te hunga kore-symphonist. Kaore au i aro ki te mahi whakaurunga ake, ina koa i nga hararei o te Tau Hou. Engari me mahi tenei mo te wa roa ohorere.

Ko te ngana ki te whakaaro me pehea te whakaputa i tetahi punaha ma te whakamahi i nga punawai Symfony ehara i te mea iti rawa mo te wa kati:

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

I muri i te ruku ki enei mea katoa me te ngana ki te mahi i tetahi mea me oku ringa, ka tae ahau ki te whakatau kei te mahi ahau i etahi momo tootoo ka whakatau ahau ki te whakamatau i tetahi atu mea.

whakamarama/tutira

I puta mai ko tenei whare pukapuka i tino herea ki te hanganga Laravel me te tini o etahi atu whakawhirinakitanga, no reira kaore au i whakapau i te waa ki runga: I whakauruhia e ahau, ka tirohia, ka kite i nga whakawhirinakitanga ka mukua.

yiisoft/yii2-tutira

Ae, i konei i mau tonu mai i te ingoa, ano, he hononga tino ki Yii2. Me whakamahi ahau i tenei whare pukapuka kaore he kino, engari kaore au i whakaaro mo te mea ka whakawhirinaki katoa ki a Yii2.

Te toenga

Ko nga mea katoa i kitea e au i runga i te GitHub he kaupapa kore pono, he tawhito me te whakarere i nga kaupapa kaore he whetu, he marau me te maha o nga mahi.

Hoki atu ki te symfony/messenger, nga korero hangarau

Me whai whakaaro ahau ki tenei whare pukapuka, a, i muri i te whakapau i etahi wa, ka taea e au. I puta mai he tino poto me te ngawari nga mea katoa. Hei whakamohio i te pahi, i hanga e ahau he wheketere iti, na te mea... Ko te tikanga he maha aku tupare me nga kaikawe rereke.

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

He torutoru noa nga taahiraa:

  • Ka waihangahia e matou nga kaikawe karere me waea noa
  • Ka takai matou ki te HandlerDescriptor (akomanga mai i te whare pukapuka)
  • Ka takai matou i enei "Whakaahua" ki tetahi tauira HandlersLocator
  • Tāpiri HandlersLocator ki te tauira MessageBus
  • Ka tukuna e matou he huinga o `SenderInterface` ki te SendersLocator, i roto i taku keehi o nga karaehe `RedisTransport`, he mea whirihora ma te marama.
  • Te taapiri SendersLocator ki te tauira MessageBus

He tikanga `->dispatch()` a MessageBus e rapu ana i nga kaikawe tika i roto i te HandlersLocator ka tuku i te karere ki a ratou, ma te whakamahi i te `SenderInterface` ki te tuku ma te pahi (Redis streams).

I roto i te whirihoranga ipu (i tenei keehi php-di), ka taea te whirihora i tenei paihere katoa penei:

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

I konei ka kite koe i roto i te SendersLocator kua tohua e matou etahi "whakawhitinga" rereke mo nga karere rereke e rua, kei a ia ano tona hononga ki nga awa e rite ana.

I hanga e au he kaupapa demo motuhake e whakaatu ana i te tono o nga daemon e toru e korero ana ki a raua ma te whakamahi i te pahi e whai ake nei: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Engari ka whakaatu ahau ki a koe me pehea te hanganga o te kaihoko:

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

Te whakamahi i tenei hanganga i roto i te tono

I te whakatinanatanga o te pahi i taku tuara, ka wehea e au nga waahanga takitahi mai i te whakahau tukutahi tawhito me te hanga i nga kaikawe motuhake, ma ia tangata e mahi i a raatau ake mahi.

Ko te ahua o te paipa mo te taapiri i tetahi waahi hou ki te putunga korero penei:

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

I muri tonu mai i tera, kua maamaa ake ki ahau te taapiri i nga mahi hou, hei tauira, te tango me te tarai Rss. No te mea Ko tenei tukanga e hiahia ana ki te ihirangi taketake, katahi ka ohauru te kaihautu tango hononga RSS, penei i a WebsiteIndexHistoryPersistor, ki te karere "Ihirangi/HtmlContent", ka tukatukahia, ka tukuna atu te karere e hiahiatia ana ki runga i tana paipa.

Te whakawhiti i te tuara PHP ki te pahi Redis streams me te whiriwhiri i te whare pukapuka anga-motuhake

I te mutunga, ka mutu he maha nga daemons, e pupuri ana i ia hononga ki nga rauemi e tika ana. Hei tauira he rewera ngokingoki kei roto nga kaikawe katoa e hiahia ana ki te haere ki te Ipurangi mo te ihirangi, me te daemon tohe tonu e pupuri ana i tetahi hononga ki te patengi raraunga.

Inaianei, hei utu mo te kowhiri mai i te paataka raraunga, ko nga id e hiahiatia ana i muri i te whakaurunga a te kaitoi ka tukuna noa ma te pahi ki nga kaikawe katoa.

Source: will.com

Tāpiri i te kōrero