Kipindi cha uunganisho. Vipindi katika PHP. Kwa mara nyingine tena kuhusu session_start() kazi

Kikao ni nini?

Katika teknolojia ya kompyuta, hasa katika mitandao, kipindi ni ubadilishanaji wa taarifa unaokaribia kila mara, unaojulikana pia kama muunganisho au mazungumzo kati ya vifaa viwili vinavyoingiliana au kati ya mtumiaji na kompyuta (tazama mada ya Utaratibu wa Utambulisho). Kikao kinaanzishwa kwa wakati fulani na kinakatishwa baada ya kipindi fulani. Wakati wa kipindi kilichoanzishwa, zaidi ya ujumbe mmoja hupitishwa kwa kila upande. Kwa kawaida, kikao ni dhabiti, yaani, angalau mmoja wa wahusika wanaoingiliana lazima ahifadhi habari kuhusu historia ya kikao ili kudumisha uwezo wa kubadilishana habari, kinyume na ubadilishanaji usio na uraia, kiini chake ambacho ni ubadilishanaji wa maombi huru. na majibu.

Vipindi vya muunganisho vinaweza kuwa sehemu ya itifaki au huduma kwenye safu ya programu, safu ya kipindi, au safu ya usafiri ya muundo wa OSI.

Router hutumia jedwali la kikao kuhifadhi habari za kikao. Jedwali huchukua baadhi ya rasilimali za kumbukumbu na CPU kwa vitendakazi kama vile kuhesabu vipindi. Ukubwa wa kikao katika meza ni fasta; ikiwa imejaa, router haiwezi kusambaza habari hata ikiwa kuna mkondo wa data ya pato.

Hebu tujaribu kueleza madhumuni ya kipindi kwa kutumia mifano ifuatayo.

1. Unapofungua tovuti, kwa mfano www.. Kila kitu kitatokea kwa dakika moja tu, hivyo huna haja ya kuwa na wasiwasi kuhusu kasi ya muunganisho wako wa Mtandao. Lakini kwa nini basi vikao vingi vinahitajika? Tovuti ina habari mbalimbali - picha nyingi, video. Ili kufungua ukurasa kwenye kivinjari, unahitaji kuzipakua kwenye folda ya muda kwenye kompyuta yako.

2. Tunapopakua kupitia BT, inahitaji vipindi vingi. Takriban vipindi 2000 vinahitajika wakati wa kuanzishwa, lakini idadi yao itapungua kwa upakiaji thabiti. Orodha ya kipindi hapa chini inaonyesha idadi ya vipindi vya sasa kwa kasi zinazolingana za upakuaji zinazoingia na zinazotoka kupitia BT.

Hii pia hufanyika wakati wa kutumia programu zingine za P2P, kwani zinafanya kazi kwa njia sawa.

Tafadhali kumbuka kuwa hakuna uhusiano wazi kati ya kasi na idadi ya vipindi. Ikiwa una idadi kubwa ya vipindi, kasi haitakuwa ya juu kila wakati, kama vile kuwa na kasi kubwa haimaanishi kuwa na idadi kubwa ya vipindi. Lakini, kimsingi, wakati kuna vikao vingi, kasi ni kubwa zaidi.

Kwa nini uweke kikomo cha kikao?

1) Hii huepuka kushuka kwa kasi kwa mtandao kwani programu ya P2P ina idadi ndogo ya vipindi.

2) Hii inakuwezesha kuepuka ngozi ya rasilimali za mtandao na virusi yoyote au aina nyingine ya mashambulizi ya mtandao ambayo yanahitaji idadi kubwa ya vipindi.

Jinsi ya kuweka vikwazo vya kikao kwenye routerTP- KIUNGO ?

Hatua ya 1

Fungua kivinjari chako na uingie anwani ya IP ya mtandao ya router kwenye bar ya anwani; chaguo-msingi ni 192.168.1.1, kisha bonyeza Enter.

Hatua ya 2

Ingiza jina lako la mtumiaji na nenosiri ili kuingia kwenye kiolesura cha wavuti; Kwa chaguo-msingi, kuingia na nenosiri ni admin.

Hatua ya 3

Bofya Kikomo cha Kipindi -> Kikomo cha Kipindi kwenye upande wa kushoto wa ukurasa, washa kipengele cha Ukomo wa Kipindi, kisha ubofye kitufe cha Hifadhi ili kuhifadhi mipangilio.

Hatua ya 4

Bofya Ongeza Mpya ili kusanidi sheria ya kizuizi cha kikao, ingiza anwani ya IP ya mtandao ya kompyuta ambayo unataka kuweka kizuizi, na kuweka idadi ya juu ya vipindi (Max Session).

Kumbuka

Max Session ni kikomo cha mtu binafsi kwa kompyuta mahususi, hata kama umeweka safu ya anwani za mtandao.

Kwa kuwa HTTP ni itifaki ya seva ya mteja, kipindi cha HTTP kina awamu tatu:

  1. Mteja huanzisha muunganisho wa TCP (au muunganisho mwingine ikiwa usafiri wa TCP hautumiki).
  2. Mteja hutuma ombi na kusubiri jibu.
  3. Seva huchakata ombi na kutuma jibu lililo na msimbo wa hali na data muhimu.

Tangu HTTP/1.1, muunganisho haujafungwa baada ya awamu ya tatu kwa sababu mteja anaruhusiwa kuanzisha ombi lingine. Hiyo ni, awamu ya pili na ya tatu inaweza kurudiwa.

Kuanzisha muunganisho

Kwa kuwa HTTP ni itifaki ya seva ya mteja, unganisho huwekwa kila wakati na mteja. Kufungua muunganisho katika HTTP kunamaanisha kuanzisha muunganisho kupitia usafiri unaofaa, kwa kawaida TCP.

Kwa upande wa TCP, lango chaguomsingi la seva ya HTTP kwenye kompyuta ni port 80, ingawa nyingine pia hutumiwa kwa kawaida, kama vile 8000 au 8080. URL ya ukurasa wa kupakia ina jina la kikoa na lango, ambalo linaweza kuachwa kama mradi inalingana na bandari chaguo-msingi.

Tunamaanisha: Muundo wa seva ya mteja hauruhusu seva kutuma data kwa mteja bila kuomba data hiyo kwa uwazi. Ili kutatua tatizo hili, watengenezaji wavuti hutumia mbinu mbalimbali: mara kwa mara kubandika seva kwa kutumia kitu cha Javascript cha XMLHTTPRequest, API ya HTML WebSockets, au itifaki zinazofanana.

Inatuma ombi la mteja

Muunganisho unapoanzishwa, wakala wa mtumiaji anaweza kutuma ombi. (wakala wa mtumiaji kwa kawaida ni kivinjari, lakini huenda asiwe) Ombi la mteja ni maagizo ya maandishi yaliyotenganishwa na CRLF (mapumziko ya laini). Ombi lenyewe linajumuisha vizuizi vitatu:

  1. Mistari ya kwanza ina njia ya ombi na vigezo vyake:
    • njia ya hati - URL kabisa bila kutaja itifaki na jina la kikoa
    • Toleo la itifaki ya HTTP
  2. Kila mstari unaofuata ni kichwa cha HTTP na huwasilisha kwa seva taarifa fulani kuhusu aina za data inazopendelea (kwa mfano, lugha gani, aina za MIME) au maagizo ambayo hubadilisha tabia ya seva (kwa mfano, kutotuma jibu ikiwa tayari iko kwenye kashe). Vijajuu hivi vya HTTP huunda kizuizi ambacho huisha na laini tupu.
  3. Kizuizi cha mwisho ni cha hiari na kina data ya ziada. Inatumiwa zaidi na njia ya POST.

Maombi ya mfano

Tunapata ukurasa mkuu wa tovuti, na kuwaambia seva kuwa wakala wa mtumiaji anapendelea ukurasa katika Kifaransa, ikiwezekana:

PATA / HTTP/1.1 Mpangishi: tovuti Kubali-Lugha: fr

Makini na mstari tupu mwishoni, ambao hutenganisha kizuizi cha data kutoka kwa kichwa cha kichwa. Kwa kuwa ombi halina Urefu wa Maudhui: Kichwa cha HTTP, kizuizi cha data hakina kitu na seva inaweza kuanza kuchakata ombi mara tu inapopokea laini tupu, inayoonyesha mwisho wa vichwa.

Tunatuma matokeo ya uwasilishaji wa fomu:

POST /contact_form.php HTTP/1.1 Mwenyeji: tovuti Urefu wa Maudhui: 64 Aina ya Maudhui: application/x-www-form-urlencoded name=Joe%20User&request=Tuma%20me%20one%20of%20your%20catalogue

Mbinu za Ombi

HTTP inafafanua seti ya mbinu za ombi zinazoonyesha kitendo kinachohitajika kwenye rasilimali. Ingawa zinaweza pia kuwa nomino, njia hizi za ombi wakati mwingine huitwa amri za HTTP. Maombi ya kawaida ya GET na POST ni:

  • GET inatumika kuomba yaliyomo kwenye rasilimali maalum. Ombi linalotumia GET linapaswa kupata data pekee.
  • Njia ya POST hutuma data kwa seva ili iweze kubadilisha hali yake. Njia hii hutumiwa mara nyingi kwa fomu za HTML.

Muundo wa majibu kutoka kwa seva

Baada ya wakala aliyeunganishwa kutuma ombi lake, seva ya wavuti huichakata na kutuma jibu. Kwa mlinganisho na ombi la mteja, jibu la seva ni maagizo ya maandishi yaliyotenganishwa na CRLF, yaliyowekwa katika vizuizi vitatu tofauti:

  1. Mstari wa kwanza ni mstari wa hali, unaojumuisha uthibitisho wa toleo la HTTP lililotumiwa na hali ya ombi (na maana yake katika fomu inayoweza kusomeka na binadamu).
  2. Mistari ifuatayo ni vichwa vya HTTP ambavyo humpa mteja habari fulani kuhusu data inayotumwa (kwa mfano, aina, saizi, kanuni za mbano, vidokezo vya akiba). Kama tu katika kesi ya ombi la mteja, vichwa hivi vya HTTP huunda kizuizi kinachoishia na laini tupu.
  3. Kizuizi cha mwisho kina data (ikiwa ipo).

Majibu ya sampuli

Imepokea ukurasa wa wavuti kwa ufanisi:

HTTP/1.1 200 SAWA Tarehe: Sat, 09 Okt 2010 14:28:02 GMT Server: Apache Iliyorekebishwa Mwisho: Tue, 01 Des 2009 20:18:22 GMT ETag: "51142bc1-7449-5b8b8Accept0" Urefu wa Maudhui: 29769 Aina ya Maudhui: maandishi/html(hapa inakuja baiti 29769 za ukurasa wa wavuti ulioombwa)

Ujumbe kwamba rasilimali iliyoombwa imehamishwa:

HTTP/1.1 301 Seva Iliyohamishwa Kudumu: Apache/2.2.3 (Kofia Nyekundu) Aina ya Maudhui: maandishi/html; charset=iso-8859-1 Tarehe: Sat, 09 Okt 2010 14:30:24 GMT Mahali: (hii ndio anwani mpya ya rasilimali iliyoombwa, mteja anatarajiwa kuiomba) Weka-Hai: timeout=15, max=98 Kubali- Masafa: baiti Kupitia: Moz-Cache-zlb05 Muunganisho: Keep-Alive X-Cache-Info: akiba ya X-Cache-Info: akiba ya Urefu wa Maudhui: 325 (Maudhui yana ukurasa wa kawaida ambao utaonyeshwa ikiwa mteja hawezi kufuata kiungo) 301 Imehamishwa kwa Kudumu

Imehamishwa kwa Kudumu

Hati imehamia hapa.


Apache/2.2.3 (Kofia Nyekundu) kwenye tovuti ya Bandari 80

Tuma ujumbe kwamba rasilimali iliyoombwa haipo:



Kipindi (kutoka Kilatini - sessio - mkutano, Kiingereza - kikao) ni kipindi cha muda kinachoshughulikia kazi ya mtumiaji kwenye Mtandao kutoka wakati kiungo cha kwanza kinafunguliwa hadi cha mwisho. Imehesabiwa kama tofauti ya wakati kati ya maombi ya awali na ya mwisho. Hata hivyo, ukurasa wa mwisho unaweza kuchukua muda tofauti kutazamwa na mtumiaji, ambayo kwa hivyo hufanya kupima muda kati ya maombi mawili kuwa vigumu zaidi.

Je, kipindi kinahusiana vipi na itifaki ya HTTP na COOKIES?

Kipindi ni nini kinaweza kuelezewa kulingana na itifaki ya HTTP. Kwa yenyewe, itifaki hii haina njia ya kuokoa hali kati ya shughuli mbili. Hiyo ni, kwa urahisi, kwa kufungua ukurasa mmoja na kisha kuhama kutoka kwake hadi nyingine, HTTP haitaweza kuthibitisha kwamba maombi yote mawili ni ya mtumiaji mmoja. Na hapa njia maalum ya kufuatilia inakuja kuwaokoa - usimamizi wa kikao (vikao vyetu).
Kwa hivyo, kujibu swali la kikao ni nini, tunaweza kusema kuwa ni kitu cha kimantiki kinachosaidia uhamishaji wa data kati ya maombi ya HTTP mfululizo kutoka kwa mtumiaji mmoja.
Vidakuzi, kama vile vipindi, huhifadhi maelezo kuhusu mtumiaji anapopitia kurasa tofauti na kuboresha utendakazi wa itifaki. Lakini tofauti na ya pili, ambapo data huhifadhiwa kwenye faili za muda kwenye seva, huihifadhi kwenye kompyuta ya mtumiaji kwa namna ya vipande vidogo.

Vikao ni vya nini?

Matumizi ya vikao inakuwa ya lazima wakati wa kufanya kazi na tovuti kama vile vikao, bodi za ujumbe na maduka ya mtandaoni, kwa sababu katika kesi hii ni muhimu kuokoa data kuhusu mtumiaji kwenye kurasa kadhaa.

Hatua za kikao

Kikao chote kinaweza kugawanywa katika hatua tatu:

  • ufunguzi wa kikao (mtumiaji anapoanza kufanya kazi na tovuti maalum),
  • uhasibu wa vigezo vya kikao (wakati wa kwenda kwenye kurasa tofauti),
  • mwisho wa kikao.

Kutokana na ukweli kwamba data ya kikao imehifadhiwa kwenye seva ya tatu, ni bora si kuhifadhi kiasi kikubwa cha habari ndani yao, lakini kutumia vidakuzi.

Seva ya wavuti haidumii muunganisho wa kudumu na mteja, na kila ombi huchakatwa kama jipya, bila muunganisho wowote na zile zilizopita.
Hiyo ni, huwezi kufuatilia maombi kutoka kwa mgeni huyo huyo au kumhifadhi vigezo kati ya maoni ya kurasa za kibinafsi. Ilikuwa ni kutatua matatizo haya mawili ambayo vikao vilivumbuliwa.
Kweli, vikao, kwa kifupi, ni utaratibu unaokuwezesha kutambua kivinjari kipekee na kuunda faili kwa kivinjari hiki kwenye seva ambayo vigezo vya kikao huhifadhiwa.

Sitaelezea kwa undani hitaji la utaratibu kama huo. Hizi ni kesi za vitabu vya kiada kama vile rukwama ya ununuzi kwenye duka la kielektroniki, uidhinishaji, na vile vile shida sio ndogo kabisa, kama vile kulinda sehemu ingiliani za tovuti kutoka kwa barua taka.

Kimsingi, ni rahisi sana kutengeneza analog yako ya vikao, sio kazi kama ile iliyojengwa ndani ya PHP, lakini sawa kwa asili. Kwenye vidakuzi na hifadhidata.
Wakati wa kuomba hati, tunaangalia ili kuona ikiwa kidakuzi kilicho na jina maalum kilipokelewa. Ikiwa hakuna kidakuzi, basi kiweke na uandike mstari mpya na data ya mtumiaji kwenye hifadhidata. Ikiwa kuna kuki, basi tunasoma data kutoka kwa hifadhidata. Kwa ombi lingine tunafuta rekodi za zamani kutoka kwa hifadhidata na sasa tuna utaratibu wa kikao tayari. Sio ngumu hata kidogo. Lakini kuna nuances kadhaa ambayo inafanya iwe vyema kutumia utaratibu wa kikao uliojengwa.

Ikiwa ya kwanza tu imewezeshwa, basi mwanzoni mwa kipindi (kila wakati session_start() inaitwa) kuki imewekwa kwa mteja. Kivinjari hurejesha kidakuzi hiki kwa usahihi kwa kila ombi linalofuata na PHP ina kitambulisho cha kipindi. Matatizo huanza ikiwa kivinjari hakirudi vidakuzi. Katika kesi hii, bila kupokea kuki na kitambulisho, PHP itaanza kikao kipya kila wakati na utaratibu hautafanya kazi.

Ikiwa ya pili tu imewezeshwa, basi kidakuzi hakijawekwa. Na hii ndiyo kinachotokea, kwa ajili ya ambayo, kwa kweli, inafaa kutumia utaratibu wa kikao kilichojengwa. Baada ya hati kufanya kazi yake na ukurasa kuundwa kabisa, PHP huchanganua yote na kuongeza kitambulisho cha kikao kwa kila kiungo na kwa kila fomu. Inaonekana kitu kama hiki:
Kielezo inageuka kuwa
Kielezo
na uwanja uliofichwa huongezwa kwa fomu

Na kivinjari, unapobofya kiungo chochote, au unapobofya kifungo katika fomu, itatuma katika ombi la kutofautiana tunalohitaji - kitambulisho cha kikao!
Kwa sababu za wazi, kitambulisho kinaongezwa tu kwa viungo vya jamaa.

Kinadharia, katika vipindi vyetu vya kujitengenezea nyumbani kwenye vidakuzi na hifadhidata, tunaweza kukabidhi uhamishaji wa kitambulisho kwa viungo vyote - na kisha vipindi vyetu wenyewe vitafanya kazi bila kujali vidakuzi. Lakini unakubali - inapendeza zaidi wakati mtu mwingine anafanya kazi hii? ;-)

Kwa chaguo-msingi, chaguo zote mbili zimewezeshwa katika matoleo ya hivi karibuni ya PHP. PHP inashughulikiaje hii? Cook daima huonyeshwa. Na viungo hukamilishwa kiotomatiki tu ikiwa PHP haikugundua kidakuzi kilicho na kitambulisho cha kipindi. Mtumiaji anapotembelea tovuti kwa mara ya kwanza wakati wa kipindi hiki, kidakuzi huwekwa na viungo kukamilishwa. Kwa ombi linalofuata, ikiwa vidakuzi vinatumika, PHP huona kidakuzi na kuacha kukamilisha viungo. Ikiwa vidakuzi hazifanyi kazi, basi PHP inaendelea kuongeza id vizuri kwenye viungo, na kipindi hakijapotea.
Watumiaji walio na vidakuzi vilivyowezeshwa wataona kiungo kirefu chenye kitambulisho mara moja pekee.

Phew. Uhamisho wa kitambulisho umekamilika.
Sasa kilichobaki ni kuifunga faili ya data kwa upande wa seva.
PHP itatufanyia hivi. Inatosha kuandika tu
session_start();
$_SESSION["test"]="Hujambo ulimwengu!";

Na PHP itaandika utofauti wa jaribio kwa faili inayohusishwa na kipindi hiki.
Kuna dokezo muhimu sana hapa.
Safu ya $_SESSION ni maalum.
Kwa kweli, ina vigeuzo ambavyo tunataka kufanya kupatikana katika hati mbalimbali.
Ili kuweka kigezo katika kipindi, kikabidhi tu kwa $_SESSION kipengee cha safu.
Ili kupata thamani yake, fikia tu kipengele sawa. Mfano utakuwa hapa chini.

PHP pia hushughulikia ukusanyaji wa takataka - kuondoa faili zilizopitwa na wakati. Pamoja na usimbuaji data na rundo la vitu vingine muhimu. Kutokana na huduma hii, kufanya kazi na vikao ni rahisi sana.
Hapa kwa kweli tunakuja kwa mfano wa jinsi vikao hufanya kazi.
Mfano mdogo sana:
session_start();

mwangwi "Ulisasisha ukurasa huu ".$_SESSION["counter"]++." mara.";
mwangwi"
sasisha";
?>

Tunaangalia ikiwa tunayo tofauti katika kikao; ikiwa sivyo, basi tunaiunda kwa thamani 0, na kisha kuonyesha thamani yake na kuiongeza kwa moja. Thamani iliyoongezeka itaandikwa kwa kikao, na wakati ujao script inaitwa, kutofautiana kutakuwa na thamani 1, na kadhalika.
Kila kitu ni rahisi sana.

Ili kupata vigeu vya vipindi kwenye kurasa zozote za tovuti, unahitaji kuandika mstari MMOJA TU (!) mwanzoni kabisa mwa KILA faili ambamo tunahitaji vipindi:
session_start();
Na kisha ufikie vipengele vya safu $_SESSION. Kwa mfano, ukaguzi wa idhini utaonekana kama hii:
session_start();
ikiwa ($_SESSION["imeidhinishwa"]<>1) {
kichwa("Eneo: /auth.php");
Utgång;
}

Kuondoa vigeu kutoka kwa kipindi.
Ikiwa unayo register_globals=off , basi andika tu
unset($_SESSION["var"]);
Ikiwa sivyo, basi karibu Nahitaji kuandika naye
session_unregister("var");

Makosa ya kawaida ambayo PHP hutoa wakati wa kujaribu kufanya kazi na vikao ni yafuatayo:
Wawili wao
Onyo: Haiwezi kutuma kidakuzi cha kipindi - vichwa tayari vimetumwa
Onyo: Haiwezi kutuma kikomo cha akiba cha kipindi - vichwa tayari vimetumwa

kwa sababu hiyo hiyo, suluhisho limeelezewa katika uzi huu
Cha tatu,
Onyo: open(/tmp\sess_SID, O_RDWR) imeshindwa: Hakuna faili au saraka kama hiyo (2) katika full_script_path kwenye nambari ya mstari.(hapo awali alionekana kama Onyo: Imeshindwa kuandika data ya kipindi (faili). Tafadhali thibitisha kuwa mpangilio wa sasa wa session.save_path ni sahihi (/tmp)),
ikiwa imetafsiriwa kutoka kwa Kiingereza, inaelezea tatizo kwa undani: njia ya saraka iliyotajwa katika php.ini ambapo faili za kikao zimeandikwa haipatikani. Hitilafu hii ndiyo rahisi zaidi kurekebisha. Sajili tu saraka ambayo ipo na inayoweza kuandikwa, kwa mfano,
session.save_path = c:\windows\temp
Na usisahau kuanzisha tena Apache baada ya hii.

Kama inavyotokea, akili ya mwanadamu haina kikomo, na kwa hivyo ninalazimika kuelezea:
ujumbe kuhusu hitilafu ya tatu (saraka haiwezi kupatikana) ILA LAZIMA itasababisha kuonekana kwa zile mbili za kwanza, kwani ujumbe wa makosa hutolewa kwa kivinjari na vichwa baada ya kutoweza kutumika. Kwa hivyo, usikimbilie kutafuta hitimisho la mapema, lakini andika njia sahihi kwanza!

Tatizo linalofuata la kawaida wakati wa kufanya kazi na vipindi ni urithi mzito wa register_globals. USIPE majina ya vibadilishi vya hati yanayolingana na fahirisi za safu $_SESSION!
Ukiwa na register_globals=kwenye maadili yatabadilishana na utachanganyikiwa.
Na ikiwa register_globals=off, hitilafu nyingine itaonekana: "Hati yako inaweza kutegemea athari ya kikao ambayo ilikuwepo hadi PHP 4.2.3.", ikiwa hati ina mabadiliko ya kikao ambayo hayana thamani, na tofauti ya kimataifa na jina moja. Ili kuiondoa, lazima uanzishe vigeu kila wakati kabla ya kutumia (au angalau uangalie kama kuna) na usipe vigeu vya kimataifa majina ambayo yanaambatana na faharisi za safu $_SESSION.

Ikiwa haifanyi kazi, lakini hakuna ujumbe unaoonyeshwa, kisha ongeza mistari miwili mwanzoni mwa hati inayohusika na kuonyesha makosa YOTE kwenye skrini - inawezekana kabisa kuwa kuna makosa, lakini huyaoni.
ini_set("makosa_ya_maonyesho",1);
kuripoti_kosa(E_ALL);

au tazama makosa katika error_log. Kwa ujumla, mada ya kuonyesha ujumbe wa makosa ni zaidi ya upeo wa makala hii, hivyo hakikisha tu kwamba unaweza kuwaona angalau. Unaweza kusoma zaidi kuhusu kutafuta makosa katika sehemu hii.

Ikiwa una uhakika kuwa hakuna makosa, lakini mfano uliotolewa haufanyi kazi hata hivyo, basi labda PHP hairuhusu kupitisha id kupitia URL, na vidakuzi kwa sababu fulani hazifanyi kazi.
Angalia ni nini kibaya na vidakuzi vyako.
Kwa ujumla, ikiwa vikao vyako havifanyi kazi, basi kwanza jaribu kupitisha kitambulisho cha kikao kwa mikono, ambayo ni, tengeneza kiunga na upe kitambulisho kwake:
session_start();
ikiwa (!isset($_SESSION["counter"])) $_SESSION["counter"]=0;
mwangwi "Ulisasisha ukurasa huu ".$_SESSION["counter"]++." mara.

sasisha";
?>

Hata hivyo, unapaswa kuhakikisha kuwa maagizo ya session.use_only_cookies hayajawezeshwa, ambayo huzuia PHP kukubali kitambulisho cha kipindi ikiwa kilipitishwa kupitia URL.

Ikiwa mfano huu haufanyi kazi, basi shida ni ndogo chapa(nusu ya "matatizo" na vipindi hutoka kwa jina tofauti lililoandikwa vibaya), au katika toleo la zamani sana la PHP: msaada wa vipindi ulionekana katika toleo la 4.0, na safu $_SESSION - katika 4.1 (Kabla ya hapo, $HTTP_SESSION_VARS ilitumiwa )
Ikiwa inafanya kazi, basi shida iko kwenye vidakuzi. Fuatilia ni aina gani ya kuki ambayo seva huweka kwenye kivinjari, na ikiwa kivinjari huirejesha. Ni muhimu sana kutafuta kwa kuangalia ubadilishanaji wa vichwa vya HTTP kati ya kivinjari na seva.
Ufafanuzi wa jinsi vidakuzi hufanya kazi ni zaidi ya upeo wa maandishi haya ambayo tayari ni marefu sana, lakini angalau hakikisha kuwa seva inatuma kidakuzi chenye kitambulisho, na kivinjari kiirejeshe. Na wakati huo huo vitambulisho vinaambatana na kila mmoja =)
Kuweka kuki inapaswa kuonekana kama
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
au vipi
Set-Cookie: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; njia=/
(ikiwa unaomba hati sio kutoka kwa saraka ya mizizi)
Jibu la seva linapaswa kuonekana kama
Kuki: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
au
Kidakuzi: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b=b
ikiwa kivinjari kinarudisha vidakuzi vingine isipokuwa kitambulisho cha kipindi.

Ikiwa kivinjari hakirudishi vidakuzi, angalia ikiwa vidakuzi hufanya kazi kabisa.
Hakikisha kuwa kikoa unachofikia kina jina la kawaida ( lenye angalau nukta moja na halina vibambo haramu kama vile mistari chini) na ufute akiba ya kivinjari chako - hizi ni sababu kuu mbili kwa nini vidakuzi vinaweza kufanya kazi.

Ikiwa mfano kutoka hapa unafanya kazi, lakini msimbo wako mwenyewe haufanyi, basi tatizo ni wazi si katika vikao, lakini katika algorithm. Tafuta mahali ulipopoteza utofauti, hamisha mfano kutoka hapa hatua kwa hatua, na utatue hati yako.

Tatizo jingine linaweza kutokea ikiwa unatumia uelekezaji upya wa kichwa au urambazaji wa JavaScript.
Ukweli ni kwamba PHP huongeza kitambulisho cha kikao kiotomatiki kwa viungo kama
, lakini haifanyi hivi kwa vichwa, JavaScript, vitambulisho vya meta.
Kwa hivyo, unahitaji kuongeza kitambulisho kwa mikono, kwa mfano, kama hii:
kichwa("Mahali: /script.php?".session_name()."=".session_id());

Pia, tatizo la nadra sana, na haijulikani kabisa linatoka wapi, ni kwamba mpangilio wa session.save_handler una thamani tofauti na faili. Ikiwa hii sio hivyo, rekebisha.

Usalama
Usalama wa kikao ni mada pana. Kwa hiyo, nitazingatia mambo makuu machache.
Kitabu cha maandishi zaidi sio kupitisha kitambulisho kupitia upau wa anwani. Hii imeandikwa hata katika php.ini, lakini hii inapunguza utendaji wa vikao. Ukiamua kufuata ushauri huu, basi pamoja na session.use_trans_sid = 0, usisahau session.use_only_cookies = 1
Inashauriwa kumfunga kikao kwa anwani ya IP: kwa njia hii, ikiwa kitambulisho kinaibiwa, villain bado hawezi kuitumia mara nyingi.
Inashauriwa kutumia maagizo ya session.save_path, ambayo inakuwezesha kuweka saraka yako mwenyewe ya kuhifadhi faili za kikao. Hii ni salama zaidi kuliko kuzihifadhi kwenye saraka chaguo-msingi ya seva iliyoshirikiwa.

Taarifa za ziada:

  • Kando na vidakuzi, utaratibu wa kipindi pia hutuma vichwa vinavyokataza uakibishaji wa ukurasa (kikomo sawa cha akiba). Kwa html hii ni sahihi na ni muhimu. Lakini unapojaribu kutuma faili kwa kutumia hati inayokagua idhini, Internet Explorer inakataa kuipakua. Ni kwa sababu ya jina hili. Wito
    session_cache_limiter("binafsi");
    lazima kutatua tatizo kabla ya kuanza kikao.
  • Ingawa inaweza kuonekana kuwa ya kushangaza, huwezi kutumia faharasa za nambari katika safu $_SESSION - $_SESSION, $_SESSION["10"] - vipindi havitafanya kazi.
  • Mahali fulani kati ya matoleo ya 4.2 na 5.0 haikuwezekana kuweka session.use_trans_sid kwa kutumia ini_set() . Kuanzia 5.0 tayari inawezekana tena.
  • Kabla ya toleo la 4.3.3 la kidakuzi, PHP ilituma kidakuzi iwapo tu hakukuwa na kitambulisho katika ombi wakati kipindi kilianza. Sasa kidakuzi kinatumwa kila wakati session_start() inaitwa

    Mfano wa idhini kwa kutumia vikao
    Wacha tuonyeshe haya yote hapo juu na mfano mdogo:
    Hebu tuunde faili ya auth.php:
    ikiwa (isset($_POST [ "auth_name" ]))
    {
    $sql = "CHAGUA *KUTOKA KWA watumiaji WAPI jina=?s";
    $ safu = $db -> getRow($sql, $_POST["auth_name"]);
    ikiwa ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "user_id" ] = $row [ "id" ];
    }
    kichwa("Mahali: http://" . $_SERVER [ "HTTP_HOST" ]. $_SERVER [ "REQUEST_URI" ]);
    Utgång;
    }

    ikiwa (isset($_GET [ "action" ]) NA $_GET [ "action" ]== "logout" ) (
    session_start();
    session_destroy();
    kichwa("Eneo: http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    Utgång;
    }

    ikiwa (!isset($_SESSION [ "user_id" ])) (
    ?>








    Utgång;
    }

    Sasa unachohitaji kufanya ni kuandika mstari katika hati zote zilizolindwa
    zinahitaji "auth.php";
    Mfano huu unachukulia kuwa kipindi tayari kimeanza na muunganisho kwenye hifadhidata umeundwa kwa kutumia Darasa kwa kazi salama na rahisi na MySQL. Pia huchukulia kuwa nenosiri limeharakishwa kwa kutumia kitendakazi kinachopendekezwa cha password_hash.
    Mfano wa faili iliyolindwa:

    session_start();
    ni pamoja na "safemysql.class.php" ;
    $db = safemysql mpya ([ "db" => "mtihani" ]);
    ni pamoja na "auth.php" ;
    ?>
    siri

    kuondoka

    OPS! Viungo Muhimu Sana:
    http://www.php.net/manual/ru/ref.session.php - habari za hivi punde na za hivi punde kuhusu usaidizi wa kikao katika PHP katika hati rasmi, pamoja na maoni mengi ya watumiaji. Inapendekezwa sana kusoma.
    http://phpclub.ru/manrus/f/ref.session.html - TAFSIRI iliyopitwa na wakati SANA ya sura hii kwa Kirusi, kutoka kwa nyaraka zilizotafsiriwa na Alexander Pyramidin.
    http://phpclub.ru/detail/article/sessions
    Makala yenye kichwa cha kusikitisha "Ukweli kuhusu Vipindi." Huacha hisia isiyoeleweka. Mwanzoni, mwandishi anazungumza kwa uwazi SANA juu ya utaratibu wa kikao, lakini njia anazotoa hadi mwisho wa kifungu hazieleweki kabisa.

    Nakala ya kitabu cha maandishi na Dmitry Borodin kutoka kwa wavuti
    http://php.spb.ru/ haipendekezwi sana.
    Jamani, imepitwa na wakati sana. Sio tu kwamba ina makosa ya kweli, lakini vikao katika PHP havijafanya kazi kwa muda mrefu.
    Shukrani nyingi kwa Dima kwa hilo, hii ilikuwa makala ya kwanza juu ya vikao katika Kirusi, nilijifunza kutoka kwake mwenyewe, lakini sasa ninahitaji kutuma kwa mapumziko yanayostahili.
    Pia, kwa bahati mbaya, nakala zingine nyingi ambazo ziko kwenye Mtandao na hazijasasishwa kwa miaka pia zimepitwa na wakati.