Wasanii wa bure wa PHP. Jinsi mkalimani anavyofanya kazi

PHP ni lugha ya programu iliyotafsiriwa; kwa kila ombi, msimbo wa chanzo unachambuliwa na "kutekelezwa". Njia hii, bila shaka, ni rahisi sana katika hatua ya maendeleo ya mradi, lakini inaleta hatua ya ziada katika mchakato wa kutekeleza msimbo wa uzalishaji. Kwa hivyo, tafsiri, ambayo kwa mtazamo wa kwanza ni hatua kali ya PHP, inagharimu wakati wa ziada wa CPU na rasilimali.

Hapo chini tutazungumza juu ya wakusanyaji ambao hukuruhusu kukusanya nambari ya PHP hadi C++, na kuifanya kuwa nambari inayoweza kutekelezwa. Kwa hivyo, maombi ya PHP yanatekelezwa moja kwa moja na processor, ikipita mkalimani.

Wacha tuangalie ikiwa kila kitu ni nzuri sana katika mazoezi.

Jinsi mkalimani anavyofanya kazi

Ufafanuzi wa nambari ya PHP hufanyika katika hatua mbili:

  1. Uchanganuzi wa msimbo na uundaji wa opcode (Zend opcodes) - maagizo yanayoeleweka kwa mkalimani.
  2. Utekelezaji wa opcodes.

Wakati awamu ya kwanza inajitolea vizuri kwa uboreshaji (kwa kutumia cache ya opcode), ya pili imefungwa kabisa - mkalimani daima ni mpatanishi kati ya seti ya maagizo na processor inayotekeleza. Bila mkalimani, processor haiwezi kuelewa nini cha kufanya na opcodes.

Ili kuondokana na kiungo cha mkalimani, watunzi walivumbuliwa, maarufu zaidi na wa hivi karibuni ambao ni HipHop kutoka Facebook. Wacha tuisikie karibu zaidi.

HipHop PHP

HipHop imeandikwa na watengenezaji wa Facebook na ni programu ambayo:
  1. inaboresha msimbo wa PHP
  2. inabadilisha kuwa C++
  3. huzalisha kutoka kwa programu yako seva ya wavuti yenye nyuzi nyingi ambayo huitekeleza
  4. inakusanya katika nambari inayoweza kutekelezwa kwa kutumia g++

Kwa hivyo, pembejeo ni msimbo wa PHP, pato ni seva, sehemu ambayo ni utendaji ulioandikwa.

Hebu tuangalie jinsi HipHop inavyoweza kushughulikia kuandaa programu iliyoandikwa kwa kutumia mfumo, kama vile Wordpress.

Kuandaa Wordpress

Baada ya kufunga HipHop, katika src/hphp/ folda tutapata faili ya hphp, ambayo ni mkusanyaji. Kabla ya mkusanyiko kuanza, weka anuwai za mazingira:

Cd .. # nenda kwenye folda yenye export ya hiphop HPHP_HOME=`pwd` export HP_LIB=`pwd`/bin export CMAKE_PREFIX_PATH=`/bin/pwd`/../

na endelea!

Pakua Wordpress na ufungue kumbukumbu:

Wget http://wordpress.org/latest.tar.gz tar zxvf latest.tar.gz

Nakili wp-config-sample.php kwa wp-config.php na ueleze mipangilio ya kuunganisha kwenye hifadhidata (katika mipangilio ya mpangishi tunabainisha 127.0.0.1, si mwenyeji wa ndani).

Kwa mkusanyiko uliofanikiwa unahitaji kiraka Wordpress kidogo:

  1. Fungua wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php na ubadilishe: kazi &loopback(/* args.. */) ( return func_get_args(); ) na kazi &loopback(/* args.. */ ) ( $ret = func_get_args(); rudisha $ret;)
  2. Katika wp-includes/query.php, badala ya if (!isset($q["suppress_filters"])) $q["suppress_filters"] = uongo; ingiza $q["suppress_filters"] = kweli;

Wordpress iko tayari.

Hiphop inahitaji kubainisha orodha ya faili ambazo tutakusanya - tutazipata na kuzihifadhi katika faili.list:

Tafuta. -jina "*.php" > files.list

Kila kitu kiko tayari kwa mkusanyiko, wacha tuendelee:

$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50

Baada ya kukamilisha amri, katika folda ya muda (mwanzoni mwa mkusanyiko, hphp itaonyesha njia yake, kitu kama "/tmp/hphp_ptRgV1") tutapokea seva ya wavuti iliyokusanywa. Wacha tuzindue (ikiwa kuna kitu kinaning'inia kwenye bandari 80, kwa mfano apache au nginx, lazima kwanza uizuie ili kufungua bandari):

Sudo /tmp/hphp_6s0pzd/program -m seva -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf

Voila! Kwa kwenda kwa http://localost tutaona blogu ya Wordpress inayofanya kazi.

Utendaji

Wacha tuone ikiwa kutakuwa na ongezeko la utendaji ikilinganishwa na toleo lisilojumuishwa la WordPress linaloendesha apache2. Chini ni grafu za utegemezi wa kasi ya uzalishaji wa ukurasa kwa idadi ya watumiaji sambamba.

Kama unavyoona, matokeo yalikuwa ya kushangaza: blogi iliyokusanywa inaendesha kwa wastani mara 6 haraka! Idadi ya wastani ya maombi yaliyochakatwa kwa sekunde katika toleo lisilojumuishwa ni 9, na katika toleo lililokusanywa ni 50! Sijui kukuhusu, lakini matokeo haya yalinishangaza; sikutarajia ongezeko kubwa kama hilo la utendakazi.

Fanya muhtasari

Baada ya matokeo ya kushangaza kama haya, jambo moja tu linaweza kusemwa - wavulana kutoka Facebook walifanya kazi nzuri. Mkusanyaji hutengeneza roketi kutoka kwa programu, na ingawa programu inahitaji kutayarishwa kabla ya kuunda, matokeo yake yanafaa.

Kwa uhakika:

Ikiwa ulipenda chapisho, bofya kwenye Google +1 - itanipa motisha zaidi kuandika na itakuwa raha tu.

Karibu watengenezaji wote mapema au baadaye wanakabiliwa na hitaji la kukimbia au kuangalia haraka msimbo fulani, lakini sio kila mtu anajua kuwa kwa kazi rahisi kama hiyo sio lazima kabisa kuendesha IDE za desktop nzito au wakusanyaji wa programu. Inatosha kutumia zana za mtandaoni zinazokuwezesha kufanya kila kitu kwa kasi zaidi: Ctrl + C, Ctrl + V, Run, whack - na matokeo ya programu tayari iko mbele ya macho yako nyekundu.

Tumechagua wakusanyaji bora wa mtandaoni: baadhi yao ni wa ulimwengu wote, wengine wameundwa kwa ajili ya kazi zilizoelezwa madhubuti. Kwa hali yoyote, hawatakuwa superfluous.

Koding

Koding.com si mkusanyaji mtandaoni kwa maana ya jadi. Kila mtumiaji wa huduma anaweza kuunda mashine kadhaa kamili za mtandaoni zinazoendesha Ubuntu 14.04 kwenye wingu, ambazo wanaweza kufanya chochote wanachotaka, ikiwa ni pamoja na kuunda msimbo. Lugha zote maarufu zinaungwa mkono na chaguo-msingi, lakini unaweza kuongeza yako mwenyewe kwa urahisi.

Mbali na jopo la kudhibiti kwa seva yako, IDE inayofaa na dirisha la terminal zinapatikana kwenye kiolesura. Koding ndio zana ya ulimwengu wote; inayofuata tutaangalia chaguzi rahisi na maalum zaidi.

IdeaOne

IdeOne ni mkusanyaji wa mtandaoni na zana ya utatuzi ambayo hukuruhusu kuendesha msimbo katika lugha zaidi ya 60 za programu na matoleo yao mahususi moja kwa moja kwenye kivinjari.

Kwa wale ambao hawana rafiki wa kike, watayarishi wametoa mkusanyiko wa msimbo katika lugha ya Brainfuck.

JDoodle

Kikusanyaji kingine cha mtandaoni ambacho kinaweza kutumia lugha nyingi, ikiwa ni pamoja na baadhi ambayo huwezi kupata katika watunzi wengine wengi mtandaoni. Kipengele kizuri cha JDoodle ni uwezo wa kushirikiana - tuma tu kiungo kwa kipindi chako cha sasa na uzalishe hitilafu kwa kasi maradufu!

jsFiddle

Usiruhusu jina likudanganye - jsFiddle haijaundwa tu kwa JavaScript. Kihariri hiki cha mwisho cha mtandaoni hukuruhusu kujaribu mchanganyiko wowote wa JavaScript, HTML na CSS. Bila shaka, kuna msaada kwa mifumo mbalimbali, kwa mfano, jQuery, Vue, React, TypeScript, na vile vile vichakataji vya CSS kama SCSS. Kwa urahisi, unaweza kuchagua kifungo muhimu kutoka kwa kihariri chako unachopenda. Kweli, ikiwa tu kihariri chako unachopenda ni Vim, Emacs au Maandishi Madogo.

CodePad

CodePad ni huduma ndogo ambayo unaweza kuhifadhi msimbo, kuishiriki, na kuiendesha na matokeo yanayofuata ya utekelezaji wake. Kuna lugha kadhaa za kawaida za kuchagua kutoka, lakini, kwa bahati mbaya, hakuna chaguo la matoleo maalum ya wakalimani au watunzi.

Faida yake kuu ni unyenyekevu na urahisi: tovuti itafanya kazi haraka hata kwa uunganisho wa polepole wa Intaneti. Uunganisho wa kiotomatiki wa vichwa vya kawaida hutolewa, pamoja na kuunganishwa na Vim au Emacs.

Moja ya hasara ni ukosefu kamili wa mwangaza wa sintaksia wakati wa kuingiza msimbo kwenye fomu. Walakini, wakati wa kutazama rekodi iliyohifadhiwa tayari, taa ya nyuma iko.

GCC GodBolt

GCC GodBolt ni mkusanyaji mwingiliano wa C++. Niliingia kwenye mkusanyiko huu kwa sababu ina interface rahisi, pamoja na idadi kubwa ya mipangilio, ikiwa ni pamoja na chaguo ambazo zinaweza kubadilishwa kwa kutumia funguo.

Kuna matoleo mengi ya mkusanyaji ya kuchagua, ikiwa ni pamoja na ya hivi karibuni. Moja ya vipengele vya kuvutia ni tafsiri ya papo hapo ya msimbo wa programu katika lugha ya mkusanyiko.

Alexey Romanenko: Jina langu ni Alexey Romanenko, ninafanya kazi katika RBC. Mada ya ripoti hii ina utata kwa kiasi fulani. Inaweza kuonekana, kwa nini kukusanya maandishi ya PHP wakati kila kitu kinaonekana kufanya kazi kama hiyo?

Labda swali kuu ni: "Kwa nini?" Kwa ujumla, madhumuni ya uwasilishaji huu ni kujaribu kuelewa ikiwa mkusanyiko kama huo unahitajika, ikiwa ni hivyo, kwa nini, kwa fomu gani na kwa nani.

Mkusanyaji wa PHP ni nini?

Kwanza, muhtasari mfupi wa mkusanyaji wa PHP ni nini. Nitakuambia jinsi inavyofanya kazi, ni nini na jinsi unavyoweza kuharakisha.

Moduli ya kwanza ya kazi ni kinachojulikana kama SAPI (Seva API), ambayo hutoa interface ya kufikia PHP kutoka kwa wateja mbalimbali (Apache, aina fulani ya seva ya CGI (Common Gateway Interface) na wengine). Pia kuna SAPI iliyopachikwa, ambayo inakuwezesha kupachika PHP kwenye programu yoyote.

Sehemu kuu ya pili ni PHP Core, ambayo hushughulikia maombi, kutekeleza kazi zote na mtandao, mfumo wa faili na kuchanganua hati zenyewe.

Sehemu ya tatu ya kimataifa ni Injini ya Zend, ambayo hukusanya hati zetu katika baadhi ya bytecode, kuitekeleza kwenye mashine yake pepe na kushughulikia usimamizi wa kumbukumbu (hutekeleza vigawaji vya kina).

Moja ya sehemu muhimu na kubwa zaidi ni moduli ya Viendelezi, ambayo hutumia 99% ya kile tunachotumia katika PHP. Hizi ni "vifuniko" vya baadhi ya maktaba, au utendakazi, au madarasa, maktaba zilizojengewa ndani, n.k. Tunaweza pia kuandika viendelezi vyetu wenyewe.

Hati yenyewe inatekelezwaje?

Kwanza. Uchambuzi wa lexical hutokea - faili inapakuliwa, imechanganuliwa, wahusika wote kutoka kwa seti ya faili hii hutafsiriwa kwenye seti fulani ya ishara, ambazo tunafanya kazi nazo.

Awamu ya uchanganuzi huchanganua ishara hizi. Kulingana na uchanganuzi huu, muundo fulani wa kisarufi unakusanywa, kwa msingi ambao bytecode itatolewa.

Mwishoni, Zend Engine huitekeleza. Matokeo yanarejeshwa kwa mteja.

Tunazungumza juu ya mizigo ya juu. Ikiwa unarudia mpango huu wa vitendo kila wakati, kila kitu kitafanya kazi polepole sana. Wakati mkalimani wetu anapokea maombi mia kadhaa au elfu kwa wakati mmoja, kasi haipo.

Lakini kuna ufumbuzi. Wamejulikana kwa muda mrefu.

Jinsi ya kufikia kuongeza kasi?

Suluhisho rahisi zaidi, la bei nafuu na lililojaribiwa vizuri ni caching ya bytecode. Badala ya kupitia awamu ya uchanganuzi, tunahifadhi tu bytecode yetu. Kuna viendelezi maalum kwa hili - vinajulikana kwa kila mtu ambaye amefanya kazi na PHP - hizi ni APC, eAccelerator, Xcache na kadhalika. Zend Engine hutekeleza bytecode tu.

Chaguo la pili ni kuweka wasifu wa msimbo, kutambua vikwazo. Tunaweza kuandika upya kitu kama viendelezi vya PHP (hiki kitakuwa kiendelezi katika C/C++), kukikusanya na kukitumia kama moduli.

Chaguo la tatu ni la kimataifa zaidi - sahau kuhusu PHP na uandike upya kila kitu. Kwa ujumla, chaguo hili lina haki ya kuishi, lakini tu katika kesi wakati hakuna msimbo wa PHP wa kutosha. Katika miradi mikubwa, mikubwa (au ambayo imekuwepo kwa muda mrefu), nyingi kawaida hujilimbikiza, na itachukua muda mrefu kuandika tena kila kitu. Mahitaji ya biashara hayatakuruhusu kufanya hivi. Kwa ujumla, kuandika kitu katika PHP, kwa mfano, kwa seva ya mbele, haichukui muda mrefu sana, kwa sababu ni lugha rahisi. Inakuruhusu kufanya haraka mambo ambayo huchukua muda mrefu kufanywa katika lugha za kiwango cha chini.

Kuna chaguo mbadala, ambalo hivi karibuni limeenea, na hiyo ni kukusanya PHP mahali fulani, kuwa kitu cha haraka zaidi.

Hebu tukusanye kitu?

Kwa neno "mkusanyiko" nitamaanisha tafsiri ya msimbo wa hati ya PHP kuwa kitu kingine, katika msimbo mwingine.

Katika kesi hii, inaweza kuwa ya aina mbili.

Nambari ya asili ni aina ya faili ya binary ambayo inaweza kutekelezwa kwenye mashine halisi.

Msimbo usio asili. Unaweza kukusanya bytecode ambayo inaweza kutekelezwa kwenye mashine nyingine ya kawaida, kwa mfano, kwenye JVM.

Unawezaje kuunda nambari ya asili kutoka PHP?

Mkusanyaji wa barabara. Mfuatano wake ni Raven. Pia kuna PHC (hii ni PHP Open Source compiler). Hivi majuzi, HipHop (Facebook) pia imeonekana.

Nitatoa muhtasari mfupi wa kile kinachoweza kufanywa kwa nambari isiyo ya asili. Kwa kadiri ninavyojua, kuna chaguzi 3 za kufanya kazi. Hiki ni kizazi cha bytecode kwa Java na utengenezaji wa bytecode kwa .Net: Quercus, Project Zero, Phalanger. Sitazingatia ujumuishaji katika nambari isiyo ya asili, kwa sababu hatuitumii. Wacha turudi kwenye mkusanyiko katika nambari asilia.

Kwa maoni yangu, mkusanyaji kongwe zaidi ni Roadsend. Ilianza kuendelezwa muda mrefu uliopita, mnamo 2002. Hapo awali ilikuwa maombi ya kibiashara. Ilifungwa, tu mnamo 2007 ilitolewa kwa Open Source. Kuna mpango changamano wa ujumuishaji: mkusanyaji fulani wa Bigloo hutumiwa kwa lugha ya Mpango, kisha msimbo asilia kutolewa. Kikusanyaji hiki hakitumii Injini ya Zend.

Tunaweza kutoa binary tofauti inayoweza kutekelezwa au kutoa moduli ya Apache. Inawezekana pia kutoa binary ambayo itafanya kazi kama seva ya wavuti. Lakini haifanyi kazi. Sijui kwanini, lakini haifanyi kazi kwangu hata kidogo.

Nijuavyo, kazi ya Roadsend haifanyiki kwa sasa. Ilibadilika kuwa mradi wa Raven, ambao uliandikwa upya kabisa katika C++. Kama mkusanyaji, hutumia LLVM kutoa nambari.

Kwa sasa kila kitu kinaonekana kuahidi sana.

Lakini bado inajengwa. Hata katika nyaraka kuna vidokezo ambavyo hatutatoa jozi. Subiri.

Mambo yangekuwa ya kusikitisha ikiwa hatungekuwa na PHC. Hii ni mkusanyaji wa OpenSource. Imetengenezwa tangu 2005. Moja ya hasara zake: hutumia SAPI iliyojengwa. Hatuachi mashine ya Java, Injini ya Zend. Kimsingi, inatafsiri nambari ya PHP kuwa nambari ya moduli ya ugani ya PHP. Baada ya hayo, inakusanya, lakini mchakato wa utekelezaji, tena, unahusisha Injini ya Zend.

Mfano wa kutumia PHC

Inafanana sana na jinsi tunavyofanya kazi, kwa mfano, na watungaji wa kawaida, gcc. Ya kwanza inaonyesha kuwa kuna binary moja, tunaweza pia kutoa nambari ya C. Kwa kuwa gcc sawa hutumika ndani baada ya kutengeneza msimbo huu, tunaweza kutumia alama hizo ambazo zimekusudiwa uboreshaji na vitu vingine.

Tulikuwa tunazungumza juu ya programu inayoendesha kwenye mstari wa amri.

Ili kuzindua programu ya wavuti unahitaji kufanya hatua kadhaa, ni ngumu sana. Kwanza unahitaji kutoa kiendelezi, kisha kukusanya msimbo, na kisha kwa namna fulani (ama kwa nguvu au kwa static) kuunganisha.

Faida kuu za PHC

Kimsingi, tunatumia PHP sawa, tunaendana kikamilifu. Viendelezi vingine vyote vinatumika. Tunatumia kila kitu ambacho tumekusanya. Nyaraka nzuri sana.

Kwa njia, moja ya bonasi za ziada za PHC ni kwamba unaweza kutoa kazi ya XML ya hati yetu kulingana na jinsi XML inavyoundwa, wakati mwingine hii inaweza kuwa muhimu.

Minuses

Kwa maoni yangu, hii ni binary duni, kwa sababu bado ina utegemezi wa Zend Engine. Pia kuna ugumu fulani katika suala la kuunganisha miradi ya wavuti.

Jambo kuu

Ripoti hii pengine isingetokea kama HipHop, suluhu kutoka kwa Facebook, isingetokea. Waundaji wake pia walikusanya idadi kubwa ya nambari za PHP na walifikiria kwa muda mrefu nini cha kufanya nayo.

Kama ninavyoelewa, baada ya chaguzi za kuandika upya kila kitu kukataliwa, iliamuliwa kuandika aina fulani ya mtafsiri (katika kesi hii kwa nambari ya C ++). Mradi huo ni mchanga; ulitolewa rasmi mnamo Februari mwaka huu. Msimbo wa PHP hutafsiriwa katika msimbo wa C++ na kisha kuzalishwa kwa kutumia zana za kawaida kwenye mfumo wako wa uendeshaji. Hata hivyo, kwa sasa ni mfumo wa uendeshaji wa Linux pekee unaoungwa mkono.

Juzi tu nilimuuliza mwakilishi wa Facebook kuhusu uamuzi huu. Alisema kwa sasa asilimia 100 ya msimbo wa PHP inatungwa kupitia HipHop. Nambari haifanyi kazi katika hali yake safi kupitia mkalimani wa PHP. Tena, waumbaji walitangaza kupunguzwa kwa kiasi kikubwa kwa mzigo wa processor.

Utendaji wa msingi wa HipHop

Inazalisha moja kwa moja binary yenyewe, ambayo inaweza kutekelezwa kwenye mstari wa amri. Kuna chaguo kama hilo la kuizindua kama seva ya wavuti ya utiririshaji. Pia kuna debugger tofauti iliyojengwa ndani. Inaweza kutatua hati ndani na kwa mbali (itafanya kazi kama seva).

Mchakato wa kusanyiko sio mdogo sana. Kuna maelezo, lakini haijakusanywa kila mahali. Kwa sasa, kama nilivyosema, kila kitu kimekusanywa kwa Linux, pamoja na hapo awali kila kitu kilikuwa "kilengwa" kwa bits 64. Ingawa biti 32 sasa zinaungwa mkono kwa majaribio. Lakini niliweza kuikusanya na kuiweka kiraka kidogo - kwa ujumla, ilifanya haya yote, kwa sababu haijakusanywa kwa msingi.

Kwa kuongezea, wana matoleo yao wenyewe ya libcore na, kwa maoni yangu, kuna maktaba kadhaa ambazo pia zinahitaji kuwekwa viraka. Kwa ujumla, mchakato wa kusanyiko sio rahisi sana.

Katika pato baada ya kukusanyika, tunapokea faili fulani ya hphp, ambayo ni mtafsiri wa msimbo wetu wa PHP katika C++. Ikiwa tunaangalia bendera, kuna nyingi sana. Nimeangazia hapa machache ya msingi ambayo unaweza kuhitaji.

Tunaweza kutumia faili katika umbizo la HDF kama faili ya usanidi (usanidi), tukibainisha maagizo mbalimbali. Tunaweza kuweka kiwango cha makosa na vitu vingine hapo (HDF ni kila kitu kinachopatikana katika fomu iliyopangwa). Tunaweza pia kuchukua usanidi yenyewe kutoka kwa hifadhidata au kuitumia moja kwa moja kwenye mstari wa amri.

Tunaweka kiwango cha ukataji miti wakati wa ujumuishaji: onyesha makosa yote au pia onyesha maonyo, maelezo ya ziada, au kwa ujumla weka kumbukumbu kamili ya kila kitu kinachotokea.

Maagizo muhimu sana ni input_list=FILE, ambayo huturuhusu kubainisha orodha ya hati ambazo tunataka kutayarisha. Inafaa pia kutaja maagizo kama vile lazy-bind. Tunaweza kutaja faili zote za mradi - zile ambazo zitakusanywa.

Mfano wa kuendesha mkusanyiko wa hati za PHP

Kiwango cha tatu cha ukataji magogo kimewekwa, kuna habari ya jumla kwa wakati, unaweza kuona ilichukua muda gani. Kwa kweli, script ni rahisi sana. Hii ndiyo kawaida "Habari, Ulimwengu", nilipiga picha ya skrini.

Faili nzito zaidi ni "programu" yetu ya binary, ukubwa wake ni 28 MB. Kimsingi, "Halo, Ulimwengu" wetu una uzito wa MB 28. Nilitaka kutambua kwamba pamoja na mstari wa kawaida "Echo "Hello, Dunia!", binary hii inajumuisha mengi zaidi.Hii ni seva ya mtandao kamili, seva kamili ya utawala.

Tunafanya nini?

Tunayo "Hujambo..." katika C++, ambayo hufanya kazi inayojumuisha mstari mmoja "echo "Hujambo, Ulimwengu". Kwa kuongezea, vitu vingi vya watu wengine hupakiwa. Kama tunavyoona, hili ni faili kamili. katika C++.

Hii ndio programu inayosababisha. Tayari ina funguo chache tofauti kwa usanidi tofauti, lakini nitataja chache tu.

Hii ni --mode, hii ni hali ya uzinduzi wa programu yetu. Tunaweza kuiendesha moja kwa moja (kutoka kwa safu ya amri) au katika seva ya wavuti au modi ya daemoni kamili. Kuna chaguzi kadhaa zaidi, lakini sio muhimu.

config inatumika katika muundo sawa. Sikutoa maagizo kwa sababu yapo mengi. HipHop inakuja na nyaraka. Haiko kwenye tovuti ya wiki, lakini nyaraka hutolewa na usambazaji, ambapo kila kitu kinaelezewa wazi. Sikutarajia kwamba maelezo yangekuwa ya kina sana. Hii hukuruhusu kusanidi suluhisho kwa urahisi kabisa.

Ili kukimbia katika hali ya seva, tunaweza kutaja bandari. Kwa utawala, bandari tofauti hutumiwa, ambapo unaweza kutuma maombi fulani ambayo inakuwezesha kusimamia seva. Ikiwa tuna seva ya utatuzi inayoendesha, basi tunaonyesha seva pangishi na mlango ambapo "tutafunga" kwa utatuzi.

Uzinduzi mfano

Kwa mfano, tulibainisha port 9999 kwa ajili ya utangazaji. Kwa kutekeleza maombi rahisi ya http, tunaweza kupokea takwimu, au kudhibiti seva kwa namna fulani, au kupata maelezo ya ziada. Kwa ujumla, ni rahisi sana.

Chaguo la kupata habari ya hali

Inawezekana kupokea hali ya seva iliyowekwa katika miundo mbalimbali iliyojengwa (xml, json, html). Kimsingi, habari hutolewa kuhusu mchakato mkuu wa seva yenyewe na vidhibiti - nyuzi ambazo huchakata maombi.

Takwimu za Ziada

Kwa kweli, takwimu nyingi hutolewa. Kwa sababu HipHop hufanya kazi asili na memcache na SQL katika mfumo wa MySQL, inatoa maelezo ya kina kuhusu shughuli zote zinazofanywa nayo.

Takwimu kamili za kumbukumbu

Kuna kipengele muhimu sana hapa - Takwimu za Maombi. Kwa kutumia vipengele vya ziada vya HipHop yenyewe katika PHP, tunaweza kuandika takwimu katika hati zetu, ambazo kisha tunapokea kupitia ufikiaji wa mara kwa mara wa http.

Utatuzi

Kama nilivyosema tayari, inawezekana kutumia "debug" iliyojengwa ili kurekebisha hati. Hii ni rahisi sana kwa sababu mkalimani wa hphpi hufanya kazi sawa na kile tulichokusanya. Kuna tofauti katika "tabia" ya hati wakati zinatekelezwa katika PHP ya kawaida na wakati wa kutumia data iliyokusanywa. Ili kutatua kile kilichokusanywa, Facebook iliandika mkalimani tofauti.

Katika kesi ya kwanza, tunaendesha msimbo na kubadili "-f" na kuona jinsi faili inavyofanya; matokeo yote huenda kwa stdout. Au tunaweza kuiendesha katika hali ya utatuzi na kuingia kwenye kitatuzi shirikishi. Inafanana sana na GDB ya kawaida: unaweza pia kuweka vituo vya kuvunja, kukimbia, kuingiza thamani zinazobadilika, kufuatilia, na zaidi.

Moja ya vipengele vya ziada

Tunayo programu ambayo iliibuka baada ya kukusanywa. Inaweza kutumika kama seva ya RPC. Tunaendesha maombi juu ya http, na kwa kupiga kazi ya vigezo, tunaweza kupitisha parameta kama safu ya json au parameta tofauti. Tutarejesha json, ambayo inarejesha matokeo ya kazi hizi. Hii ni rahisi sana - utendaji muhimu tayari umejengwa tangu mwanzo.

Hasara za HipHop

Kwa sasa, HipHop haitumii miundo na vitendakazi vya lugha kama vile eval(), create_function() na preg_replace() na /e, ingawa hizi zote ni sawa na eval(). Walakini, katika matoleo ya hivi karibuni, kwa maoni yangu, bado unaweza kuwezesha eval() kupitia usanidi. Lakini haipendekezi kufanya hivyo. Kwa ujumla, kutumia eval() ni mbaya.

Faida kuu za HipHop

Bila shaka, faida kuu ni msaada kutoka kwa Facebook. Inafanya kazi na inaendelezwa kikamilifu. Jumuiya ya wasanidi programu inajitokeza karibu na mradi huu. Utekelezaji mpya kabisa wa PHP umeandikwa.

Kama nilivyosema tayari, faida ni kwamba nambari ya asili hutolewa. Ongezeko la utendaji linadaiwa kwa kupunguza gharama za upakiaji wa kichakataji (majaribio yanathibitisha hili).

Ni rahisi kubadilika katika usanidi. Nilishangaa sana kuwa kuna chaguzi chache za ubinafsishaji. Nadhani hii ni kwa sababu ya ukweli kwamba mradi unafanya kazi. Kila kitu kinachotumiwa kinaongezwa.

Kama nilivyosema tayari, HipHop hutoa vipengele vingi vya ziada. Hizi ni pamoja na matumizi kama seva ya RPC, utawala, takwimu mbalimbali na mengi zaidi. Kwa njia, pia kuna API ya kufanya kazi na lugha zingine.

Nyaraka nzuri kabisa zimeandikwa kwa suluhisho hili. Faida nyingine: hii ni suluhisho ambalo kwa kweli liko tayari kutumika katika uzalishaji (mfano: Facebook).

Minuses

Ubaya kuu ni kwamba kwa sasa idadi ndogo ya moduli zinasaidiwa. Kwa mfano, tunapofanya kazi na hifadhidata, tunaweza kutumia tu kazi za kufanya kazi na MySQL. Hakuna msaada wa PostgreSQL hapa.

Pia kuna kitu kama ugumu wa kusanyiko, ambayo tayari nimesema. Kuna matatizo na kujenga kwenye mifumo ya 32-bit. Lakini nadhani hii itarekebishwa hivi karibuni. Kwa sasa, mkusanyiko pekee kutoka PHP 5.2 hutumiwa. Toleo la 5.3 bado halitumiki, lakini litatumika kama ilivyoahidiwa.

Je, hupaswi kutarajia nini kutoka kwa mkusanyiko huo kwa ujumla na hasa kutoka kwa HipHop?

Ukusanyaji hautaharakisha kwa namna yoyote hoja zako za polepole za SQL kwenye hifadhidata. Ikiwa kizuizi ni hifadhidata, basi ikusanye au usiikusanye, haitafanya chochote kizuri.

Mkusanyiko hauharakishi upakiaji tuli, upakiaji wa nguvu tu. Inafanya utatuzi kuwa mgumu zaidi. Watu wengi labda wamezoea ukweli kwamba kila kitu ni rahisi sana kurekebisha katika PHP. Hii haitatokea tena wakati wa mkusanyiko. Ingawa, kama nilivyoona, Facebook imefanya mchakato huu kuwa rahisi iwezekanavyo, bila hiyo itakuwa ngumu zaidi kuunda kila wakati.

Usitarajie hii kuwa aina fulani ya "risasi ya fedha" ambayo itasuluhisha shida zako zote. Kwa kweli, mkusanyiko hutatua safu nyembamba ya shida. Ikiwa wako, basi hii inaweza kusaidia.

Mkusanyiko hutatua matatizo gani?

Inapunguza mzigo kwenye CPU, kwani wakati wa kufanya kazi kikamilifu na PHP na idadi kubwa ya maombi, mzigo juu yake huongezeka sana. Kwa kweli, ningependa kufanya majaribio kadhaa.

Kupima

Jaribio la kwanza (rahisi zaidi) ni operesheni ya gharama kubwa ambayo inachukua muda mrefu kukamilisha. Katika majaribio, nilijaribu kujiondoa na sio kufanya maombi kwa kutumia rasilimali fulani ya nje.

Mzigo huanguka kabisa kwenye processor. Jaribio lilionyesha kuwa HipHop "ilishinda" dhidi ya kila mtu: inafanya kazi karibu mara moja na nusu kwa kasi zaidi kuliko mkusanyaji wa kawaida wa PHP. PHC ilifaulu mtihani huu polepole sana.

Kwa jaribio la pili la utendaji, nilitumia hati rasmi ya PHP, ambayo inaweza kupakuliwa kutoka kwa SVN. Inafanya idadi ya kazi zinazofanya kupanga, mgawo, muhtasari - shughuli za gharama kubwa kutoka kwa mtazamo wa hisabati.

HipHop ilikuwa mbele tena. Kwa kuongezea, na PHP ya kawaida tofauti ya wakati ni takriban mara 3. PHC ilifanya vyema hapa, lakini ilikuwa karibu nusu mbaya kama HipHop.

PHP hutumiwa sana kwa nyuzi zinazoshughulikia maombi ya http - hii inafaa kukumbuka.

Mipangilio kadhaa ya kawaida (Apache iliyo na PHP, Nginx iliyo na fpm-php na APC ya programu-jalizi kwa uhifadhi wa msimbo). Kama chaguo la tano - HipHop.

Kuwa waaminifu, nilifanya majaribio sio kwenye seva, lakini kwenye kompyuta ndogo. Nambari, bila shaka, haziwezi kuendana kikamilifu na ukweli, lakini katika kesi hii matokeo ni ya kawaida. Inastahili kuzingatia kwamba mzigo unapoongezeka, idadi ya maombi na jumla ya maombi huongezeka wakati huo huo. Inayofuata ni RPS. Tulijaribu ukurasa wa kawaida unaojumuisha majumuisho 10 rahisi. Kimsingi, hii ni kujaribu PHP kama mkalimani.

Swali kutoka kwa watazamaji: Ni nambari gani kwenye seli - sekunde?

Alexey Romanenko: Hii ni fps.

Hapa tunaweza kuhitimisha kuwa idadi ya maombi ya wakati mmoja inapoongezeka, HipHop inafanya kazi vizuri sana.

Inaweza kuonekana kuwa kutumia APC ni mazoezi ya kawaida. Inaonyesha kuwa inaongeza, kwa mfano, kama Apache nyongeza ya utendaji ya takriban mara 2. Hii pia hufanyika na Nginx. Lakini ukweli kwamba Nginx ni polepole haimaanishi kuwa kifurushi hiki ni mbaya zaidi. Mtihani maalum tu. Ikiwa tutajaribu hapa, basi Apache "itakufa" kwa maombi ya polepole.

Labda tunataka kuelewa ikiwa tunahitaji hii au la.

Ni wakati gani unapaswa kufikiria juu ya mkusanyiko?

Uwezekano mkubwa zaidi, hii inahitajika tunapoona kuwa kizuizi chetu ni CPU. Ikiwa tunaunganishwa na CPU kwa kutumia PHP kama mkalimani wa kawaida, labda inafaa kuzingatia kwamba labda sehemu ya mradi inaweza kukusanywa.

Kwa baadhi ya matukio wakati programu yako inahitaji uhuru wa kuendesha, njia hii haiwezekani kufaa.

Kupunguza idadi ya seva. Wakati kuna seva nyingi, basi kwa kupunguza tija kwa mara 2, kwa kusema, tunapunguza pia idadi kwa nusu. Wakati ni seva moja, haina maana, lakini wakati kuna 100-200 kati yao, basi labda ina maana.

Sababu kuu kwa nini Facebook ilianza kutumia HipHop ni kuwepo kwa idadi kubwa ya msimbo wa PHP ambao hakuna njia ya kuandika upya (au hakuna mtu, au ni ghali tu). Kuongeza tija kwa mara 2 tayari ni nzuri.

Pengine kila kitu. Kusubiri kwa maswali.

Maswali na majibu

Swali kutoka kwa watazamaji: Habari. Tafadhali niambie ikiwa una mifano mingine yoyote ya utekelezwaji wenye mafanikio wa Hiphop, kando na Facebook. Je, ungependa kuhamisha tovuti ya RBC, kwa mfano, hadi kwa HipHop? Alexey Romanenko: Nitaanza na ya pili. Tovuti ya RBC ni ngumu kutafsiri. Kuhusu utekelezaji wa mafanikio. Nilikusanya Kitengo cha PHP mwenyewe, kiliundwa kwa mafanikio. Pia, nijuavyo, bodi ya PHP Bunty inaundwa kwa mafanikio. Idadi ya mashirika, kwa kweli, tayari hutumia mkusanyiko. Majaribio zaidi yataonyesha jinsi itakuwa sahihi kutumia mradi huu. Swali kutoka kwa watazamaji: Je, unaweza kutoa mfano wa shirika linaloitumia? Alexey Romanenko: Kwa uaminifu, sitakuambia sasa, lakini hii ni Magharibi. Nijuavyo, hakuna anayeitumia hapa. Swali kutoka kwa watazamaji: Kuna tofauti gani wakati wa utekelezaji isipokuwa ukosefu wa usaidizi kwa baadhi ya vipengele ulivyotaja. Je, ni hatari kiasi gani kutafsiri mradi wa "live"? Alexey Romanenko: Tofauti ni kwamba programu yoyote iliyokusanywa inaweza kuanguka. Labda shida zingine zitaonekana ambazo bado hazijatambuliwa. Kwa kweli, kuna idadi ya tofauti katika "tabia" ya PHP yenyewe. Sikuzijumuisha kwa sababu maelezo zaidi yanaweza kupatikana katika nyaraka. Timu ya Facebook imeandika mkalimani wake mwenyewe, ambaye kimsingi ni sawa na 99.9% na yule ambaye atafanya kazi katika fomu iliyokusanywa. Ni bora kujaribu nambari yako sio na mkalimani wa kawaida wa PHP, lakini, kama nilivyosema, na hphpi ya PHP.

Kuna aina mbili za lugha za programu: kufasiriwa na kukusanywa. PHP ni lugha gani? Ili kujibu swali hili, tunahitaji kuelewa istilahi.

Programu inayotafsiri msimbo ulioandikwa katika lugha moja ya programu hadi nyingine inaitwa mfasiri. Mkusanyaji pia ni mfasiri. Inatafsiri msimbo ulioandikwa kwa lugha ya kiwango cha juu kuwa msimbo wa mashine. Mchakato wa ujumuishaji huunda faili inayoweza kutekelezwa ya binary ambayo inaweza kuendeshwa bila mkusanyaji.

Mkalimani ni kategoria tofauti kabisa. Mkalimani hatafsiri msimbo, lakini anaitekeleza. Mkalimani huchambua msimbo wa programu na kutekeleza kila mstari wake. Kila wakati unapotekeleza nambari kama hiyo, lazima utumie mkalimani.

Kwa upande wa utendakazi, wakalimani ni duni sana kwa watunzi, kwani msimbo wa binary hufanya haraka zaidi. Lakini wakalimani hukuruhusu kudhibiti programu kikamilifu wakati wa utekelezaji wake.

Kama kwa PHP, sio mkusanyaji au mkalimani. PHP ni msalaba kati ya mkusanyaji na mkalimani. Wacha tujaribu kuelewa hili na tuangalie jinsi PHP inavyochakata nambari.

Hebu tuangalie picha:

Tunaona kwamba PHP inaundwa na vizuizi viwili karibu huru - mfasiri na mkalimani. Kwa nini ulihitaji kufanya hivi? Bila shaka, kwa sababu za kasi.

Ingizo la PHP ni hati. Inaitafsiri (inaitafsiri), ikiangalia syntax, kuwa bytecode maalum (uwakilishi wa ndani). PHP kisha kutekeleza bytecode (sio msimbo wa programu yenyewe), lakini haitengenezi faili inayoweza kutekelezwa.

Bytecode ni ngumu zaidi kuliko nambari ya kawaida ya programu, kwa hivyo ni rahisi (na haraka) kutafsiri (kutekeleza). Jaji wewe mwenyewe: uchanganuzi unafanywa mara moja tu katika hatua ya kutafsiri, na "bidhaa iliyokamilishwa" inatekelezwa - bytecode, ambayo ni rahisi zaidi kwa madhumuni haya. Kwa hivyo, PHP ni mkalimani zaidi kuliko mkusanyaji. Hii "kazi mbili" ilikuwa muhimu kwa madhumuni yafuatayo.

Fikiria kitanzi:

Kwa (i=0;i<10; i++) { Operator_1; Operator_2; Operator_3; ............ Operator_99; Operator_100; }

Mzunguko huu "utazunguka" mara 10. Kwa kila moja ya kupita hizi kumi, mkalimani lazima 100 mistari ya kanuni. Na inahitaji kuchambua na kutekeleza 10*100 = 1000 mistari ya kanuni! Ukibadilisha kitanzi kizima kuwa bytecode mara moja, basi italazimika kuchambua mara 10 chini! Hii inamaanisha kuwa hati zitaendesha mara 10 haraka!

Inageuka kuwa PHP ni.

Awamu kuu ya kazi ya PHP ni tafsiri ya uwakilishi wa ndani wa programu na utekelezaji wake. Ni awamu hii ambayo inachukua muda mwingi katika hali mbaya. Walakini, kushuka sio muhimu sana.

Inafaa kukumbuka kuwa toleo la 3 la PHP lilikuwa mkalimani "safi", na maandishi ya PHP 4 yalianza kufanya kazi haraka sana, kwani toleo la 4 la PHP (na PHP5) ni mfasiri mfasiri.

Lugha ya Perl, ambayo karibu kila mara inaitwa mkusanyaji, inafanya kazi kwa njia ile ile - inatafsiri maandishi ya programu kuwa uwakilishi wa ndani, na kisha hutumia nambari inayosababisha wakati wa utekelezaji. Kwa hivyo, tunaweza kusema kwamba toleo la 4 la PHP ni mkusanyaji kwa njia sawa na Perl.

Kwa hivyo, tunalazimika kuhitimisha kuwa PHP ni mkalimani aliye na kizuizi cha kutafsiri kilichojengwa ndani ambacho kinaboresha mtiririko wa ukalimani.

Kutumia mkalimani (na kwa hivyo PHP) ina faida zake zisizoweza kuepukika:

  • Hakuna haja ya kuwa na wasiwasi juu ya kufungia kumbukumbu iliyotengwa, hakuna haja ya kufunga faili unapomaliza kufanya kazi nao - mkalimani atafanya kazi yote ya kawaida, kwani programu inatekelezwa chini ya udhibiti wake wa uangalizi;
  • Hakuna haja ya kufikiri juu ya aina za kutofautiana, na hakuna haja ya kutangaza kutofautiana kabla ya matumizi yake ya kwanza;
  • Programu za kurekebisha na kugundua makosa hurahisishwa sana - mkalimani ana udhibiti kamili juu ya mchakato huu;
  • Katika muktadha wa programu za wavuti, mkalimani pia ana faida muhimu sana - hakuna hatari ya seva "kufungia" ikiwa programu haifanyi kazi kwa usahihi.

Kuna faida zingine pia. Kwa ujumla, kutumia mkalimani kunaweza kutoa hati nguvu ambayo watumiaji wa Wavuti wanatarajia kutoka kwao.

Adhabu ya utendaji ya PHP inaonekana katika kesi ya vitanzi vikubwa na ngumu, wakati wa kusindika idadi kubwa ya mistari, nk. Hata hivyo, kumbuka kuwa hii ndiyo tu drawback ya PHP, ambayo itaonekana kidogo na kidogo kama wasindikaji wenye nguvu zaidi hutolewa. , ili hatimaye, kutoweka kabisa.

<<< Назад
(Ni nini kipya katika PHP5?)
Maudhui Mbele >>>
(Badilisha hadi PHP 5.3)

Ikiwa una maswali mengine au kitu haijulikani - karibu kwetu