Nepagrįstos sėkmės php. Paprastas PHP ir AJAX naudojimo pavyzdys. Kaip viskas prasidėjo

Viza: „Blaue Karte EU“.

Dokumentų pateikimo metu 29 m

Iš Astrachanės

Ambasados ​​miestas: Maskva

Universitetas, specialybė: Astrachanės valstybinis technikos universitetas, integruota pagalba informacijos saugumas automatizuotos sistemos

Kalbos: anglų vidutinė

Kaip viskas prasidėjo:

Jau seniai turėjau norą kur nors išsikraustyti. Tiesa, daugiausia buvo svarstomos šiltos šalys su jūra. Du kartus rimtai tyrinėjome vandenis dėl persikėlimo į Juodkalniją ar Bulgariją. Dėl to paskutinę akimirką dėl vienokių ar kitokių priežasčių persigalvojo. Paskutinį kartą – 2014 metų rugsėjį po rimto pasiruošimo parduoti automobilį.

Spalio mėnesį netyčia pamačiau skelbimą, kuriame ieškoma programuotojų persikelti į Vokietiją. Tuo metu neturėjau supratimo apie Mėlynosios kortelės egzistavimą ir maniau, kad Vokietija yra šalis, turinti nepaprastai griežtą migracijos politiką ne ES piliečių atžvilgiu.

Su tam tikru skepticizmu ir nepasitikėjimu rašiau per Skype. Kitoje ekrano pusėje atsiliepė įdarbinimo specialistė (Alina), kuri užsiima IT personalo atranka ir vėliau persikėlus į Vokietiją. Pirmojo pokalbio metu mes įdarbinome programuotojus į didelę internetinę parduotuvę, kurios būstinė yra Berlyne. Išsiunčiau savo gyvenimo aprašymą ir laukiau.

Po kurio laiko Alina pasakė, kad kolegė iš Vokietijos pasikalbės su manimi, kad įvertintų kalbos lygį ir adekvatumą. Pokalbis buvo labiau panašus į pokalbį su dviem loginėmis problemomis, jis truko apie 30 minučių „Skype“. Po to man liepė palaukti. Maždaug po savaitės buvo suplanuotas pirmasis techninis pokalbis. Techninis interviu taip pat buvo per Skype su vienu iš įmonės kūrėjų. Mano nuomone, visai pavyko, bet po savaitės man pasakė, kad aš netinkamas. Beje, ne vienas Alinos kandidatas dėl tam tikrų priežasčių nepraėjo.

Kaip viskas susiklostė:

Buvau šiek tiek nusiminusi, bet gyvenimas tęsiasi. O po kelių dienų Alina pasakė, kad jie turi naują klientą iš Štutgarto, kuris ieško kūrėjų, ir man buvo suplanuotas pokalbis. Pirmąja pokalbio dalimi dalinamės su IT ir personalo padalinių vadovu. Bendras pokalbis apie patirtį, save ir kompaniją, daug juoko ir pokštų iš abiejų pusių. Matyt, jiems patiko mano humoras, todėl po kelių dienų man buvo paskirtas techninis pokalbis su potencialiu tiesioginiu vadovu. Ši pokalbio dalis mane kiek nustebino, nes, kaip vėliau pasakė vienas iš kandidatų, tai buvo tarsi „dviejų programišių pokalbis prie alaus bokalo“. Tą vakarą gavau pakvietimą į asmeninį pokalbį biure.

Tuo metu neturėjau atviros Šengeno vizos. Reikalingi dokumentai buvo skubiai paimti. Vokietijos vizų centre Maskvoje kreipiausi dėl skubios vizos ir jau kitą dieną pasiėmiau pasą su viza. Prašiau verslo vizos pagal kvietimą, kuris man buvo atsiųstas iš Eslingeno – tai tik laiškas, kuriame esu kviečiamas bendrauti ir kuriame aiškiai parašyta, kad įmonė rūpinasi visais finansiniais klausimais, susijusiais su skrydžiais, pervežimais, maitinimu ir apgyvendinimu. .

Asmeninis bendravimas biure vyko su trimis pagrindiniais įmonės IT vadovais. Pirmoji dalis vėlgi tik bendravimas apie patirtį, įgūdžius ir bendrą supratimą kai kuriais klausimais. Antrasis yra prie kompiuterio. Tiesą sakant, tai labai, labai lengvos „jaunimo lygio su testavimo patirtimi“ užduotys :). Užduotys buvo atliktos. Po to pietūs ir iškart pasiūlymas dviejų egzempliorių darbo sutarčių forma (pozicija Senior PHP Developer), pasirašyta įmonės. Paskyriau laiko pagalvoti ir pasakiau, kad atsakysiu per savaitę.

Sprendimas buvo priimtas ir aš pradėjau ruoštis prašyti vizos.

Kaip mes persikėlėme:

Kompanija sumokėjo už skrydį man ir mano šeimai (žmonai ir 2,5 metų dukrai), pirmus tris mėnesius išnuomojo mums butą (mano atveju ideali vieta su vaizdu į centrinę miesto aikštę Marktplatz) ir skyrė asmuo, kuris pirmą kartą padės. Tai nėra perkraustymo agentė gryniausia forma, bet per ją išsprendėme visas iškilusias problemas. Buvau pirmasis ne ES darbuotojas įmonėje, todėl daug klausimų buvo nukreipta į mane. Dabar, be manęs, įmonėje dirba dar vienas vaikinas iš Kijevo (atvažiavo praėjus mėnesiui po manęs), o vystytojas iš Odesos ruošiasi kraustytis. Visi jie taip pat buvo įdarbinti su Alinos pagalba.

Čia noriu pasakyti, kad esu labai dėkinga Alinai, kuri išsprendė visus man iškilusius klausimus įsidarbinimo procese. Man labai pasisekė, kad visuose įsidarbinimo ir vėlesnės adaptacijos etapuose buvo žmogus, pasiruošęs padėti ir išspręsti reikiamą problemą.

Iš pradžių atvykau vienas, o po dviejų savaičių atvyko ir mano šeima. Atvykus niekas nepasisveikina pirmas kelias dienas, kai gyvenau viešbutyje, laukiau, kol atsilaisvins mano butas. Jie mane paėmė iš viešbučio ir atvežė į vietą :)

Iš daiktų jie paėmė būtiną minimumą.

Su ABH viskas vyko labai greitai. Visi tokie klausimai buvo sprendžiami kartu su įmonės darbuotoju. ABH paskyrė terminą gana anksti po atvykimo, pateikėme dokumentus ir po trijų savaičių gavome eAT korteles.

Kaip mes apsigyvenome:

Įjungta šiuo metu gyvename Eslingene – neįtikėtinai gražiame ir švariame miestelyje, esančiame vos 15 minučių nuo Štutgarto. Mes dar nepatiriame diskomforto dėl kalbos nemokėjimo, dažniausiai galime bendrauti angliškai arba, kraštutiniais atvejais, gestais. Vienintelė problema, kuri šiuo metu egzistuoja – buto nuoma. Pasiūlymų yra labai mažai, o paklausa neįtikėtinai didelė. Būsto padėtis Štutgarte yra šiek tiek lengvesnė, bet aš norėčiau likti Eslingene.

Trumpa santrauka su apytikslėmis datomis:

2014 m. spalio vidurys – pamačiau skelbimą ieško programuotojų

Spalio pabaiga – lapkričio vidurys – interviu su pirmąja įmone

Lapkričio vidurys – lapkričio pabaiga – interviu su mano dabartine įmone, gavus pasiūlymą asmeniniam pokalbiui

2015 m. sausio 20 d. – vasario 1 d. – prašymas išduoti nacionalinę vizą, pasų su vizomis gavimas

). Debesis sukurtas paleisti įvairius PHP scenarijus pagal tvarkaraštį arba per API. Paprastai šie scenarijai apdoroja eiles, o apkrova „paskirstoma“ maždaug 100 serverių. Anksčiau daugiausia dėmesio skyrėme tam, kaip yra įdiegta valdymo logika, kuri yra atsakinga už tolygų apkrovos paskirstymą tokiam serverių skaičiui ir užduočių generavimą pagal grafiką. Tačiau, be to, mums reikėjo parašyti demoną, kuris galėtų paleisti mūsų PHP scenarijus CLI ir stebėti jų vykdymo būseną.

Iš pradžių jis buvo parašytas C, kaip ir visi kiti mūsų kompanijos demonai. Tačiau susidūrėme su tuo, kad nemaža dalis procesoriaus laiko (apie 10%) buvo iš esmės sugaišta: paleidžiant interpretatorių ir įkeliant mūsų sistemos „šerdį“. Todėl, kad interpretatorių ir mūsų karkasą būtų galima inicijuoti tik vieną kartą, buvo nuspręsta demoną perrašyti PHP. Mes tai pavadinome Php uola syd (panašus į Phproxyd – PHP Proxy Daemon, C demoną, kurį turėjome anksčiau). Jis priima užklausas paleisti atskiras klases ir kiekvienai užklausai padaro fork(), taip pat gali pranešti apie kiekvieno paleidimo būseną. Ši architektūra daugeliu atžvilgių yra panaši į „Apache“ žiniatinklio serverio modelį, kai visa inicijavimas atliekama vieną kartą „pagrindiniame“ ir „vaikai“ dalyvauja apdorojant užklausą. Kaip papildomą priedą gauname galimybę CLI įjungti operacinės kodo talpyklą, kuri veiks tinkamai, nes visi vaikai paveldi tą pačią bendros atminties sritį kaip pagrindinis procesas. Norėdami sumažinti paleidimo užklausos apdorojimo vėlavimus, galite atlikti fork() iš anksto (prefork modelis), tačiau mūsų atveju fork() uždelsimas yra apie 1 ms, o tai mums labai tinka.

Tačiau kadangi mes atnaujiname kodą gana dažnai, šį demoną taip pat reikia dažnai paleisti iš naujo, kitaip į jį įkeltas kodas gali pasenti. Kadangi kiekvieną paleidimą iš naujo lydės daugybė klaidų, pvz ryšį iš naujo nustatė bendraamžis, įskaitant paslaugų atsisakymą galutiniams vartotojams (demonas naudingas ne tik debesiui, bet ir daliai mūsų svetainės), nusprendėme ieškoti būdų, kaip iš naujo paleisti demoną neprarandant jau užmegztų ryšių. Yra viena populiari technika, kuri naudojama grakštus perkrovimas demonams: atliekamas fork-exec ir deskriptorius iš klausymo lizdo perduodamas vaikui. Taigi, nauji ryšiai jau priimami nauja versija demonas, o senieji „modifikuojami“ naudojant senąją versiją.

Šiame straipsnyje apžvelgsime sudėtingesnę parinktį. grakštus perkrovimas: Senus ryšius ir toliau apdoros nauja demono versija, o tai mūsų atveju svarbu, nes kitu atveju bus paleistas senasis kodas.

Teorija Pirmiausia pagalvokime: ar įmanoma tai, ką norime gauti? Ir jei taip, kaip tai pasiekti?

Kadangi demonas veikia Linux sistemoje, kuri yra suderinama su POSIX, mums prieinamos šios parinktys:

  • Visi atidaryti failai ir lizdai yra skaičiai, atitinkantys atidaryto deskriptoriaus numerį. Standartinio įvesties, išvesties ir klaidų srauto deskriptoriai yra atitinkamai 0, 1 ir 2.
  • Nėra reikšmingų skirtumų tarp atidaryti failą, lizdas ir vamzdis (vamzdis) nėra (pavyzdžiui, su lizdais galite dirbti naudodami tiek skaitymo / rašymo, tiek siuntimo / atkūrimo iš sistemos skambučius).
  • Vykdant sistemos skambutis fork() visi atviri deskriptoriai yra paveldimi, išsaugant jų numerius ir skaitymo/rašymo pozicijas (failuose).
  • Kai vykdomas execve() sistemos iškvietimas, visos atviros rankenos taip pat paveldimos, be to, proceso PID išsaugomas ir todėl yra giminingumas su vaikais.
  • Atvirų procesų deskriptorių sąrašą galima rasti /dev/fd kataloge, kuris Linux sistemoje yra nuoroda į /proc/self/fd.
  • Taigi, mes turime pagrindą manyti, kad mūsų užduotis gali būti atlikta ir be didelių pastangų. Taigi, pradėkime PHP pataisos Deja, yra viena smulkmena, kuri apsunkina mūsų darbą: naudojant PHP nėra galimybės gauti failo deskriptoriaus numerio srautams ir atidaryti failo deskriptorių pagal numerį (vietoj failo deskriptoriaus kopijos). atidaromas, o tai mūsų demonui netinka, nes labai atidžiai stebime atidarytas rankenas, kad neatsirastų nuotėkių paleidžiant iš naujo ir paleidžiant antrinius procesus).

    Pirmiausia padarysime keletą nedidelių PHP kodo pataisų, kad pridėtume galimybę gauti fd iš srauto ir įsitikintume, kad fopen(php://fd/) neatidaro rankenos kopijos (antrasis pakeitimas yra nesuderinamas su dabartiniu PHP elgesiu, todėl vietoj jo galite pridėti naują „adresą“, pvz., php://fdraw/):

    Pataiso kodas

    diff --git a/ext/standard/php_fopen_wrapper.c b/ext/standard/php_fopen_wrapper.c index f8d7bda..fee964c 100644 --- a/ext/standard/php_fopen_wrapper.c +++ b/ext/standard/php_fopen_wrapper. c @@ -24.6 +24.7 @@ #jei HAVE_UNISTD_H #įtraukti #endif +#įtraukti #įtraukti "php.h" #įtraukti "php_globals.h" @@ -296.11 +297.11 @@ php_stream * php_stream_url_wrap_phpchar(phpper *path, ch "Failo aprašai turi būti neneigiami skaičiai, mažesni nei %d", dtablesize);


    Pridėjome fd lauką prie rezultato, kurį grąžino stream_get_meta_data(), jei tai prasminga (pavyzdžiui, zlib srautams fd lauko nebus). Mes taip pat pakeitėme dup() iškvietimą iš praleisto failo deskriptoriaus paprastu jo patikrinimu. Deja, šis kodas neveiks be modifikacijų sistemoje „Windows“, nes iškvietimas fcntl() yra specifinis POSIX, todėl pilname pataisyme turi būti papildomų kodų šakų, skirtų kitoms OS. Demonas be galimybės paleisti iš naujo Pirmiausia parašykime mažą serverį kad galės priimti prašymus JSON formatu ir duokit kokį atsakymą. Pavyzdžiui, jis grąžins masyvo elementų skaičių, kuris buvo pateiktas užklausoje.

    Demonas klausosi 31337 prievado. Rezultatas turėtų būti maždaug toks:

    $ telnet localhost 31337 Bandoma 127.0.0.1... Prisijungta prie localhost. Pabėgimo simbolis yra „^]“. ("hash":1) # vartotojo įvestis "Užklausoje buvo 1 raktas" ("hash":1,"cnt":2) # vartotojo įvestis "Užklausoje buvo 2 raktai"

    Naudosime stream_socket_server(), kad pradėtume klausytis prievado, ir stream_select(), kad nustatytų, kurios rankenos yra paruoštos skaityti / rašyti.

    Paprasčiausias įgyvendinimo kodas (Simple.php)

    Instrukcijos