Upakuaji wa php usio na kikomo. Paneli ya kudhibiti seva ya kivinjari ws

Nilizungumza zaidi juu ya jinsi ya kusanidi Denver na kuhakikisha kuwa kila kitu kinafanya kazi, nikichukua muda kidogo kutekeleza seva rahisi ya ws echo. Lakini ikiwa ulipakua kumbukumbu za chanzo, basi nina hakika unaweza kujua kwa urahisi jinsi ya kupokea na kutuma ujumbe, ambayo inatosha kutumia teknolojia.
Ninafurahi kwamba kulikuwa na majibu kwenye blogi yangu, ambayo bado haijakuzwa, na hii ilinisukuma kuandika muendelezo na kushughulikia swali la jinsi ya kupata hati ya seva ya PHP ws kufanya kazi ya kukaribisha, jinsi ya kufuatilia. kwamba mchakato unaendelea na hati ya PHP inaendelea na haikufungwa kwa sababu ya kuisha kwa muda au wakati wa kuanzisha tena Apache, jinsi ya kuzuia kuendesha mchakato wa PHP unaorudiwa na majibu kwa maswali mengine muhimu ili kupata seva ya ws inayoendeshwa kwa uhakika. Kwa hakika nitaunda seva ya ws echo ya Mtandao yenye kipengele cha gumzo na kuiweka kwenye upangishaji wangu wa wastani. Baadaye katika nakala hii, nitaita hati ya PHP ambayo inaendeshwa kila wakati kwenye seva na kutoa kazi na seva ya ws, ingawa kwa kweli ni mchakato wa upande wa seva. Na muhimu zaidi, nitatoa suluhisho iliyotengenezwa tayari hata kwa wale ambao hawana ufikiaji wa SSH kwa koni ya seva ya mwenyeji au mashine ya kawaida.

Kutakuwa na kazi nyingi leo

Wacha tuanze na kitu rahisi.

Kuweka na kuendesha seva ya soketi ya wavuti kwenye mwenyeji

Unyenyekevu upo katika ukweli kwamba hakuna matatizo na uzinduzi. Unaweza kuchukua hati ya PHP echows.php kutoka kwa kifungu kilichopita, bila kubadilisha chochote ndani yake, pakia kwa mwenyeji na ufikie faili kutoka kwa kivinjari, tofauti pekee kutoka kwa utekelezaji katika Denver inaweza kuwa kwamba mipangilio ya Apache na caching. mifumo ya mwenyeji inakataza kuonyesha habari ya hati ambayo haijakamilika ya PHP, katika kesi hii hutaona habari yoyote kwenye dirisha la kivinjari, na ukurasa utaendelea kupakia kwenye kivinjari. Lakini ukijaribu kuunganisha kwenye seva ya ws kutoka kwa mteja wetu wa ws, utaona kwamba muunganisho ulifanikiwa na seva ya ws echo hujibu maombi yote yanayotumwa. Kwa kawaida, unahitaji kubainisha ws://yourdomain.com:8889 kama anwani ya seva ya ws katika mteja wa ws. Kama unaweza kuona, kila kitu ni sawa. Tatizo pekee unaloweza kukutana nalo ni mipangilio ya ngome ya kukaribisha na bandari zinazokaliwa na huduma zingine. Ikiwa una vikoa kadhaa kwenye anwani moja ya IP, basi unaweza kufikia seva ya ws kwa anwani ya kikoa hiki ws://anotheromain.com:8889 ambayo, utakubali, si nzuri sana, hasa kwa kupangisha ambapo mamia ya tovuti. hutegemea kikoa kimoja, kinadharia, mtu anaweza kutumia bandari sawa na wewe na hii inaweza kusababisha seva ya ws isifanye kazi, kwa hivyo kwa mara nyingine tena ninapendekeza sana kuchagua bandari kwa uangalifu na kuhakikisha kuwa seva ya ws inapoacha kufanya kazi, inafunga kila wakati. huunganisha na kufunga soketi kwa usahihi. Sasa, kuhusu hati ya PHP yenyewe, kama unaweza kuwa umeona, hati yetu ya PHP huishi kwa sekunde 100 tu, baada ya hapo, unapojaribu kuunganisha au kutuma ujumbe, hufunga miunganisho yote na kukamilisha utekelezaji wake. Jinsi ya kumfanya aishi "milele"? Kuna idadi ya kutosha ya mbinu. Lakini shida sio kwamba hati ya PHP inapaswa kutekelezwa kwa muda usiojulikana, lakini shida ni jinsi ya kuhakikisha kuwa hati inaisha kwa usahihi katika hali tofauti na kisha kuanza tena kazi yake kwa usahihi. Kwa mfano, unapozima seva na kisha kuiwasha, hati ya PHP yenyewe haitaanza, na kufuatilia ikiwa seva ya ws inafanya kazi na ikiwa haifanyi kazi, kuizindua mwenyewe ni wazo mbaya sana.

Njia ya utekelezaji usio na mwisho wa hati ya PHP inayoendesha kutoka kwa kivinjari

Jambo la kwanza unahitaji kufanya ni kutaja katika hati yenyewe muda usio na kikomo wa hati ya PHP set_time_limit(0); na kupuuza kivinjari kuacha kupuuza_user_abort(kweli); ili hati ya PHP itekelezwe baada ya kufunga dirisha la kivinjari. Unapomaliza vitendo muhimu, unaweza kuizindua kutoka kwa kivinjari. Shida ni kwamba baada ya kuizindua mara moja, hatutaweza kuangalia ikiwa kila kitu kiko sawa na mchakato, ikiwa makosa yalitokea wakati wa utekelezaji, na ikiwa hati inaendelea kufanya kazi au la inaweza tu kuthibitishwa kwa kuunganishwa nayo. mteja wa ws. Bila shaka, unaweza kuongeza kwenye script hii utendaji wa kudumisha faili ya logi, ambayo itarekodi historia ya uendeshaji wake. Pia, unapoanzisha tena Apache kwenye upangishaji, mchakato na hati utazimwa 100%. Njia hii inaweza tu kufaa ikiwa tutapakia hati ya PHP iliyohakikishwa ya kufanya kazi iliyotatuliwa kwa seva na ni muhimu kwetu kwamba inafanya kazi kwa muda mfupi tu unaoonekana kulingana na kuegemea kwa mtoaji mwenyeji, lakini njia hii haitumiki kabisa. kwa kuendesha seva kamili ya ws ya kiviwanda kutoka -kutokana na kutokuwa na uhakika sana na kutokuwa na uwezo wa kuzima wakati tunapoihitaji. Hebu fikiria hali ambapo msimamizi wa seva mwenyeji aliamua kuwasha upya Apache kwa madhumuni ya kusasisha, na hutaangalia mara kwa mara ikiwa seva yako ya ws inafanya kazi au la, na wakati huo huo watumiaji wameketi kwenye gumzo lako, na ghafla kila kitu kitaenda vibaya, watumiaji. wamekasirika. Tena, unaweza kutumia mikongojo kadhaa kabla ya mteja wa ws kuunganishwa na seva ya ws kwa kutumia itifaki ya ws, kulazimisha mteja kufikia hati nyingine ya PHP ya seva kwa kutumia XMLHttpRequest(), na kuhitaji seva ya ws kuangalia kama seva ya ws iko. Kimbia. Njia hiyo ni ngumu kidogo, lakini inafanya kazi katika suluhu zisizo za kiviwanda kama soga ndogo au toy ndogo. Hii ndio ninayotumia katika miradi yangu ndogo.

Ikiwezekana, nilifanya jaribio na kuzindua seva ya ws kwenye mwenyeji, nikiwa nimeongeza utaratibu wa kufunga miunganisho yote na kukatiza mchakato wakati wa kupokea ujumbe wa "ZIMA" kutoka kwa mteja hadi kwenye hati ya PHP. Sikuigusa kwa siku kadhaa, mara kwa mara nikituma ujumbe tofauti na kuangalia uwezekano wa kuishi, nilituma amri ya "ZIMA" baada ya takriban siku mbili kumaliza kazi yake kwa mafanikio, maisha ya mchakato wa seva ya ws yaligeuka kuwa sekunde 183,403 (2 na siku kidogo) na nadhani inaweza kufanya kazi kwa muda mrefu zaidi bila shida yoyote.

Njia ya utekelezaji usio na mwisho wa mchakato wa PHP unaoendesha kutoka kwa koni

Kimsingi, hakuna tofauti yoyote kutoka kwa kuendesha hati ya PHP kutoka kwa kivinjari, isipokuwa kwamba data yote kuhusu utendakazi wa hati ya PHP hutolewa kwa koni na nuances zingine chache. Hati ya PHP yenyewe lazima pia iwe na set_time_limit(0); na kupuuza_user_abort(kweli);. Kuendesha hati ya PHP kutoka kwa *nix console inafanywa kwa amri $ php -q scriptfile.php(Nilitumia Putty kuunganisha kwenye koni). Swichi ya -q (--no-header) inabainisha kuwa mchakato unapaswa kuendeshwa katika hali ya kimya na kukandamiza matokeo ya vichwa vya HTTP ambavyo kwa kawaida hutumwa kwa kivinjari. $ mtu php itakuruhusu kuona funguo zingine za kupendeza. Nyaraka bora kwenye tovuti rasmi ya PHP, ambayo haikusaidia tu kuelewa uendeshaji wa maandishi ya PHP kutoka kwa console, lakini pia ilituruhusu kufanya maboresho makubwa kwa hati ya PHP yenyewe. Tafadhali kumbuka kuwa unaweza kuelekeza pato la hati kwa faili yoyote kwenye seva kwa kutumia ishara ya 'kubwa kuliko' ('>'), ambayo ndio kawaida hufanya.

$ php -q scriptfile.php > scriptfileoutput.txt

PHP inaweza kutumika kuendesha maandishi ya PHP kwa uhuru kabisa kutoka kwa Apache, lakini sina uhakika kuwa utaratibu wa tundu utafanya kazi bila Apache sikujaribu kuiendesha bila Apache - ilionekana kuwa haina maana kwangu. Kuzindua kupitia koni inachukuliwa kuwa sahihi zaidi kuliko kupitia kivinjari, lakini kama vile kuzindua kupitia kivinjari, haiwezi kutatua matatizo kadhaa. Labda uzinduzi kama huo utatuokoa kutoka kwa kusimamisha hati tunapoanzisha tena Apache, na hii haiwezekani, lakini nini cha kufanya ikiwa seva nzima ya wavuti au mashine ya mtandaoni imewashwa upya. Utalazimika kwenda kwa seva mwenyewe na kuendesha hati, kwa kweli, ikiwa una mradi mkubwa wa mchezo na kuna wasimamizi wa mfumo waliojitolea ambao hufuatilia hali ya michakato kwenye seva na kuna hati za kuanzisha na kupakia seva ya ws. pamoja na Apache na kila kitu kingine, kwa hali ambayo hii ndiyo chaguo pekee sahihi, lakini tunazungumzia kuhusu kaya, njia rahisi ya kutekeleza seva ya ws katika PHP kwa miradi ndogo. Pia, wakati mwingine kuna shida wakati wa kuendesha hati ya PHP kutoka kwa koni, ambayo huacha kutekeleza hati ya PHP wakati huo huo unapotoka kwenye koni, hii ni kwa sababu ya ukweli kwamba utekelezaji wa hati ya PHP ulifungwa kwenye kikao chako. kama mteja. Kwa nadharia, hii inapaswa kuponywa kwa kutumia mstari wa ignore_user_abort(true) kwenye hati ya PHP, lakini hii haisaidii kila wakati kwa sababu ya mipangilio tofauti ya PHP. Katika kesi hii, hutumia hila kwa kutoa hati ya PHP /dev/null mkondo, ambayo itazingatia kama mteja na haitaacha kufanya kazi unapotoka kwenye koni.

$ php -q scriptfile.php scriptfileoutput.txt &

Ampersand mwishoni inahitajika ili uweze kushinikiza Ctrl + C na kurudi kwenye console na mchakato unabaki kwenye kumbukumbu. Au unaweza kutumia matumizi ya nohup.

Kwa kuongeza, itakuwa muhimu kujua kwamba kwenye jukwaa la Windows unaweza kuendesha script kutoka kwenye console

> w:\usr\local\php5\php.exe -q w:\home\localhost\www\echows.php

Ikiwa kila kitu kimefanywa kwa usahihi, basi ni bora kutumia matumizi ya Msimamizi: Mfumo wa Udhibiti wa Mchakato, inafuatilia uendeshaji wa mchakato, inaanza ikiwa ni lazima, na inasajili shambulio. Hili ni jambo zuri la kufanya unapofanya mradi mzito na kuwa na seva iliyojitolea au angalau VDS ovyo wako.

ws udhibiti wa seva mchakato wa PHP kutoka kwa kivinjari

Kama matokeo ya kusoma njia za kuzindua hati za PHP, nilikuja na wazo rahisi sana - kutekeleza kwa upande wa mteja wa ws, kabla ya kuunganishwa na seva ya ws, ombi la XMLHttpRequest() kwa hati ya PHP inayoangalia hali ya ws mchakato wa seva na kuianzisha ikiwa haifanyi kazi. Wazo pia liliibuka kutekeleza kitu kama ukurasa wa msimamizi wa seva ya ws, ambayo kumbukumbu ya matukio ya hivi punde ingepatikana: ilipozinduliwa, kwa nini ilianguka, ni nani aliyeanzisha uzinduzi uliofuata, nk., ambayo ingewezekana. kuamuru seva ya ws kuanza tena, kuzima, kufunga miunganisho yote, nk.

Nini kinapaswa kuwa kiolesura cha mteja wa ws:

  • Kuangalia hali ya seva ya ws na kuanza ikiwa seva haipatikani

Nini kinapaswa kuwa kiolesura cha msimamizi wa ws:

  • Taarifa kuhusu hali ya seva ya ws, ikiwezekana na idadi ya miunganisho na kiasi cha kumbukumbu iliyochukuliwa
  • Tazama kumbukumbu
  • Kusimamisha seva ya ws

Kwa hiyo, kwa utekelezaji tunahitaji seva ya ws, ambayo lazima ihifadhiwe kwenye kumbukumbu kwa kutumia mojawapo ya njia zilizoelezwa hapo awali, i.e. unahitaji kumfanya kuwa pepo wa ubora. Kuna nakala bora juu ya michakato na demons kwenye Habre. Walakini, kwa bahati mbaya, ni ngumu zaidi kupata mwenyeji anayeunga mkono amri ya kuunda michakato ya watoto katika PHP pcntl_fork kuliko msaada wa soketi, kwa hivyo itabidi uachane na njia ya kawaida ya daemonization. Pia, programu kama hizo haziwezi kutatuliwa kwenye Windows kwa sababu uma zipo kwenye mifumo endeshi ya *nix pekee. Lakini bado tuliweza kukusanya kitu muhimu kutoka kwa kifungu, ambacho ni kuunda faili ya PID kuhifadhi kitambulisho cha mchakato, ambayo haitaruhusu michakato miwili kufanya kazi wakati huo huo - zaidi juu ya hii hapa chini.

Kama matokeo, nilirekebisha kidogo nambari ya PHP ya hati ya seva ya ws echo kwa kuweka ndani yake nambari ya kubadili mitiririko ya pembejeo/pato STDIN, STDOUT, STDERR na, kwa hivyo, kurahisisha uzinduzi wa seva ya ws kutoka kwa koni:

$ php -q /home/path/echows.php &

Nilipata daemon ambayo inafanya kazi vizuri bila kutumia pcntl_fork. Hupitia dashibodi, hujifungua kutoka kwa dashibodi na hujibu kikamilifu maombi yote ya mtumiaji kwenye ws://yourdomain.com:8889, na hufunga ipasavyo ujumbe wa "ZIMA" unapotumwa. Lakini shida ni kwamba haiwezekani kuangalia ikiwa daemon inaendesha au la na kwa hivyo epuka kuzinduliwa kwa daemon maradufu. Ndio, wakati wa kuanza, faili ya pid_file.pid imeundwa, ambayo huhifadhi kitambulisho cha mchakato (nambari ya kipekee ya mchakato katika mfumo wa OS *nix) wa daemon yetu, na wakati daemon imefungwa kwa usahihi, kwa mfano, wakati wa kupokea " IMEZIMWA” ujumbe, faili hii itafutwa. Wakati wa kuanza, unaweza, kwa kweli, kuangalia uwepo wa faili hii, na ikiwa faili iko, basi ripoti kwamba daemon tayari inaendesha na kwa hivyo epuka uzinduzi maradufu, lakini nini cha kufanya ikiwa daemon ilikamilisha kazi yake vibaya na ilifanya. usifute pid_file.pid faili, kwa hali ambayo daemon yetu haitafanya kazi tena. Tena, kwa Habre tulifanikiwa kupata kazi bora ya kuangalia uwepo wa pepo.


ikiwa(ni_faili($pidfile)) (
// angalia uwepo wa mchakato, kazi ya posix_kill inaweza kuwa ya zamani, inaweza kuhitaji uingizwaji wakati wa kuhamia PHP 5.3+
ikiwa(posix_kill($pid,0)) (
//daemon tayari inafanya kazi
kurudi kweli;
) mwingine (

ikiwa(!tenganisha($pidfile)) (
consolemsg("ERROR");
kutoka(-1);
}
consolemsg("Sawa");
}
}
kurudi kwa uwongo;
}

Na tena shida ni kwamba kazi ya posix_kill($pid,0) iligeuka kuwa haifai kwa sababu sawa na pcntl_fork. Sikuweza kuvumilia hili na tena nikatengeneza suluhisho la "janja". Kwa sababu Bado niliamua kutekeleza utendaji unaoonyesha hali ya seva ya ws, basi kwa njia moja au nyingine nitahitaji kazi inayoonyesha hali ya mchakato katika OS. Ili kutekeleza kazi hii, tutatumia exec() amri, ambayo inakuwezesha kutekeleza amri yoyote ya console. Na ikiwa tutatimiza

Exec("ps -aux -p ".$pid, $output);

basi kama matokeo, habari kuhusu pepo (mchakato) itatolewa kwa safu ya $output, ikiwa daemon inaendesha na ina $pid.

MTUMIAJI PID %CPU %MEM VSZ RSS TT STAT ILIYOANZA WAKATI AMRI aow 62335 0.3 0.1 120080 16020 ?? SJ 4:31PM 0:00.02 php -q echows.php

Kwa hivyo, tulipata vitendaji vya kufanya kazi bila posix_kill, ambayo huangalia ikiwa daemon inaendesha na kutoa data kuihusu ipasavyo.

Sasisha 2017.08.14: Mfano hapo juu unatumia syntax ya BSD ya amri ya ps. Kwa mifumo mingi ya *nix itakuwa sawa, na amri hii itaorodhesha michakato yote badala ya moja iliyo na pid. Kuanzia kwenye paneli ya msimamizi wa seva ya ws v.0.4. na hapo juu hutumia syntax ya kawaida, ambayo inafanya kazi kwa usahihi katika mifumo mingi ya *nix.

Kazi isDaemonActive($pidfile) (
ikiwa(ni_faili($pidfile)) (
$pid = file_get_contents($pidfile);
// pata hali ya mchakato
$status = getDaemonStatus($pid);
if($status["run"]) (
//daemon tayari inafanya kazi
consolemsg("daemon tayari inaendesha info=".$status["info"]);
kurudi kweli;
) mwingine (
// kuna faili ya pid, lakini hakuna mchakato
consolemsg("hakuna mchakato na PID = ".$pid.", usitishaji wa mwisho haukuwa wa kawaida...");
consolemsg("jaribu kutenganisha faili ya PID...");
ikiwa(!tenganisha($pidfile)) (
consolemsg("ERROR");
//Siwezi kuharibu faili ya pid. kosa
kutoka(-1);
}
consolemsg("Sawa");
}
}
kurudi kwa uwongo;
}

fanya kazi getDaemonStatus($pid) (
$matokeo = safu ("run" => uongo);
$output = null;
exec("ps -aux -p ".$pid, $output);

If(count($output)>1)(//Ikiwa matokeo ya utekelezaji ni zaidi ya mstari mmoja, basi kuna mchakato! Kwa sababu mstari wa kwanza ni kichwa, na wa pili tayari ni mchakato.
$matokeo["run"] = kweli;
$result["info"] = $output;//line na taarifa kuhusu mchakato
}
kurudi $matokeo;
}

Sasa kwa kuwa kazi ya kuangalia hali iko tayari, tunaweza kuanza daemon si kutoka kwa console, lakini kwa kutekeleza amri PHP exec("php -q echows.php &"); na kuzima daemon na ujumbe ZIMWA.
Jambo la mwisho ambalo linahitaji kubadilishwa katika seva ya ws echo na mteja wa ws ni kuongeza ombi la AJAX kwa seva kabla ya kuunganishwa, ambayo inaweza kuinua ikiwa inasema uwongo. Sasa hatuna haja ya kufikiria juu ya hali gani pepo yuko, kwa sababu ... Tunajua kwamba hata kama seva iliwashwa upya, mteja ataipokea kwa simu ya kwanza.

Paneli ya kudhibiti seva ya kivinjari ws

Nitatengeneza mfumo rahisi wa kudhibiti na kufuatilia pepo. Ni rahisi sana na ina faili kadhaa echowsadmin.html (jopo la msimamizi), echowsadmin.js (mantiki ya jopo la msimamizi), echowsadmin.php (mantiki ya usimamizi wa seva ya ws echo). Ilibadilika kuwa rahisi sana kukuza mfumo huu;

Ili kuzuia mtumiaji yeyote kuzima daemon kwa amri ya OFF, niliondoa utendaji huu kutoka kwa nambari ya PHP ya seva ya ws echo. Ipasavyo, kwa kutekeleza kazi ya kuzima daemon kutoka kwa mfumo wa kudhibiti. Utekelezaji sio wa kifahari zaidi, badala ya ishara mimi hutumia faili ya off_file.pid, lakini imehakikishiwa kuwa hakuna maktaba ya ziada inahitajika na kuzima hutokea kwa usahihi. Kwa sababu kwenye seva ya ws, kitanzi cha wakati hutegemea wakati wa kusikiliza ujumbe wa soketi, kisha baada ya kuunda off_file.pid unahitaji kuunganisha kwenye seva ya ws ili kufikia mwisho wa kitanzi na kuangalia uwepo wa off_file.pid, kwa hili. Ninafanya hila kidogo, kuiga uunganisho wa tundu kutoka kwa echowsadmin.php na ninaanzisha ucheleweshaji fulani ili kila kitu kifanye kazi na script inaripoti kukamilika kwa mafanikio ya kazi. Pakua (kumbukumbu iliyopitwa na wakati, mpya zaidi), usisahau kuonyesha anwani ya eneo la faili ya echowsadmin.php kwenye mwenyeji wako katika echowsadmin.js kwenye mstari wa 10, anwani ya echowsstart.php kwenye socket.js na anwani ya seva ya ws katika echowsadmin.php (au tuseme sio anwani , na bandari, kwa kuwa faili lazima iwe kwenye seva, anwani itakuwa 127.0.0.1 kila wakati), ambapo mteja wetu mdogo wa seli moja atajaribu kuunganisha wakati seva ya mwangwi ya ws imezimwa. Sikuunda kitufe ili kuanza tena seva ya ws echo, kwani ni wazi kuwa kufanya hivyo unahitaji kubonyeza kuacha, na kisha kuanza, na hakuna haja ya kitendo hiki kwenye kitufe kimoja. Mfumo huu wote wa udhibiti hufanya kazi tu chini ya mifumo ya uendeshaji ya *nix, i.e. juu ya mwenyeji. Na hivi ndivyo anavyoonekana.

Ni wazi kwamba kuna mambo mengi ambayo yanaweza kuboreshwa:

  • Boresha wasilisho na ufanye maelezo ya kina zaidi kuhusu hali ya seva ya ws
  • Ongeza pato kwenye logi ya maelezo ya kina zaidi kuhusu kumbukumbu iliyochukuliwa na idadi ya miunganisho ya sasa
  • Jaribu mfumo wa uendeshaji na utengeneze toleo la Denver na Windows
  • Fanya idhini

Lakini, katika kesi yangu, kazi ilikuwa kujifanya chombo rahisi cha kufuatilia hali ya pepo kupitia mtandao. Kwa njia, jambo hili, lililobadilishwa kidogo, linaweza kutumika kufuatilia daemon yoyote, sio tu ws.

Kuhusu utekelezaji wa Windows OS, maeneo yote ambapo pid inaweza kupitishwa kwa kuangalia na hivyo kuhakikisha kuanza.

Ikiwa (strtoupper(substr(PHP_OS,0,3)) === "WIN") ( )

Ikiwa daemon inafanya kazi au la inatosha kuangalia tu kwa uwepo wa faili ya pid.

Nilipokuwa mwishoni mwa wiki, nilisahau kuzima seva ya ws echo, kwa sababu hiyo, maisha yake yalikuwa sekunde 233774, i.e. mahali fulani karibu na siku 3, kumbukumbu iliyochukuliwa ilibaki karibu 0.1%, ambayo inaonyesha kuwa suluhisho lina haki ya kuishi.

Maoni na maoni yanakaribishwa kila wakati. Nitaendelea kukuza mada na kutekeleza gumzo rahisi kama nilivyoahidi.

Nakala zangu kuhusu damoni za PHP na soketi za wavuti

  • Seva ya Websocket katika PHP, inayoendesha daemon katika PHP

PHP (Kiingereza PHP: Hypertext Preprocessor - "PHP: Hypertext Preprocessor"; awali Zana za Ukurasa wa Nyumbani Binafsi - "Zana za kuunda kurasa za kibinafsi za wavuti") ni lugha ya maandishi ya kusudi la jumla inayotumiwa sana kuunda programu za wavuti.

Hivi sasa, PHP inaungwa mkono na idadi kubwa ya watoa huduma wa kupangisha na ni mojawapo ya lugha kuu zinazotumiwa kuunda tovuti zinazobadilika.

Lugha ya PHP na mkalimani wake hutengenezwa na kikundi cha wapendaji kama sehemu ya mradi wa chanzo huria. Mradi huu unasambazwa chini ya leseni yake yenyewe, ambayo haioani na Leseni ya Jumla ya Umma ya GNU.

Upeo wa PHP

Katika uwanja wa programu ya wavuti, haswa upande wa seva, PHP ni moja ya lugha maarufu za uandishi (pamoja na JSP, Perl na lugha zinazotumiwa katika ASP.NET).

Umaarufu katika uwanja wa ujenzi wa tovuti unatambuliwa na kuwepo kwa seti kubwa ya zana zilizojengwa kwa ajili ya kuendeleza programu za mtandao. Ya kuu:

  • uchimbaji otomatiki wa vigezo vya POST na GET, pamoja na vigezo vya mazingira ya seva ya wavuti kwenye safu zilizoainishwa;
  • mwingiliano na idadi kubwa ya mifumo tofauti ya usimamizi wa hifadhidata (, MySQLi, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Cloudscape na Apache Derby, Informix, Ovrimos SQL, IBM Notes, DB++, DBM , dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, / InterBase, Paradox File Access, MaxDB, PDO Interface (PHP Data Objects));
  • kutuma kiotomatiki kwa vichwa vya HTTP;
  • kufanya kazi na idhini ya HTTP;
  • kufanya kazi na kuki na vikao;
  • kufanya kazi na faili za ndani na za mbali, soketi;
  • usindikaji faili zilizopakiwa kwenye seva;
  • kufanya kazi na XForms.

PHP kwa sasa inatumiwa na mamia ya maelfu ya watengenezaji. Kulingana na ukadiriaji wa Shirika la TIOBE, kulingana na data ya injini ya utafutaji, mnamo Septemba 2015, PHP ilikuwa katika nafasi ya 6 kati ya lugha za programu. Baadhi ya tovuti kubwa zinazotumia PHP ni pamoja na

Kwa lugha hii ya programu, unaweza kuunda tovuti na programu za Wavuti kwenye kompyuta yako ya ndani kupitia seva ya Apache. Tovuti nyingi za kisasa za mtandao zimeandikwa kwa lugha ya PHP. Kurasa za tovuti hizi zinabadilika, tofauti na tovuti za zamani kulingana na alama za HTML.

Taarifa zote zimehifadhiwa kwenye hifadhidata ya MySQL, ambapo taarifa zinazohitajika kwa sasa hutolewa. Watengenezaji wa programu wenye uzoefu wanaweza kuunda tovuti kutoka mwanzo, lakini kwa watumiaji wa kawaida ni bora kutumia huduma za injini zilizotengenezwa tayari (WordPress, Joomla au Drupal), ambapo unahitaji tu kuongeza maandishi yako mwenyewe na tovuti yako iko tayari. Ili kuunda Wavuti zako kwenye kompyuta yako ya karibu, unahitaji kupakua toleo jipya la PHP bila malipo. Baada ya hayo, tovuti iliyokamilishwa inaweza kupakiwa kwenye mtandao.

Uwezekano:

  • kuunda na kuhariri tovuti na programu;
  • usimamizi wa nguvu wa maudhui ya tovuti;
  • kupima injini mbalimbali kwa tovuti;
  • matumizi ya vidakuzi vya HTTP.

Kanuni ya uendeshaji:

Sasa hebu tuelewe jinsi PHP inavyofanya kazi. Kwanza unahitaji kupakua na kufunga, kwa mfano, seva ya Apache ya kawaida. Ili kufanya hivyo, unaweza kutumia vifaa vya maendeleo vilivyotengenezwa tayari vya Denwer, XAMPP, OpenServer au programu nyingine yoyote. Baada ya kusanikisha seva ya ndani, unahitaji kunakili yaliyomo kwenye kumbukumbu ya PHP kwake. Baada ya hayo, utaweza kuandika tovuti kutoka mwanzo kwenye upangishaji wako wa mtandaoni au usakinishe injini zinazohitajika za tovuti ili kuunda miradi yako ya mtandao.

Baada ya kulipia upangishaji na kikoa, unaweza kupakia tovuti yako kwenye Mtandao na kuanza kutambua uwezo wako wa ubunifu. Kutumia lugha ya PHP kutakuruhusu kuunda na kuhariri maudhui ya tovuti zako kwa haraka na kwa urahisi. Kwa mfano, ili kubadilisha muundo wa sehemu ya chini ya tovuti yako, unahitaji tu kuhariri faili moja, na mabadiliko yataonekana kwenye kila ukurasa wa mradi wako. Katika HTML, itabidi uhariri kila ukurasa mmoja mmoja.

Faida:

  • uundaji wa tovuti zenye nguvu katika PHP;
  • matumizi ya hifadhidata;
  • uwezo wa kupakua PHP ya bure kwa kompyuta yako
  • usaidizi wa kuunda hifadhidata nyingi na tovuti kwenye kompyuta ya ndani;
  • lugha ya kawaida na maarufu ya programu.

Minus:

  • Ili kufanya kazi kwenye kompyuta yako, unaweza kuhitaji kusakinisha seva pepe.

Leo, PHP ni lugha ya kawaida ya programu kwa tovuti na programu za Wavuti. Kwa hiyo, ili kuunda miradi yako mwenyewe, unahitaji tu kurekebisha mfumo wako wa Windows kwa lugha hii. Pia, ili kufanya kazi, utahitaji kusakinisha seva kwa upangishaji pepe wa tovuti zako za karibu. Kutumia lugha hii ya programu kutakuruhusu kuunda na kuendesha miradi yako ya mtandao, kwa hivyo tunakushauri kupakua toleo jipya zaidi la PHP bila malipo.

1C-Bitrix - mfumo wa utawala wa kitaalamu sana Miradi yako ya wavuti, ambayo hukuruhusu kudhibiti kwa urahisi maagizo ya duka mkondoni, ambayo hupunguza kiasi cha michakato ya monotonous na kuboresha ubora wa huduma kwa wateja.

Mbali na faida kuu za mfumo wa Bitrix, watumiaji wote mahitaji ya juu ya bidhaa hii yanajulikana kwa vigezo vya mwenyeji wa kiufundi. Tulifanikiwa kuboresha na kusanidi seva zetu. Sasa HyperHost ni bora, utendakazi wa hali ya juu .
Hapo chini tutaangalia mchakato wa usakinishaji wa mfumo huu kwenye mwenyeji wetu:
hatua ya 1
Kabla ya kuanza kusakinisha CMS Bitrix, unahitaji kufanya mabadiliko fulani kwa php.ini binafsi ya akaunti yako. Jinsi ya kufanya hivyo, angalia picha za skrini:



hatua ya 2
Baada ya kuingiza vigezo muhimu kwenye php.ini ya mtu binafsi ya CMS Bitrix, unahitaji kupakua na kupakia hati ya usakinishaji:
CMS Bitrix (bitrixsetup.php).
Unaweza kuipakua kutoka kwa tovuti rasmi 1c-bitrix.ru:
http://www.1c-bitrix.ru/download/cms.php

hatua ya 3
Ifuatayo, tunahitaji kuipakia kwenye seva kwenye saraka ya nyumbani ya tovuti yako.
Hii inaweza kufanywa ama kupitia paneli ya kudhibiti Cpanel au kutumia FTP
Ili kupakua kupitia paneli ya kudhibiti unahitaji kufanya yafuatayo:






hatua ya 4
Ili kufunga tovuti, tunahitaji kuunda database (DB), mtumiaji wa DB na kuongeza mtumiaji kwenye DB iliyoundwa








hatua ya 5
Hebu tuanze kusakinisha CMS Bitrix

Muhimu! Unaweza kuangalia utendakazi wa tovuti kwenye mwenyeji wetu ndani ya nchi, bila kubadilisha DNS (ujumbe wa kikoa), unahitaji tu kuandika ingizo lifuatalo kwenye faili ya majeshi:

53.114.112.45 domain.ru

Wapi,
domain.ru ni kikoa chako.
53.114.112.45 - Anwani ya IP ya seva yako mwenyeji. Ili kuona ni IP gani tovuti yako iko kwenye kampuni yetu baada ya kuagiza, unahitaji kufanya yafuatayo:
Nenda kwenye paneli ya udhibiti wa tovuti katika sehemu ya "Vikoa vya Wavuti" na uone ni anwani gani ya IP imeainishwa kwa tovuti yako;

Faili ya majeshi iko katika njia zifuatazo:

- Windows XP/2003/Vista/7: WINDOWS\system32\drivers\etc\hosts
- Windows NT/2000: WINNT\system32\drivers\etc\hosts
- Windows 95/98/ME: WINDOWS\ majeshi
- Mac OS X 10.2+: /private/etc/hosts
- Linux: /etc/hosts

Baada ya kufanya mabadiliko haya, toleo la tovuti ulilohamisha kwa upangishaji wetu litafunguliwa kwenye domain.ru kutoka kwa kivinjari cha kompyuta yako.
Usisahau, baada ya kuangalia utendaji wa tovuti yako, kufuta ingizo hili kutoka kwa faili ya majeshi.
Nenda kwa anwani katika kivinjari chako http://your_domain/bitrixsetup.php, chagua usambazaji utakaosakinisha.
Tutakuonyesha mfano wa kusakinisha CMS kwenye usambazaji wa "Usimamizi wa Tovuti" na toleo la onyesho


Inayofuata ni kupakia usambazaji kwenye seva na kuifungua.



hatua ya 6

Ufungaji wa CMS
Baada ya kufungua usambazaji, utaelekezwa kwenye ukurasa wa usakinishaji wa moja kwa moja wa CMS


Soma na uthibitishe makubaliano ya leseni

hatua 7

Ingiza data yako na uweke tiki karibu na kipengee "Sakinisha katika usimbaji wa UTF-8", kisha uende kwa hatua inayofuata.


hatua 8

Katika hatua hii, ukurasa wa uthibitishaji unaonyeshwa hapa mipangilio ya seva inakaguliwa kwa kufuata usakinishaji na uendeshaji sahihi wa CMS Bitrix.


hatua 9

Kuanzisha muunganisho kwenye hifadhidata.
Katika sehemu unahitaji kuonyesha data ya unganisho kwenye hifadhidata ambayo tumeunda ndani hatua ya 4


hatua ya 10

Hatua hii husakinisha bidhaa kiotomatiki

hatua 11

Unda msimamizi wa tovuti hii
Unahitaji kujaza sehemu zinazohitajika: kuingia, nenosiri na uthibitisho wa nenosiri.

hatua 12

Chagua kiolezo cha usakinishaji.
Wakati wa ufungaji kuna 1 tu - "iliyowekwa", kwani hii ni ufungaji wa kawaida.

Kuchagua mandhari


Ingiza maelezo kuhusu kampuni yako ambayo unasakinisha tovuti na uanze kusakinisha mandhari uliyochagua.


Hongera! Umesakinisha CMS Bitrix.
Ikumbukwe kwamba matokeo ya majaribio yalionyesha matokeo ya juu sana ya utendaji wa 1C kwenye seva zetu.
Kwenye ushuru wa VPS-Start kutoka kwa mstari wetu, utendaji ulikuwa 88,58 kwa kiwango 30

ilionyesha matokeo bora zaidi - 127,84 na kiwango - 30
Takwimu hizi ni kati ya za juu zaidi kati ya makampuni mwenyeji katika CIS.
HyperHost inakutakia kazi nzuri!

mara 8775 Mara 9 zilizotazamwa leo

Hakuna tovuti iliyokamilika bila urambazaji au, kama wanavyoiita, "menyu ya tovuti." Kwa hivyo, orodha ya tovuti inaweza kuwa ngazi moja au ngazi mbalimbali kwa namna ya mti. Ikiwa hakuna matatizo fulani katika suala la utekelezaji na orodha ya ngazi moja, basi wakati wa kuunda orodha ya ngazi mbalimbali unahitaji kufikiria kwa makini.

Jambo muhimu zaidi katika kazi hii ni kuunda hifadhidata kwa menyu yetu ya viwango vingi. Wacha tuunde jedwali la Vitengo na sehemu tatu kitambulisho, kichwa, mzazi Wapi:

  • ID- kitambulisho
  • Kichwa- Jina la menyu
  • Mzazi- Mzazi wa kategoria chaguo-msingi 0

Sehemu inawajibika kwa kugawa menyu Mzazi Kama Mzazi = 0, basi kategoria hii ni kategoria ya mzazi. Ili kuongeza vizazi kwenye kategoria ya mzazi, unahitaji kubainisha katika sehemu kuu ID mzazi sahihi. Kwa mfano:

Majedwali yenye kategoria

Kama inavyoonekana kutoka kwa jedwali, kitengo cha mzazi Magari kuna vizazi viwili - hii ni Mazda Na Honda kuhusiana na shamba Mzazi. Na kategoria Pikipiki vizazi viwili ni Kawasaki Na Harley. Wakati huo huo, jamii ya Boti haina kizazi. Natumai unaelewa jinsi ya kuunganisha kategoria.

Ifuatayo, tunahama kutoka kwa maneno kwenda kwa mazoezi. Wacha tuunde jedwali la Vitengo.

TUNZA JEDWALI IKIWA `kategoria` (`id` int(10) haijatiwa saini NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) haijatiwa saini NOT NULL, PRIMARY KEY (`id`) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- Utupaji wa data kutoka kwa jedwali `kategoria` -- WEKA NDANI YA `kategoria` (`id`, `kichwa`, `mzazi`) MAADILI (1, "Magari", 0), (2, "Pikipiki", 0 ) , (3, "Mazda", 1), (4, "Honda", 1), (5, "Kawasaki", 2), (6, "Harley", 2), (7, "Mazda 3", 3 ), (8, "Mazda 6", 3), (9, "Sedan", 7), (10, "Hatchback", 7), (11, "Boti", 0), (12, "Liftback" , 8), (13, "Crossover", 8), (14, "Nyeupe", 13), (15, "Nyekundu", 13), (16, "Nyeusi", 13), (17, "Kijani" , 13), (18, "Mazda CX", 3), (19, "Mazda MX", 3);

Algorithm ya kazi ni pamoja na yafuatayo:

Unda muunganisho kwenye hifadhidata

swala("WEKA MAJINA "utf8""); /* * Hii ndiyo njia "rasmi" inayolenga kitu kufanya hivi * hata hivyo $connect_error haikufanya kazi hadi matoleo ya PHP 5.2.9 na 5.3.0. */ if ($mysqli->connect_error) ( die("Kosa la muunganisho (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Ikiwa unahitaji kuwa na uhakika wa upatanifu na matoleo kabla ya 5.2 .9, * ni bora kutumia msimbo huu */ if (mysqli_connect_error()) ( die("Hitilafu ya muunganisho (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

Kuandika chaguo za kukokotoa ili kupata data kutoka kwa jedwali la Vitengo

//Pata safu ya menyu yetu kutoka kwa hifadhidata kama kazi ya safu getCat($mysqli)( $sql = "CHAGUA *KUTOKA `Kategoria`"; $res = $mysqli->query($sql); //Unda safu ambapo ufunguo wa safu ni kitambulisho cha menyu $cat = safu(); huku($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $ paka)

Tunapata safu kama hii, ambapo ufunguo wa safu ni kitambulisho cha kitengo.

Kazi ya ujenzi wa mbao ngumu kutoka kwa Tommy Lacroix

//Kazi ya kuunda mti kutoka kwa safu kutoka kwa kazi ya Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Kama hakuna viambatisho ikiwa ( !$node[" parent"])( $tree[$id] = &$node; )else( //Ikiwa kuna watoto, basi rudia kupitia safu $dataset[$node["parent"]]["watoto "][$id] = &$ node; ) rudisha $tree;

Tunapata safu kwa namna ya mti

Hati nzima

swala("WEKA MAJINA "utf8""); /* * Hii ndiyo njia "rasmi" inayolenga kitu kufanya hivi * hata hivyo $connect_error haikufanya kazi hadi matoleo ya PHP 5.2.9 na 5.3.0. */ if ($mysqli->connect_error) ( die("Kosa la muunganisho (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Ikiwa unahitaji kuwa na uhakika wa upatanifu na matoleo kabla ya 5.2 .9, * ni bora kutumia msimbo huu */ if (mysqli_connect_error()) ( die("Hitilafu ya muunganisho (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Pata safu ya menyu yetu kutoka kwa hifadhidata kama kazi ya safu getCat($mysqli)( $sql = "CHAGUA *KUTOKA `categories`"; $res = $mysqli->query($sql); //Unda safu ambapo ufunguo wa safu ni kitambulisho cha menyu $cat = array(); huku ($row = $res->fetch_assoc())( $cat[$row["id"]] =$row;) return $cat; kujenga mti kutoka kwa safu kutoka kwa kazi ya Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Kama hakuna viambatisho ikiwa (!$node[ "mzazi"])( $tree[$id] = &$node; )else( //Ikiwa kuna vizazi, basi, tupitishe safu $dataset[$node["parent"]]["childs"][ $id] = &$node; ) ) return $tree ) //Pata safu iliyoandaliwa na data $cat = getCat($mysqli); // Unda menyu ya mti $tree = getTree($cat); //Kiolezo cha kuonyesha menyu katika mfumo wa kitendakazi cha mti tplMenu($category)( $menu = "
  • ". $category["title"].""; if(isset($category["childs"]))( $menu .= "
      ". showCat($category["childs"]) ."
    "; ) $menyu .= "
  • "; return $menu; ) /** * Soma kiolezo chetu kwa kujirudia **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) rudisha kamba ya $) //Pata ghafi ya HTML $cat_menu = showCat($tree);
      ".$paka_menu."
    "; ?>

    Matokeo ya kazi

    Menyu ya viwango vingi katika PHP + MySQL kwa paneli ya msimamizi

    Ikiwa unataka kutumia menyu hii kwenye paneli ya msimamizi wa tovuti yako, basi unahitaji kuandika upya vipengele kadhaa tplMenu(), showCat().

    ".$category["title"].""; ) mwingine( $menu = " "; ) if(isset($category["childs"]))( $i = 1; kwa($j = 0; $j< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    Matokeo ya kazi

    Chagua Magari → Mazda →→ Mazda 3 →→→ Sedan →→→ Hatchback →→ Mazda 6 →→→ Liftback →→→ Crossover →→→→ Nyeupe →→→→ Nyekundu →→→→ Nyeusi →→→→ Kijani →→ Mazda CX →→ Mazda MX → Pikipiki za Honda → Kawasaki → Boti za Harley