
Foreword
Yangu saiti, yandinoita sechinhu chekuzvivaraidza, yakagadzirirwa kuchengetedza mapeji epamba anofadza uye masaiti ega. Ichi chinyorwa chakave chinonakidza kwandiri pakutanga kwegwara rangu mukuronga, panguva iyoyo ndainakidzwa nekuwana nyanzvi huru dzinonyora nezvavo, zvavanofarira uye mapurojekiti. Tsika yekuzvitsvagira pachangu yakaramba iripo nazvino: panenge pese pese yekutengesa uye kwete saiti yekutengeserana ini ndinoramba ndichitarisa muzasi mukutsvaga zvinongedzo kune vanyori.
Kuitwa kwepfungwa
Yekutanga vhezheni yaingova peji yehtml pane yangu saiti, kwandinoisa zvinongedzo nemasaini mune ul-rondedzero. Mushure mekuunganidza mapeji makumi maviri nekufamba kwenguva, ndakatanga kufunga kuti izvi zvaisanyanya kushanda uye ndakafunga kuyedza kuita otomatiki maitiro. Pa stackoverflow, ndakaona kuti vanhu vazhinji vanoratidza masayiti mumaprofiles avo, saka ndakanyora parser muphp iyo yakangopfuura nemaprofiles, kutanga neyokutanga (kero dziri paSO kusvika nhasi dzinotaridzika seizvi: `/users/20`), zvakabviswa zvinongedzo kubva kune inodiwa tag ndokuisa muSQLite.
Iyi inogona kudaidzwa kuti vhezheni yechipiri: muunganidzwa wezviuru gumi zvemaURL muSQLite tafura, iyo yakatsiva iyo static list muhtml. Ndakatsvaga nyore pane iyi rondedzero. Sezvo kwaingova nema URL chete, kutsvaga kwaingova pavari.
Panguva iyi ndakasiya chirongwa ichi ndokudzokera kwachiri mushure menguva refu. Panguva ino ruzivo rwangu rwebasa rwakanga rwatopfuura makore matatu uye ndainzwa kuti ndaigona kuita chimwe chinhu chakakomba. Pamusoro pazvo, pakanga pane chishuvo chikuru chokuziva matekinoroji akanga ari matsva kwandiri.
Modern version
yakaiswa mudocker, dhatabhesi yakaendeswa kune mongoDb, uye nguva pfupi yadarika, redis yakawedzerwa, iyo yaimbove yekuchengetera caching. Imwe yePHP microframeworks inoshandiswa sehwaro.
dambudziko
Masayiti matsva anowedzerwa neconsole command iyo inopindirana inoita zvinotevera:
- Dhaunirodha zvirimo neURL
- Inoisa mureza unoratidza kana HTTPS iripo
- Inochengetedza kukosha kwewebhusaiti
- Iyo yekutanga HTML uye misoro inochengetwa mu "indexing" nhoroondo
- Parses zvirimo, inobvisa Musoro uye Tsananguro
- Inochengetedza data muunganidzwa wakasiyana
Izvi zvaive zvakakwana kungochengeta masaiti nekuaratidza mune runyorwa:

Asi iyo pfungwa yekungoita indexing, kuisa mumapoka, uye kuisa zvese, kuchengetedza zvese kusvika parizvino, hazvina kukwana muparadigm iyi. Kunyangwe kungowedzera nzira yewebhu yekuwedzera mapeji anodiwa kudzokorora kodhi uye kuvharira kudzivirira inogona kuitika DDoS.
Kazhinji, hongu, zvese zvinogona kuitwa synchronously, uye nenzira yewebhu, ingo chengetedza iyo URL kuitira kuti dhimoni rinotyisa riite mabasa ese emaURL kubva pane rondedzero. Asi kunyange pano, shoko rokuti "mutsara" rinouya mupfungwa. Uye kana iwe ukaita mutsara, saka unogona kupatsanura mabasa ese uye woaita kanenge asynchronously.
chisarudzo
Shandisa mitsetse uye gadzira inofambiswa nechiitiko sisitimu yekugadzirisa mabasa ese. Uye ndanga ndichida kuedza Redis Streams kwenguva yakareba.
Kushandisa Redis Streams muPHP
Sezvo chimiro changu chisiri chimwe chehofori nhatu dzeSymfony, Laravel, Yii, ndinoda kuwana raibhurari yakazvimirira. Asi, sezvazvakazoitika (pakutanga kuona) - hazvibviri kuwana akaparadzana akakomba maraibhurari. Zvese zvine chekuita nemitsara ingave purojekiti kubva ku3 yakaitwa makore mashanu apfuura, kana yakasungirirwa kuhurongwa.
Ndakanzwa nezve Symfony semupi wezvimwe zvinhu zvinobatsira, uye ini ndinotoshandisa zvimwe zvacho. Uye zvakare zvimwe zvinhu kubva kuLaravel zvinogona kushandiswa, semuenzaniso yavo ORM, pasina kuvapo kweiyo chimiro pachayo.
symfony/messenger
Wekutanga mumiriri akabva aita seakanaka uye ndakaiisa pasina kupokana. Asi googling mienzaniso yekushandiswa kunze kweSymfony yakave yakanyanya kuoma. Maitiro ekuunganidza meseji bhazi kubva kuboka remakirasi ane epasirese, asina zvaanoreva mazita, uye paRedis ipapo?

Zvinyorwa pasaiti yepamutemo zvaive zvakanyatsotsanangurwa, asi kutanga kwakatsanangurwa chete kuSymfony vachishandisa yavo yavanoda YML nedzimwe nzira dzemashiripiti kune asiri-symphonist. Ndakanga ndisingafariri nzira yekuisa pachayo, kunyanya panguva yezororo reGore Idzva. Asi ndaifanira kuzviita uye ndisingatarisiri kwenguva yakareba.
Kuedza kufunga nzira yekumisikidza sisitimu uchishandisa Symfony masosi zvakare harisi iro rakanyanya diki basa renguva dzakasimba:

Mushure mekupopota mune zvese izvi uye ndichiedza kuita chimwe chinhu nemaoko angu, ndakasvika pakugumisa kuti ndaishandisa imwe mhando yemadondoro uye ndakasarudza kuedza chimwe chinhu.
vhenekera/mutsara
Zvakazoitika kuti raibhurari iyi yakasungirirwa zvakasimba kune Laravel zvivakwa uye boka rezvimwe zvinotsamira, saka handina kupedza nguva yakawanda pairi: ndakaiisa, ndakaitarisa, ndakaona zvinotsamira, uye ndikadzima.
yiisoft/yii2-queue
Zvakanaka, pano zvakabva zvatorwa kubva pazita, zvakare kusungirirwa kwakasimba kuYii2. Ndaifanira kushandisa raibhurari iyi uye yakanga isina kushata, asi handina kufunga kuti inoenderana zvachose neYii2.
Vamwe vese
Zvese zvimwe zvandakawana paGitHub zvaisavimbika, zvechinyakare, uye zvakasiiwa mapurojekiti asina nyeredzi, maforogo, kana nhamba huru yekuzvipira.
Dzokera kune symfony/mutumwa, ruzivo rwehunyanzvi
Ini ndaifanira kufunga raibhurari iyi uye mushure mekupedza imwe nguva ndakakwanisa. Zvakazoitika kuti zvese zvakapfupika uye zviri nyore. Nekusimudzira bhazi ndakaita fekitori diki, nekuti ndaifunga kuti ndaizova nemabhazi akati wandei ane vabati vakasiyana.

Matanho mashoma:
- Gadzira mameseji anobata anongofanira kufona
- Tinozviputira muHandlerDescriptor (kirasi kubva kuraibhurari)
- Isu tinoputira aya "Descriptors" mune HandlersLocator muenzaniso
- Wedzera HandlersLocator kune MessageBus muenzaniso
- Isu tinopfuudza seti ye `SenderInterface` kune SendersLocator, mune yangu mamiriro e `RedisTransport` makirasi, ayo akagadzirirwa nenzira iri pachena.
- Wedzera SendersLocator kune MessageBus muenzaniso
MessageBus ine `->dispatch()` nzira inotsvaga vanobata vakakodzera muHandlersLocator uye inopfuudza meseji kwavari vachishandisa yakakodzera `SenderInterface` kutumira nemubhazi (Redis nzizi).
Muchigadziro chekugadzirisa (mune iyi kesi php-di) iyi bundle rose inogona kugadzirwa seizvi:
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);
},
Pano iwe unogona kuona kuti muSendersLocator isu takapa akasiyana "yekufambisa" kune maviri akasiyana mameseji, imwe neimwe ine yayo yekubatanidza kune inoenderana hova.
Ndakagadzira yakaparadzana demo purojekiti ichiratidza mashandisirwo emadhimoni matatu achitaurirana achishandisa bhazi rakadai: .
Asi ini ndicharatidza kuti mutengi anogona kugadzirwa sei:
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();
Kushandisa chimiro ichi mune application
Mushure mekuita bhazi mumashure mangu, ndakapatsanura nhanho dzega kubva kune yekare synchronous command ndokugadzira vakasiyana vanobata, imwe neimwe inoita zvayo.
Iyo pombi yekuwedzera saiti nyowani kune dhatabhesi yakave seizvi:

Uye mushure meizvozvo zvakava nyore kwandiri kuwedzera mashandiro matsva, semuenzaniso, RSS kudhirowa uye kupatsanura. Sezvo maitiro aya achidawo zvekutanga zvemukati, iyo RSS yekubatanidza inodhonza mubato, senge WebhusaitiIndexHistoryPersistor, inonyorera kune "Zviri mukati/HtmlContent" meseji, inoigadzirisa uye inopfuudza inodiwa meseji mberi kwayo.

Mukupedzisira, pakanga paine akati wandei madhimoni, imwe neimwe inobata zvinongedzo chete kune inodiwa zviwanikwa. Somuenzaniso, daemon vanopenga ine zvese zvinobata zvinoda kuenda kuInternet kune zvemukati, uye daemon shingirira inochengetedza kubatana kune database.
Zvino, pachinzvimbo chekusarudza kubva kudhatabhesi, maid anodiwa mushure mekuiswa neanorambira anongofambiswa kuburikidza nebhazi kune vese vanofarira kubata.
Source: www.habr.com
