PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

praefatio

Pagina mea, quam amabam curro, ad hospitem interest paginas et personales situs destinatur. Hic locus incoepit mihi in ipso itineris programmatis exordio interesse, tunc captus sum magnos professionales qui de se scribunt, oblectamenta et consilia. Eas mihi inveniendi consuetudo ad hunc diem manet: in omnibus fere commercialibus et non admodum commercii locis, inspicere pergo pedem in quaerendis nexus auctoribus.

Exsequendam rationem

Prima versio tantum paginae HTML modo in pagina personali mea erat, ubi nexus cum subscriptionibus posui in indice ultionis. Cum viginti paginas per aliquod temporis spatium expressas, cogitare incepi hoc non admodum efficax fuisse et experiri decrevi processum automate. In StackOverfluo animadverti multos homines sites in suis profiles significare, itaque parser in php scripsi, quae simpliciter per profiles perrexi, incipiens a prima (inscriptiones in SO ad hunc diem similes sunt: ​​`/usores/20` ) nexus extractos e tag desiderato adiecto in SQLite.

Haec secunda versio dici potest: collectio decem millium URL in mensa SQLite, quae in HTML modum static reposuit. Simplex inquisitionis in hoc indice egi. Quod tantum URLs erant, tunc ex illis quaesitio simpliciter fundata est.

Hac in scena consilium destiti et post longum tempus ad illud redii. Hac in scaena, laboris mei experientia plus quam tres annos iam erat et sensi me aliquid gravius ​​posse. Insuper magna cupiditas erat ut novae technologiae inter se dominum tenerent.

Nova versio

project in Docker explicavit, datorum ad mongoDb translatum et recentius, radicula addita, quae primo modo caching erat. Una e PHP microframeworks pro fundamento ponitur.

quaestio

Novae sites additi sunt a console mandatum quod haec synchrone facit:

  • Download contenta per URL
  • Vexillum significat utrum HTTPS occidere praesto fuit
  • Servat essentiam website
  • Fons HTML et capitis salvantur in "indexing" historia
  • Parses contenta, excerpere titulum et descriptionem
  • Notitia separatum servat collectio

Hoc satis erat ad sitos simpliciter thesauros et eas in indice ostentare;

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Sed notio automatarie index, categorizandi et disponendi omnia, omnia ad tempus servans, huic paradigma non bene convenit. Etiam simpliciter addere modum telae addere paginas codicis duplicationes requiri et interclusio ad vitandam potentialem DDoS.

In universum, sane, omnia synchrone fieri possunt, et in methodo interretiali modo Domicilium servare potes, ut immanis daemon omnia officia pro domiciliis e indice exerceat. Sed tamen etiam hic vox queue se ipsum sonat. Et si queue perficiatur, omnia officia saltem asynchronously dividi et peragi possunt.

arbitrium

Exsequendam queues et systema eventus agitatae efficiunt omnia opera dispensandi. Et flumina Redis diu tentare defuerunt.

Usura Redis fluminum in PHP

Quod Cum mea compage non sit unus e tribus gigantibus Symfony, Laravel, Yii, bibliothecam independentem invenire velim. Sed, cum evenit (primo examine), impossibile est singulas graves bibliothecas invenire. Omnia ad queues pertinentia vel consilium ab 3 quinque abhinc annis committit, vel compage alligatur.

Multa audivi de Symfony in supplemento singularum partium utilium, et iam quibusdam utor. Atque etiam nonnulla ex Laravel adhiberi possunt, ut eorum ORM, sine praesentia ipsius compagis.

symfony / nuntio

Primus candidatus statim specimen videbatur et sine ulla dubitatione eum institui. Sed difficilius evasit exempla google utendi extra Symfony. Quomodo bus convenire ut nuntiis e collectione classium transeundae cum nominibus universalibus, vanis, et etiam in Redis?

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Documenta in situ officiali satis enucleata erant, sed initialization tantum descriptus erat pro Symfony utentes caris suis YML et aliis modis magicis pro non symphonista. Nihil interest in ipso processu institutionis, praesertim in festis Novus Annus. Sed hoc mihi de improviso diu.

Conatur ad instar instantia systematis utendi Symfony fontes, etiam non levissimum negotium pro stricto fatalibus:

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Postquam haec omnia introgressus sum, et manibus meis aliquid facere conatus, ad conclusum veni quod fusum aliquod agerem, et aliud tentare statui.

illuminatum / queue

Contigit hanc bibliothecam infrastructuram et fasciculum aliarum dependentiarum arcte ligatum ad Laravel, ideo non multum temporis in ea commoratus sum: eam inspexi, eam vidi, clientelas vidi et delevit.

yiisoft/yii2-queue

Bene hic statim e nomine stricto iterum sumptam ad Yii2. Hac bibliotheca uti habui et non malum erat, sed de eo quod totum Yii2 pendet, non cogitabam.

alium

Cetera omnia, quae in GitHub inveneram, incerta erant, incepta sine stellis, furcis, furcis et magna committit incepta.

Redi ad symphoniam/nuntium, singula technica

Hanc bibliothecam figurare habui et, aliquo tempore consumpto, potui. Contigit omnia satis brevia et simplicia. Bus instantiate officinam parvam feci, quia... Putabar plures coronas habere et cum diversis tracto.

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Paucis gradibus;

  • Tractatores nuntium creamus qui simpliciter callable esse debet
  • Involvimus eos in HandlerDescriptor (ex bibliotheca classis)
  • Involvimus haec "Descriptores" in HandlersLocator exempli gratia
  • Addit HandlersLocator ad MessageBus exempli gratia
  • Praefectum `SenderInterface` transeamus ad SendersLocatorem, in casu meo Instantias `RedisTransport` classes, quae manifesto modo configurantur.
  • Addit SendersLocator ad MessageBus exempli gratia

MessageBus habet rationem `->sententiae ()' methodum quae tractatores in HandlersLocator opportunos suspicit et nuntium ad eos transit, adhibito correspondente `SenderInterface` ut mittat per bus (Redis rivos).

In configuratione continens (hoc casu php-di) totus hic fascis configurari potest sic:

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

Hic videre potes in SendersLocator duas diversas epistulas "transportationes" diversas assignasse, quarum unaquaeque suum nexum ad respondentes rivos habet.

Separatum consilium feci demo demonstrandi applicationem trium daemonum communicantium cum his utens bus sequentibus; https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Sed ostendam tibi quomodo edificare possit dolor:

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

Hoc infrastructure per applicationem

bus in meis backend expletis, singulas periodos a veteri synchrono mandato separavi, et singulas tracto feci, quorum quisque rem suam facit.

pipelinea ut novum locum in datorum addere visi sunt sic:

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Et statim post, multo facilius mihi facta est novas functionality addere, exempli gratia, Rss extrahendi et parsing. Quod hoc processum etiam originalis contenti requirit, dein tractatorem RSS ligaminis, sicut WebsiteIndexHistoryPersistor, nuntius "Content/HtmlContent" subscribit, eum progreditur et nuntium desideratum per fistulam ulteriorem transit.

PHP reducens ad Redis fluminum bus transferens et bibliothecam independens compagem eligens

Ad extremum, cum pluribus daemonibus nos absolvimus, quorum unumquodque conservat nexus solum ad facultates necessarias. Eg daemonium reptilia omnes auriculas continet, qui requirunt ad Penitus ad contentum, et ad daemonem perseverare tenet nexum ad database.

Nunc, pro seligendo e datorum, ides quaeruntur, post insertionem a pertinaciter, simpliciter transmittuntur per bus omnibus, quorum interest, tracto.

Source: www.habr.com