ක්රියාකාරී සැසි. සැසිවාර

10.08.2022

සැසියක් (ලතින් භාෂාවෙන් - sessio - රැස්වීම, ඉංග්‍රීසි - සැසිය) යනු පළමු සබැඳිය විවෘත කළ මොහොතේ සිට අවසන් වරට අන්තර්ජාලයේ පරිශීලකයාගේ වැඩ ආවරණය කරන කාල පරිච්ඡේදයකි. ආරම්භක සහ අවසාන ඉල්ලීම් අතර කාල වෙනස ලෙස ගණනය කෙරේ. කෙසේ වෙතත්, අවසාන පිටුව පරිශීලකයා විසින් බැලීම සඳහා වෙනස් කාලයක් ගත විය හැක, එහි ප්‍රතිඵලයක් ලෙස ඉල්ලීම් දෙකක් අතර කාලය මැනීම වඩාත් අපහසු වේ.

සැසියක් HTTP ප්‍රොටෝකෝලය සහ COOKIES සමඟ සම්බන්ධ වන්නේ කෙසේද?

සැසියක් යනු කුමක්ද යන්න HTTP ප්‍රොටෝකෝලය මත පදනම්ව පැහැදිලි කළ හැක. මෙම ප්රොටෝකෝලය විසින්ම, මෙහෙයුම් දෙකක් අතර තත්වය සුරැකීමට ක්රමයක් නොමැත. එනම්, සරලව කිවහොත්, එක් පිටුවක් විවෘත කර එයින් තවත් පිටුවකට යාමෙන්, ඉල්ලීම් දෙකම එකම පරිශීලකයෙකුට අයත් බව තහවුරු කිරීමට HTTP හට නොහැකි වනු ඇත. මෙහි විශේෂ ලුහුබැඳීමේ ක්‍රමයක් ගලවා ගැනීමට පැමිණේ - සැසි කළමනාකරණය (අපගේ සැසි).
එබැවින්, සැසියක් යනු කුමක්ද යන ප්‍රශ්නයට පිළිතුරු දෙමින්, එය එක් පරිශීලකයෙකුගේ අනුක්‍රමික HTTP ඉල්ලීම් අතර දත්ත මාරු කිරීමට පහසුකම් සපයන සහායක තාර්කික වස්තුවක් බව අපට පැවසිය හැකිය.
කුකීස්, සැසි වැනි, පරිශීලකයා සැරිසැරීමේදී ඔහු පිළිබඳ තොරතුරු ගබඩා කරයි විවිධ පිටුසහ ප්රොටෝකෝලයේ කාර්ය සාධනය වැඩි දියුණු කිරීම. නමුත් දෙවැන්න මෙන් නොව, සේවාදායකයේ තාවකාලික ලිපිගොනු වල දත්ත ගබඩා කර ඇති අතර, ඔවුන් එය කුඩා කොටස් ආකාරයෙන් පරිශීලකයාගේ පරිගණකයේ සුරකියි.

සැසි මොනවාද?

සංසද, පණිවිඩ පුවරු සහ මාර්ගගත වෙළඳසැල් වැනි අඩවි සමඟ වැඩ කිරීමේදී සැසි භාවිතා කිරීම අත්‍යවශ්‍ය වේ, මන්ද මේ අවස්ථාවේ දී පරිශීලකයා පිළිබඳ දත්ත පිටු කිහිපයක් පුරා සුරැකීමට අවශ්‍ය වේ.

සැසි අදියර

සම්පූර්ණ සැසිය අදියර තුනකට බෙදිය හැකිය:

  • සැසි විවෘත කිරීම (පරිශීලකයා නිශ්චිත වෙබ් අඩවියක් සමඟ වැඩ කිරීමට පටන් ගන්නා විට),
  • සැසි විචල්‍ය ගිණුම්කරණය (විවිධ පිටු වෙත යන විට),
  • සැසියේ අවසානය.

සැසි දත්ත ගබඩා කර ඇති බව හේතුවෙන් තෙවන පාර්ශවීය සේවාදායකය, එවිට ඒවා තුළ විශාල තොරතුරු ගබඩා කිරීම නොව, කුකීස් භාවිතා කිරීම වඩාත් සුදුසුය.

මෙම පිටුව නිවැරදිව සංදර්ශන කිරීමට ඔබට JavaScript සහාය ඇති බ්‍රවුසරයක් අවශ්‍ය වේ.

පරිශීලක අවසර සැසි

එයට ප්‍රවේශ වීමට ඔබ සබැඳිය අනුගමනය කළ යුතුය ක්රියාකාරී පරිශීලකයන්පරිච්ඡේදයේ පරිපාලනය - මුල් පිටුව බ්ලොක් එකේ පරිශීලකයන්(රූපය 2); සබැඳිය ක්රියාකාරී පරිශීලකයන්පරිච්ඡේදයේ පරිපාලනය - පද්ධතිය - බලපත්රපෙළට තරඟකාරී බලපත්ර(රූපය 3) - මෙම විකල්පය හැකි වන්නේ ELMA පද්ධතිය භාවිතා කරන්නේ නම් පමණිතරඟකාරී බලපත්ර වර්ගය ; බොත්තමක් එබීම ක්රියාකාරී පරිශීලකයන්පරිච්ඡේදයේ පරිපාලනය - පරිශීලකයන්(රූපය 4).

සහල්. 2. කොටස "පරිපාලනය - පරිශීලකයන්". ක්රියාකාරී පරිශීලකයන් බොත්තම

සහල්. 3. කොටස "පරිපාලනය - පද්ධතිය - බලපත්ර". ක්රියාකාරී පරිශීලක සබැඳිය

සහල්. 4. "පරිපාලනය - මුල් පිටුව" කොටස. ක්රියාකාරී පරිශීලක සබැඳිය

පරිශීලක නාමය- මෙම ක්ෂේත්රයේ සම්පූර්ණ නම අඩංගු වේ. ELMA පද්ධතියේ පරිශීලක. පරිශීලකයාගේ නම අසල ඇති බොත්තම ඔබට ගබ්සා කිරීමට (අදාළ පරිශීලකයා ඉවත් කිරීමට) සහ එම පරිශීලකයාගේ සියලුම සැසි පිළිබඳ තොරතුරු ලැයිස්තුවෙන් ඉවත් කිරීමට ඉඩ සලසයි.

IP ලිපිනය- මෙම ක්ෂේත්‍රයේ පද්ධතියේ අවසරය ලබා දුන් පරිශීලකයාගේ IP ලිපිනය අඩංගු වේ. ELMA වෙබ් ගොවිපල වැඩ සඳහා භාවිතා කරන්නේ නම්, ඔවුන්ගේ සැබෑ IP ලිපින සෑම සක්‍රිය පරිශීලකයෙකු සඳහාම පෙන්වනු ඇත.

IP ලිපිනය අසල ඇති බොත්තම ඔබට අදාළ සැසිය අවසන් කිරීමට සහ ලැයිස්තුවෙන් ඒ පිළිබඳ තොරතුරු ඉවත් කිරීමට ඉඩ සලසයි.

IP ලිපිනය අසල ඇති අයිකනය යනු වත්මන් පරිශීලකයා දැනට පද්ධතිය තුළ අවසර දී ඇති බවයි. අවසාන පරිශීලක ප්‍රතිචාරයෙන් නිශ්චිත කාලයක් ගත වූ පසු, ක්‍රියාකාරී සැසිය අත්හිටුවනු ලැබේ. විරාම කළ සැසි අයිකනයකින් සලකුණු කර ඇත. සක්‍රීය සැසිය අත්හිටුවන ලද කල් ඉකුත් වීමේ කාලය කොටසෙහි අර්ථ දක්වා ඇත පරිපාලනය - පද්ධතිය - පද්ධති සැකසුම් - ආරක්ෂක සැකසුම්.

නවතම ප්‍රතිචාරය- මෙම ක්ෂේත්‍රයේ පද්ධතිය තුළ පරිශීලකයා විසින් සිදු කරන ලද අවසාන ක්‍රියාව පිළිබඳ තොරතුරු හෝ පිටුවෙන් සේවාදායකයට සාර්ථකව යවන ලද අවසාන ඉල්ලීම පිළිබඳ තොරතුරු අඩංගු වේ (විනාඩියකට වරක් බ්‍රවුසරයේ විවෘත කර ඇති පිටුවෙන් ELMA සේවාදායකයට වෙබ් ඉල්ලීමක් යවනු ලැබේ. සම්බන්ධතාවය පරීක්ෂා කර සංඛ්යා ලේඛන එකතු කරන්න).

අවසාන පරිශීලක ක්‍රියාව- මෙම ක්ෂේත්‍රයේ ආකෘතියේ පද්ධතිය තුළ පරිශීලකයා විසින් සිදු කරන ලද අවසාන ක්‍රියාව පිළිබඳ තොරතුරු අඩංගු වේ දිනය - වේලාව - පරිශීලකයා විසින් අවසන් වරට ගිය පිටුවට සබැඳිය. මෙම සබැඳිය සාපේක්ෂයි. ලබා ගැනීම සඳහා සම්පූර්ණ සබැඳියඔබ එයට සේවාදායක ලිපිනය එකතු කළ යුතුය (රූපය 5).

සහල්. 5. පරිශීලකයා විසින් සංචාරය කරන ලද අවසාන පිටුවට සබැඳියේ සම්පූර්ණ ලිපිනය සැකසීම

නිශ්චිත කාලයක් සඳහා පරිශීලක ක්‍රියාකාරකම් නොමැති නම්, වත්මන් සැසිය ස්වයංක්‍රීයව අවසන් වේ. සැසි ගබඩා කාලසීමා සැකසුම් කොටසෙහි වින්‍යාස කර ඇත

බොහෝ පරිශීලකයින් Telegram හි උපාංග අතර බාධාවකින් තොරව සමමුහුර්ත කිරීම අගය කරති. මෙම හරස් වේදිකා පණිවිඩකරුගේ ස්වදේශීය යෙදුම් සියල්ල මත ස්ථාපනය කර ඇති නිසා මෙහෙයුම් පද්ධති(ඩෙස්ක්ටොප් සහ ජංගම), පුද්ගලයන්ට එකවර උපාංග කිහිපයකින් තම ගිණුම් වෙත ලොග් විය හැක.

මෑත කාලීන ටෙලිග්‍රාම් යාවත්කාලීන කිරීමකදී, සබැඳි පෙරදසුන් වලට අමතරව, ටෙලිග්‍රාම් ආරක්‍ෂාව සහ රහස්‍යතා සැකසුම් තුළ නව කොටසක් නිර්මාණය කරන ලදී. එය "ක්රියාකාරී සැසි" ලෙස හැඳින්වේ.

කොටසෙහි ටෙලිග්‍රාම් පරිශීලකයාගේ IP ලිපිනය සහ ක්‍රියාකාරී සැසි පිළිබඳ තොරතුරු අඩංගු වේ. භාවිතයට නොගත් සැසි මෙන්ම සැක සහිත ලෙස පෙනෙන ක්‍රියාකාරී සැසිද අවසන් කිරීමට සෑම කෙනෙකුටම අවස්ථාව තිබේ.

අවසරය අදියර දෙකකින්

තවත් නවෝත්පාදනයක් ආරක්ෂාව සහ පෞද්ගලිකත්ව අංශය ගැන ද සැලකිලිමත් වේ. මෙය ටෙලිග්‍රාම් හි අදියර දෙකකින් (දෙපියවර අවසරය) අවසර දීමකි.

ඔබ නව උපාංගයකින් ලොග් වන සෑම අවස්ථාවකම (SMS හරහා සත්‍යාපනය කිරීමට අමතරව) ඉල්ලා සිටින මුරපදයක් සෑදීමට එය ඔබට ඉඩ සලසයි.

නමුත් ඔබ මේ ගැන සැලකිලිමත් විය යුතුය: සාදන ලද මුරපදය නැති වී ඇත්නම්, අයිතිකරු ගිණුමවෙනත් ගැජට් එකකින් ඔහුගේම ටෙලිග්‍රාම් ගිණුමට ලොග් වීමට නොහැකි වනු ඇත.

  • විද්‍යුත් තැපෑල හරහා ඔබගේ මුරපදය ප්‍රතිසාධනය කිරීමේ හැකියාව වින්‍යාස කරන්න;

වෙබ් සේවාදායකය සේවාලාභියා සමඟ ස්ථිර සම්බන්ධතාවයක් නොපවත්වන අතර, සෑම ඉල්ලීමක්ම පෙර ඒවා සමඟ කිසිදු සම්බන්ධයක් නොමැතිව නව එකක් ලෙස සකසනු ලැබේ.
එනම්, ඔබට එකම ආගන්තුකයාගේ ඉල්ලීම් නිරීක්ෂණය කිරීමට හෝ ඔහු සඳහා විචල්‍යයන් බැලීම් අතර සුරැකීමට නොහැකිය. තනි පිටු. මේ ගැටලු දෙක විසඳන්න තමයි සැසි නිර්මාණය කළේ.
ඇත්ත වශයෙන්ම, සැසි, කෙටියෙන්, ඔබට බ්‍රවුසරයක් අනන්‍ය ලෙස හඳුනා ගැනීමට ඉඩ සලසන යාන්ත්‍රණයක් වන අතර සැසි විචල්‍යයන් ගබඩා කර ඇති සේවාදායකයේ මෙම බ්‍රව්සරය සඳහා ගොනුවක් නිර්මාණය කරයි.

එවැනි යාන්ත්රණයක අවශ්යතාවය මම විස්තරාත්මකව විස්තර නොකරමි. මේවා ඊ-වෙළඳසැලක ඇති සාප්පු කරත්තයක්, අවසරය, මෙන්ම වෙබ් අඩවියක අන්තර්ක්‍රියාකාරී කොටස් අයාචිත තැපෑලෙන් ආරක්ෂා කිරීම වැනි සම්පූර්ණයෙන්ම සුළු ගැටළු නොවේ.

ප්‍රතිපත්තිමය වශයෙන්, ඔබේම සැසිවල ප්‍රතිසමයක් සෑදීම තරමක් පහසුය, එය PHP තුළ ගොඩනගා ඇති ආකාරයට ක්‍රියාකාරී නොවන නමුත් සාරය අනුව සමාන වේ. කුකීස් සහ දත්ත සමුදාය මත.
ස්ක්‍රිප්ට් එකක් ඉල්ලනකොට අපි බලනවා නිශ්චිත නමක් තියෙන කුකියක් ලැබුනද කියලා. කුකියක් නොමැති නම්, එය සකසා දත්ත සමුදායට ලියන්න නව මාර්ගයපරිශීලක දත්ත සමඟ. කුකියක් තිබේ නම්, අපි දත්ත සමුදායෙන් දත්ත කියවමු. තවත් ඉල්ලීමක් සමඟ අපි දත්ත සමුදායෙන් පැරණි වාර්තා මකා දමන අතර දැන් අපට සැසි යාන්ත්‍රණයක් සූදානම් කර ඇත. එය කිසිසේත් අපහසු නැත. නමුත් සාදන ලද සැසි යාන්ත්‍රණය භාවිතා කිරීම වඩාත් සුදුසු වන සමහර සූක්ෂ්මතා තිබේ.

පළමු එක පමණක් සක්‍රීය කර ඇත්නම්, සැසිය ආරම්භයේදී (සෑම ඇමතුමක්ම සැසිය_ආරම්භය()) සේවාදායකයා සඳහා කුකියක් සකසා ඇත. බ්‍රවුසරය සෑම ඊළඟ ඉල්ලීමක් සමඟම මෙම කුකිය නිවැරදිව ආපසු ලබා දෙන අතර PHP හට සැසි හඳුනාගැනීමක් ඇත. බ්රවුසරය කුකීස් ආපසු නොදුන්නේ නම් ගැටළු ආරම්භ වේ. මෙම අවස්ථාවේදී, හඳුනාගැනීමක් සහිත කුකියක් නොලැබීමෙන්, PHP සෑම විටම නව සැසියක් ආරම්භ කරන අතර යාන්ත්රණය ක්රියා නොකරනු ඇත.

දෙවෙනි එක පමණක් සක්රිය කර ඇත්නම්, කුකිය සකසා නැත. සිදු වන්නේ මෙයයි, ඒ සඳහා, ඇත්ත වශයෙන්ම, ගොඩනඟන ලද සැසි යාන්ත්‍රණය භාවිතා කිරීම වටී. ස්ක්‍රිප්ටය එහි කාර්යය ඉටු කර පිටුව සම්පූර්ණයෙන් සෑදූ පසු, PHP මුළු පිටුවම පරිලෝකනය කර එක් එක් සබැඳියට සහ එක් එක් පෝරමයට සැසි හඳුනාගැනීමක් එක් කරයි. එය මේ වගේ දෙයක් පෙනේ:
දර්ශකයබවට හැරෙනවා
දර්ශකය
සහ සැඟවුණු ක්ෂේත්රයක් ආකෘති වලට එකතු වේ

තවද බ්‍රවුසරය, ඔබ කිසියම් සබැඳියක් ක්ලික් කළ විට හෝ ඔබ පෝරමයේ ඇති බොත්තමක් මත ක්ලික් කළ විට, ඉල්ලීම තුළ අපට අවශ්‍ය විචල්‍යය යවනු ඇත - සැසි හඳුනාගැනීම!
පැහැදිලි හේතු නිසා, හැඳුනුම්කාරකය එකතු කරනු ලබන්නේ සාපේක්ෂ සබැඳි වෙත පමණි.

න්‍යායාත්මකව, කුකීස් සහ දත්ත සමුදාය පිළිබඳ අපගේ ගෙදර හැදූ සැසිවලදී, ඔබට සියලුම සබැඳි වෙත හැඳුනුම්පත මාරු කිරීම අතින් පැවරිය හැකිය - ඉන්පසු අපගේ තමන්ගේම සැසිකුකීස් නොසලකා වැඩ කරනු ඇත. නමුත් ඔබ එකඟද - වෙනත් කෙනෙකු මෙම කාර්යය කරන විට එය වඩාත් ප්රසන්නද? ;-)

පෙරනිමිය තුළ නවතම අනුවාද PHP විකල්ප දෙකම සක්‍රීය කර ඇත. PHP මෙය හසුරුවන්නේ කෙසේද? කුක් සෑම විටම ප්රදර්ශනය කෙරේ. සබැඳි ස්වයංක්‍රීයව සම්පූර්ණ වන්නේ PHP විසින් සැසි හඳුනාගැනීමක් සහිත කුකියක් හඳුනා නොගත්තේ නම් පමණි. මෙම සැසියේදී පරිශීලකයෙකු පළමු වරට වෙබ් අඩවියට පිවිසෙන විට, කුකියක් තබා සබැඳි සම්පූර්ණ වේ. ඊළඟ ඉල්ලීම මත, කුකීස් සහය දක්වන්නේ නම්, PHP විසින් කුකිය දකින අතර සබැඳි සම්පූර්ණ කිරීම නතර කරයි. කුකීස් ක්‍රියා නොකරන්නේ නම්, PHP දිගටම සබැඳි වෙත නිසි ලෙස හැඳුනුම්පත එක් කරයි, සහ සැසිය නැති නොවේ.
කුකීස් සක්‍රීය කර ඇති පරිශීලකයින්ට හැඳුනුම්පත සහිත දිගු සබැඳිය එක් වරක් පමණක් පෙනෙනු ඇත.

පිව්. හැඳුනුම්පත මාරු කිරීම සම්පූර්ණයි.
දැන් ඉතිරිව ඇත්තේ දත්ත ගොනුව සේවාදායකයේ පැත්තට බැඳ තැබීමයි.
PHP අප වෙනුවෙන් මෙය කරනු ඇත. ලිව්වට විතරක් ඇති
සැසිය_ආරම්භය ();
$_SESSION [ "test" ]= "Hello world!" ;

තවද PHP මෙම සැසිය හා සම්බන්ධ ගොනුවට පරීක්ෂණ විචල්‍යය ලියයි.
මෙහි ඉතා වැදගත් සටහනක් තිබේ.
අරාව $_SESSION- විශේෂ.
ඇත්ත වශයෙන්ම, විවිධ ස්ක්‍රිප්ට් වලින් අපට ලබා දීමට අවශ්‍ය විචල්‍යයන් එහි අඩංගු වේ.
සැසියක විචල්‍යයක් තැබීමට, එය $_SESSION අරා මූලද්‍රව්‍යයට පවරන්න.
එහි වටිනාකම ලබා ගැනීමට, එකම මූලද්‍රව්‍යයට පිවිසෙන්න. උදාහරණයක් පහත වනු ඇත.

PHP කසළ එකතු කිරීම ද සිදු කරයි - යල් පැන ගිය ගොනු ඉවත් කිරීම. දත්ත කේතනය කිරීම සහ වෙනත් අවශ්‍ය දේවල් රාශියක්. මෙම සත්කාරයේ ප්රතිඵලයක් වශයෙන්, සැසි සමඟ වැඩ කිරීම ඉතා සරල ය.
මෙන්න අපි සැසිවාර ක්‍රියා කරන ආකාරය පිළිබඳ උදාහරණයක් වෙත පැමිණෙමු.
ඉතා කුඩා උදාහරණයක්:
සැසිය_ආරම්භය ();

දෝංකාරය "ඔබ මෙම පිටුව යාවත්කාලීන කර ඇත". $_SESSION["කවුන්ටරය"]++. " වරක්. " ;
දෝංකාරය"
යාවත්කාලීන";
?>

අපි සැසිය තුළ කවුන්ටර විචල්‍යයක් තිබේදැයි පරීක්ෂා කරන්නෙමු, එසේ නොවේ නම්, අපි එය 0 අගයෙන් නිර්මාණය කර, එහි අගය ප්‍රදර්ශනය කර එය එකකින් වැඩි කරන්නෙමු. වැඩි කළ අගය සැසියට ලියනු ලබන අතර, ඊළඟ වතාවේ ස්ක්‍රිප්ටය කැඳවන විට, විචල්‍යයේ අගය 1 සහ යනාදිය ඇත.
සෑම දෙයක්ම ඉතා සරලයි.

වෙබ් අඩවියේ ඕනෑම පිටුවක සැසි විචල්‍යයන් වෙත ප්‍රවේශය ලබා ගැනීම සඳහා, අපට සැසි අවශ්‍ය සෑම ගොනුවකම ආරම්භයේදීම ඔබ එක් (!) පේළියක් පමණක් ලිවිය යුතුය:
සැසිය_ආරම්භය ();
ඉන්පසු $_SESSION අරාවේ මූලද්‍රව්‍ය වෙත ප්‍රවේශ වන්න. උදාහරණයක් ලෙස, අවසර පිරික්සුම මේ වගේ දෙයක් පෙනෙනු ඇත:
සැසිය_ආරම්භය ();
නම් ($_SESSION [ "බලය ලත්" ]<> 1 ) {
ශීර්ෂකය("ස්ථානය: /auth.php" );
පිටවීම;
}

සැසියකින් විචල්‍යයන් ඉවත් කිරීම.
ඔබට register_globals=off තිබේ නම්, ලියන්න
සකස් නොකළ ($_SESSION [ "var" ]);
එසේ නොවේ නම්, එසේ නම් අසලමට ඇය සමඟ ලිවිය යුතුයි
session_unregister("var");

සැසි සමඟ වැඩ කිරීමට උත්සාහ කිරීමේදී PHP නිපදවන වඩාත් පොදු දෝෂ පහත දැක්වේ:
ඔවුන්ගෙන් දෙදෙනෙක්
අවවාදයයි: සැසි කුකී යැවිය නොහැක - ශීර්ෂයන් දැනටමත් යවා ඇත
අවවාදයයි: සැසි හැඹිලි සීමාව යැවිය නොහැක - ශීර්ෂ දැනටමත් යවා ඇත

එකම හේතුව නිසා ඇති වූ විසඳුම මෙම ත්‍රෙඩ් එකේ විස්තර කර ඇත
තුන්වන,
අවවාදයයි: open(/tmp\sess_SID, O_RDWR) අසාර්ථක විය: එවැනි ගොනුවක් හෝ නාමාවලියක් (2) සම්පූර්ණ_script_path හි රේඛා අංකයේ නොමැත(පෙර ඇය පෙනුණේය අවවාදයයි: සැසි දත්ත (ගොනු) ලිවීමට අසමත් විය. session.save_path හි වත්මන් සැකසුම නිවැරදි බව කරුණාකර තහවුරු කරන්න (/tmp)),
ඉංග්‍රීසියෙන් පරිවර්තනය කර ඇත්නම්, එය ගැටලුව සවිස්තරාත්මකව පැහැදිලි කරයි: සැසි ගොනු ලියා ඇති php.ini හි නිශ්චිතව දක්වා ඇති බහලුම වෙත මාර්ගය ලබා ගත නොහැක. මෙම දෝෂය නිවැරදි කිරීමට පහසුම වේ. පවතින සහ ලිවිය හැකි නාමාවලියක් ලියාපදිංචි කරන්න, උදාහරණයක් ලෙස,
session.save_path = c:\windows\temp
ඒ වගේම මේකෙන් පස්සේ Apache Restart කරන්නත් අමතක කරන්න එපා.

පෙනෙන පරිදි, මිනිස් බුද්ධියට සීමාවන් නොමැත, එබැවින් මට පැහැදිලි කිරීමට බල කෙරුනි:
තෙවන දෝෂය (ඩිරෙක්ටරිය සොයාගත නොහැක) පිළිබඳ පණිවිඩයක් අනිවාර්යයෙන්ම පළමු දෙකෙහි පෙනුමට හේතු වනු ඇත, මන්ද දෝෂ පණිවිඩය බ්‍රවුසරයට ප්‍රතිදානය වන අතර එය භාවිතා කළ නොහැකි වූ පසු ශීර්ෂකය. එමනිසා, නොමේරූ නිගමනයක් සෙවීමට ඉක්මන් නොවන්න, නමුත් පළමුව නිවැරදි මාර්ගය ලියන්න!

සැසි සමඟ වැඩ කිරීමේදී ඊළඟ වඩාත් පොදු ගැටළුව වන්නේ register_globals හි අධික උරුමයයි. $_SESSION අරාවේ දර්ශකවලට ගැළපෙන ස්ක්‍රිප්ට් විචල්‍ය නම් ලබා නොදෙන්න!
register_globals= සමඟින් අගයන් එකිනෙක උඩින් ලියවෙන අතර ඔබ ව්‍යාකූල වනු ඇත.
තවද register_globals=off නම්, තවත් දෝෂයක් දිස්වනු ඇත: “ඔබගේ ස්ක්‍රිප්ට් එක PHP 4.2.3 දක්වා පැවති සැසි අතුරු ප්‍රයෝගයක් මත රඳා පවතී.”, ස්ක්‍රිප්ටයේ අගයක් නොමැති සැසි විචල්‍යයක් සහ ගෝලීය විචල්‍යයක් තිබේ නම් එකම නම. එය ඉවත් කිරීම සඳහා, ඔබ සැමවිටම භාවිතයට පෙර විචල්‍යයන් ආරම්භ කළ යුතුය (හෝ අවම වශයෙන් පැවැත්ම සඳහා පරීක්ෂා කරන්න) සහ $_SESSION අරාවේ දර්ශක සමඟ සමපාත වන ගෝලීය විචල්‍ය නම් ලබා නොදෙන්න.

එය ක්‍රියා නොකරන්නේ නම්, නමුත් පණිවිඩ කිසිවක් නොපෙන්වන්නේ නම්, තිරයේ සියලුම දෝෂ පෙන්වීමට වගකිව යුතු ස්ක්‍රිප්ට් ආරම්භයේදීම පේළි දෙකක් එක් කරන්න - දෝෂ ඇති බව බොහෝ දුරට ඉඩ ඇත, නමුත් ඔබට ඒවා නොපෙනේ.
ini_set("display_errors" , 1 );
දෝෂ_වාර්තා කිරීම (E_ALL);

හෝ error_log හි දෝෂ බලන්න. පොදුවේ ගත් කල, දෝෂ පණිවිඩ පෙන්වීමේ මාතෘකාව මෙම ලිපියේ විෂය පථයෙන් ඔබ්බට ය, එබැවින් ඔබට අවම වශයෙන් ඒවා දැකිය හැකි බවට වග බලා ගන්න. මෙම කොටසේ දෝෂ සෙවීම ගැන ඔබට තව ටිකක් කියවිය හැකිය.

දෝෂ නොමැති බව ඔබට විශ්වාස නම්, නමුත් ලබා දී ඇති උදාහරණය කෙසේ හෝ ක්‍රියා නොකරයි, එවිට PHP URL හරහා හැඳුනුම්පත යැවීම සක්‍රීය නොකරයි, සහ කුකීස් යම් හේතුවක් නිසා ක්රියා නොකරයි.
ඔබේ කුකීස් වල ඇති වැරැද්ද බලන්න.
සාමාන්‍යයෙන්, ඔබේ සැසි ක්‍රියා නොකරන්නේ නම්, පළමුව සැසි හඳුනාගැනීම අතින් සම්මත කිරීමට උත්සාහ කරන්න, එනම් සබැඳියක් සාදා එයට හැඳුනුම්කාරකයක් පවරන්න:
සැසිය_ආරම්භය ();
නම් (!isset($_SESSION [ "කවුන්ටරය" ])) $_SESSION [ "කවුන්ටරය" ]= 0 ;
දෝංකාරය "ඔබ මෙම පිටුව යාවත්කාලීන කර ඇත". $_SESSION["කවුන්ටරය"]++. " වරක්.

යාවත්කාලීන";
?>

කෙසේ වෙතත්, ඔබ විසින් session.use_only_cookies විධානය සක්‍රීය කර නොමැති බව සහතික කර ගත යුතු අතර, එය URL හරහා සම්මත කර ඇත්නම්, සැසි හැඳුනුම පිළිගැනීමෙන් PHP වළක්වයි.

මෙම උදාහරණය සාර්ථක නොවන්නේ නම්, ගැටළුව එක්කෝ සුළුපටු වේ අකුරු වැරදි(සැසි සමඟ ඇති "ගැටළු" වලින් අඩක් වැරදි අක්ෂර වින්‍යාස සහිත විචල්‍ය නාමයකින් පැමිණේ), හෝ ද පැරණි අනුවාදය PHP: සැසි සහාය 4.0 අනුවාදයේ සහ අරාවෙහි දර්ශනය විය $_SESSION- 4.1 හි (මෙයට පෙර එය භාවිතා කරන ලදී $HTTP_SESSION_VARS).
එය ක්‍රියාත්මක වන්නේ නම්, ගැටළුව කුකීස් වල ඇත. සේවාදායකය බ්‍රවුසරයට කුමන ආකාරයේ කුකියක් සකසන්නේද සහ බ්‍රවුසරය එය ආපසු ලබා දෙන්නේද යන්න නිරීක්ෂණය කරන්න. බ්‍රව්සරය සහ සේවාදායකය අතර HTTP ශීර්ෂ හුවමාරුව දෙස බලා සෙවීම ඉතා ප්‍රයෝජනවත් වේ.
කුකීස් ක්‍රියා කරන ආකාරය පිළිබඳ පැහැදිලි කිරීමක් දැනටමත් මෙම දිගු පෙළෙහි විෂය පථයෙන් ඔබ්බට ය, නමුත් අවම වශයෙන් සේවාදායකය හඳුනාගැනීමක් සහිත කුකියක් යවන බවට වග බලා ගන්න, සහ බ්‍රවුසරය එය ආපසු ලබා දෙයි. ඒ සමඟම හඳුනාගැනීම් එකිනෙක සමපාත වේ =)
කුකිය සැකසීම මේ වගේ විය යුතුය
කට්ටල-කුකී: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6;
නැත්නම් කොහොමද
කට්ටල-කුකී: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; මාර්ගය =/
(ඔබ පිටපත ඉල්ලා සිටින්නේ මූල නාමාවලියෙන් නොවේ නම්)
සේවාදායක ප්‍රතිචාරය මේ ආකාරයට විය යුතුය
කුකී: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6
හෝ
කුකී: PHPSESSID=prlgdfbvlg5fbsbshch6hj0cq6; b=b
බ්‍රවුසරය සැසි හැඳුනුම්පත හැර වෙනත් කුකීස් ලබා දෙන්නේ නම්.

බ්‍රවුසරය කුකීස් ආපසු නොදුන්නේ නම්, කුකීස් කිසිසේත් ක්‍රියා කරන්නේ දැයි පරීක්ෂා කරන්න.
ඔබ ප්‍රවේශ වන වසමෙහි සාමාන්‍ය නමක් ඇති බවට වග බලා ගන්න (අවම වශයෙන් එක් තිතක් සහිත සහ යටි ඉරි වැනි නීති විරෝධී අක්ෂර නොමැති) සහ ඔබගේ බ්‍රවුසර හැඹිලිය හිස් කරන්න - කුකීස් ක්‍රියා නොකිරීමට ප්‍රධාන හේතු දෙකකි.

මෙතැන් සිට උදාහරණය ක්‍රියාත්මක වේ නම්, නමුත් ඔබේම කේතය එසේ නොවේ නම්, ගැටළුව පැහැදිලිවම සැසිවල නොව ඇල්ගොරිතමයේ වේ. ඔබට විචල්‍යය නැති වූ ස්ථානය සොයන්න, උදාහරණය මෙතැනින් පියවරෙන් පියවර මාරු කරන්න, සහ ඔබේ ස්ක්‍රිප්ට් දෝෂහරණය කරන්න.

ඔබ ශීර්ෂ යළි-යොමුවීම් හෝ JavaScript සංචාලනය භාවිතා කරන්නේ නම් තවත් ගැටළුවක් ඇතිවිය හැක.
කාරණය නම් PHP ස්වයංක්‍රීයව සැසි හැඳුනුම්කාරකය එකතු කරන්නේ එවැනි සබැඳි වලට පමණි , නමුත් හෙඩර්, ජාවාස්ක්‍රිප්ට්, මෙටා ටැග් සඳහා මෙය නොකරයි.
එබැවින්, ඔබ හඳුනාගැනීම අතින් එකතු කළ යුතුය, උදාහරණයක් ලෙස, මේ වගේ:
ශීර්ෂකය("ස්ථානය: /script.php?" . session_name(). "=" . session_id());

එසේම, ඉතා දුර්ලභ ගැටළුවක් වන අතර, එය පැමිණෙන්නේ කොහෙන්ද යන්න සම්පූර්ණයෙන්ම අපැහැදිලි වේ, session.save_handler සැකසුම ගොනු වලට වඩා වෙනස් අගයක් ඇත. මෙය එසේ නොවේ නම්, එය නිවැරදි කරන්න.

ආරක්ෂාව
සැසි ආරක්ෂාව යනු පුළුල් මාතෘකාවකි. එබැවින්, මම ප්රධාන කරුණු කිහිපයක් කෙරෙහි අවධානය යොමු කරමි.
වඩාත්ම පෙළපොත වන්නේ ලිපින තීරුව හරහා හැඳුනුම්කාරකය යැවීම නොවේ. මෙය php.ini හි පවා ලියා ඇත, නමුත් මෙය සැසිවල ක්රියාකාරිත්වය සීමා කරයි. ඔබ මෙම උපදෙස් අනුගමනය කිරීමට තීරණය කරන්නේ නම්, session.use_trans_sid = 0 ට අමතරව, session.use_only_cookies = 1 අමතක කරන්න එපා
සැසිය IP ලිපිනයකට සම්බන්ධ කිරීම සුදුසුය: මේ ආකාරයෙන්, හඳුනාගැනීම සොරකම් කර ඇත්නම්, දුෂ්ටයාට තවමත් බොහෝ අවස්ථාවලදී එය භාවිතා කිරීමට නොහැකි වනු ඇත.
සැසි ගොනු සුරැකීම සඳහා ඔබේම නාමාවලිය සැකසීමට ඔබට ඉඩ සලසන session.save_path විධානය භාවිතා කිරීම නිර්දේශ කෙරේ. මෙය සේවාදායකයේ පෙරනිමි බෙදාගත් තාවකාලික නාමාවලියෙහි ගබඩා කර තැබීමට වඩා ආරක්ෂිත වේ.

අමතර තොරතුරු:

  • කුකීස් වලට අමතරව, සැසි යාන්ත්‍රණය මඟින් පිටු හැඹිලිගත කිරීම තහනම් කරන ශීර්ෂ ද යවයි (එකම හැඹිලි සීමාව). html සඳහා මෙය නිවැරදි හා අවශ්ය වේ. නමුත් ඔබ අවසරය පරීක්ෂා කරන ස්ක්‍රිප්ට් එකක් භාවිතයෙන් ගොනුවක් යැවීමට උත්සාහ කරන විට, Internet Explorer එය බාගත කිරීම ප්‍රතික්ෂේප කරයි. ඒ මේ මාතෘකාව නිසා. අමතන්න
    session_cache_limiter("පුද්ගලික");
    සැසිය ආරම්භ කිරීමට පෙර ගැටලුව විසඳිය යුතුය.
  • එය පෙනෙන තරම් අමුතුයි, නමුත් අරාව තුළ $_SESSIONඔබට සංඛ්‍යාත්මක දර්ශක භාවිතා කළ නොහැක - $_SESSION [ 1 ], $_SESSION [ "10" ]- සැසි ක්රියා නොකරනු ඇත.
  • 4.2 සහ 5.0 අනුවාද අතර කොතැනක හෝ සෙෂන්.use_trans_sid භාවිතයෙන් සැකසීමට නොහැකි විය ini_set(). 5.0 සිට එය දැනටමත් නැවත හැකි ය.
  • කුකියේ 4.3.3 අනුවාදයට පෙර, PHP විසින් කුකියක් එවන ලද්දේ සැසිය ආරම්භ වන විට ඉල්ලීමෙහි හැඳුනුම්කාරකයක් නොමැති නම් පමණි. දැන් සෑම ඇමතුමකටම කුකීස් යවනු ලැබේ සැසිය_ආරම්භය()

    සැසි භාවිතා කිරීමේ අවසරය පිළිබඳ උදාහරණයක්
    ඉහත සියල්ල කුඩා උදාහරණයකින් පැහැදිලි කරමු.
    අපි auth.php ගොනුව නිර්මාණය කරමු:
    නම් (isset($_POST [ "auth_name" ]))
    {
    $sql = "තෝරන්න * පරිශීලකයින්ගෙන් නම =?;
    $row = $db -> getRow($sql, $_POST["auth_name"]);
    නම් ($row && password_verify ($_POST [ "auth_pass" ], $row [ "pass" ])) (
    $_SESSION [ "user_id" ] = $row [ "id" ];
    }
    ශීර්ෂකය("ස්ථානය: http://" . $_SERVER [ "HTTP_HOST" ]. $_SERVER [ "REQUEST_URI" ]);
    පිටවීම;
    }

    නම් (isset($_GET [ "ක්‍රියාව" ]) සහ $_GET [ "ක්‍රියාව" ]== "පිටවීම" ) (
    සැසිය_ආරම්භය ();
    session_destroy ();
    ශීර්ෂකය("ස්ථානය: http://" . $_SERVER [ "HTTP_HOST" ]. "/" );
    පිටවීම;
    }

    නම් (!isset($_SESSION [ "user_id" ])) (
    ?>








    පිටවීම;
    }

    දැන් ඔබ කළ යුත්තේ සියලුම ආරක්ෂිත ස්ක්‍රිප්ට් වල රේඛාව ලිවීමයි
    අවශ්ය "auth.php" ;
    මෙම උදාහරණය උපකල්පනය කරන්නේ සැසිය දැනටමත් ආරම්භ වී ඇති අතර MySQL සමඟ ආරක්ෂිත සහ පහසු වැඩ සඳහා Class භාවිතා කර දත්ත සමුදායට සම්බන්ධතාවයක් නිර්මාණය කර ඇති බවයි. නිර්දේශිත password_hash ශ්‍රිතය භාවිතයෙන් මුරපදය හැෂ් කර ඇති බව ද එය උපකල්පනය කරයි.
    ආරක්ෂිත ගොනුවක උදාහරණය:

    සැසිය_ආරම්භය ();
    "safemysql.class.php" ඇතුළත් ;
    $db = new safemysql ([ "db" => "test" ]);
    ඇතුළත් "auth.php" ;
    ?>
    රහස

    පිටවීම

    OPS! ඉතා ප්රයෝජනවත් සබැඳි:
    http://www.php.net/manual/ru/ref.session.php - නිල ලේඛනවල PHP හි සැසි සහාය පිළිබඳ නවතම සහ නවතම තොරතුරු සහ බොහෝ පරිශීලක අදහස්. ඉතා නිර්දේශිත කියවීම.
    http://phpclub.ru/manrus/f/ref.session.html - ඇලෙක්සැන්ඩර් පිරමිඩින් විසින් පරිවර්තනය කරන ලද ලියකියවිලි වලින් රුසියානු භාෂාවට මෙම පරිච්ඡේදයේ ඉතා යල් පැන ගිය පරිවර්තනයකි.
    http://phpclub.ru/detail/article/sessions
    “සැසිවාර පිළිබඳ සත්‍යය” යන ශෝචනීය මාතෘකාව සහිත ලිපියක් දෙගිඩියාවෙන් යුත් හැඟීමක් ඉතිරි කරයි. ආරම්භයේ දී, කතුවරයා සැසි යාන්ත්‍රණය ගැන ඉතා පැහැදිලිව කථා කරයි, නමුත් ලිපිය අවසානයේ ඔහු ඉදිරිපත් කරන ක්‍රම සම්පූර්ණයෙන්ම අපැහැදිලි ය.

    අඩවියෙන් Dmitry Borodin විසින් පෙළපොත් ලිපියක්
    http://php.spb.ru/ දැඩි ලෙස නිර්දේශ නොකරයි.
    යාලුවනේ, ඒක හරිම යල් පැන ගිය එකක්. එහි සත්‍ය සාවද්‍යතාවයන් අඩංගු වනවා පමණක් නොව, PHP හි සැසි දිගු කාලයක් තිස්සේ ක්‍රියා කර නොමැත.
    ඒ සඳහා ඩීමාට බොහෝ ස්තූතියි, මෙය රුසියානු භාෂාවෙන් සැසි පිළිබඳ පළමු ලිපිය විය, මම එයින්ම අධ්‍යයනය කළෙමි, නමුත් දැන් මට එය සුදුසු විවේකයකට යැවිය යුතුය.
    අවාසනාවකට, වසර ගණනාවක් තිස්සේ යාවත්කාලීන නොකළ අන්තර්ජාලයේ තවත් බොහෝ ලිපි යල් පැන ගිය ඒවා වේ.

  • සුභ පැතුම්, ආදරණීය ප්රජාව.

    පළමුවෙන්ම, මම ඔබට ස්තූති කිරීමට කැමතියි ප්රයෝජනවත් සම්පත. එක් වරකට වඩා මම මෙහි බොහෝ රසවත් අදහස් සහ ප්‍රායෝගික උපදෙස් සොයාගෙන ඇත.

    මෙම ලිපියේ අරමුණ PHP හි සැසි භාවිතා කිරීමේ අන්තරායන් ඉස්මතු කිරීමයි. ඇත්ත වශයෙන්ම, PHP පිළිබඳ ලියකියවිලි සහ උදාහරණ රාශියක් ඇති අතර, මෙම ලිපිය එසේ මවාපාන්නේ නැත සම්පූර්ණ මාර්ගෝපදේශය. එය සැසි සමඟ වැඩ කිරීමේ සමහර සූක්ෂ්මතා හෙළි කිරීමට සහ අනවශ්‍ය කාලය නාස්තියෙන් සංවර්ධකයින් ආරක්ෂා කිරීමට සැලසුම් කර ඇත.

    සැසි භාවිතා කිරීමේ වඩාත් පොදු උදාහරණය, ​​ඇත්ත වශයෙන්ම, පරිශීලක අවසරයයි. නව කාර්යයන් පැනනගින විට එය ක්‍රමයෙන් සංවර්ධනය කිරීම සඳහා වඩාත් මූලික ක්‍රියාත්මක කිරීම ආරම්භ කරමු.

    (ඉඩ සහ කාලය ඉතිරි කර ගැනීම සඳහා, අලංකාර පන්ති ධුරාවලියක්, විස්තීර්ණ දෝෂ හැසිරවීම සහ අනෙකුත් හොඳ දේවල් සහිත අංගසම්පූර්ණ පරීක්ෂණ යෙදුමක් මෙහි ගොඩනඟනවා වෙනුවට, අපි අපගේ උදාහරණ සැසියේ කාර්යයන් සඳහා පමණක් සීමා කරමු).

    Function startSession() ( // සැසිය දැනටමත් ආරම්භ කර ඇත්නම්, ක්‍රියාත්මක කිරීම නවතා සත්‍ය // (php.ini සිටුවම් ගොනුවෙහි session.auto_start පරාමිතිය අක්‍රිය කළ යුතුය - පෙරනිමි අගය) නම් (session_id()) ආපසු එවන්නේ නම් true; else return session_start() session_id() // session_start() ශ්‍රිතය ඇමතීමෙන් පසුව (session() ((session_id()) ( // සක්‍රිය සැසියක් තිබේ නම්, සැසි කුකීස් මකන්න, setcookie(session_name(), session_id(), time( )-60*60*24); සහ session_unset( );

    සටහන:යන්න ගම්‍ය වේ මූලික දැනුමපාඨකයා PHP සැසි ගැන දනී, එබැවින් අපි මෙහි session_start() සහ session_destroy() ශ්‍රිතවල මෙහෙයුම් මූලධර්මය ආවරණය නොකරමු. පිවිසුම් පෝරමයේ පිරිසැලසුම සහ පරිශීලක සත්‍යාපනය කිරීමේ කාර්යයන් ලිපියේ මාතෘකාවට සම්බන්ධ නොවේ, එබැවින් අපි ඒවා ද මඟහරිමු. එක් එක් ඊළඟ ඉල්ලීමෙහි පරිශීලකයා හඳුනා ගැනීමට, සාර්ථක පුරනය වීමේ මොහොතේ, අපට පරිශීලක හඳුනාගැනීම සැසි විචල්‍යයක (උදාහරණයක් ලෙස userid ලෙස නම් කර ඇත) ගබඩා කළ යුතු බව මම ඔබට මතක් කරමි සැසියේ ජීවිතය. අපගේ startSession() ශ්‍රිතයේ ප්‍රතිඵලය සැකසීම ක්‍රියාත්මක කිරීමද අවශ්‍ය වේ. ශ්‍රිතය FALSE වෙත පැමිණෙන්නේ නම්, පිවිසුම් පෝරමය බ්‍රවුසරයේ ප්‍රදර්ශනය කරන්න. ශ්‍රිතය සත්‍ය ලෙස ලබා දී ඇත්නම් සහ බලයලත් පරිශීලකයාගේ හඳුනාගැනීමේ (අපගේ නඩුවේ - userid) අඩංගු සැසි විචල්‍යයක් තිබේ නම් - බලයලත් පරිශීලකයාගේ පිටුව ප්‍රදර්ශනය කරන්න (දෝෂ හැසිරවීම පිළිබඳ වැඩි විස්තර සඳහා, 2013-06 දිනැති එකතු කිරීම බලන්න- සැසි විචල්‍ය පිළිබඳ කොටසේ 07).

    මෙතෙක් සියල්ල පැහැදිලිය. ඔබට පරිශීලක අක්‍රියතා පාලනය ක්‍රියාත්මක කිරීමට අවශ්‍ය වූ විට ප්‍රශ්න ආරම්භ වේ (සැසිය කල් ඉකුත්වීම), එක් බ්‍රවුසරයක බහු පරිශීලකයින්ට එකවර ක්‍රියා කිරීමට සහ අනවසර භාවිතයෙන් සැසි ආරක්ෂා කිරීමට. මෙය පහත සාකච්ඡා කරනු ඇත.

    බිල්ට් PHP මෙවලම් භාවිතයෙන් පරිශීලක අක්‍රියතාව නිරීක්ෂණය කිරීම

    පරිශීලකයින් සඳහා සියලු වර්ගවල කොන්සෝලවල සංවර්ධකයින් අතර බොහෝ විට පැන නගින පළමු ප්‍රශ්නය නම් පරිශීලකයාගේ අක්‍රියතාවයේ දී සැසිය ස්වයංක්‍රීයව අවසන් කිරීමයි. PHP හි ඇති හැකියාවන් භාවිතයෙන් මෙය කිරීමට වඩා පහසු දෙයක් නැත. (මෙම විකල්පය විශේෂයෙන් විශ්වසනීය හෝ නම්යශීලී නොවේ, නමුත් අපි එය සම්පූර්ණත්වය සඳහා සලකා බලමු).

    Function startSession() ( // පරිශීලක අක්‍රිය කාලය අවසන් වීම (තත්පර වලින්) $sessionLifetime = 300; නම් (session_id()) true return කරන්න; // කුකී ආයු කාලය ini_set("session.cookie_lifetime", $sessionLifetime) සකසන්න; // පරිශීලක නම් අක්‍රිය කල් ඉකුත්වීම සකසා ඇත, සේවාදායකයේ සැසි ආයු කාලය සකසන්න // සටහන: නිෂ්පාදන සේවාදායකයක් සඳහා, ($sessionLifetime) ini_set("session.gc_maxlifetime", $sessionLifetime නම් php.ini ගොනුව තුළ මෙම පරාමිති පෙරසිටීම නිර්දේශ කෙරේ (session_start(); )) ( setcookie(session_name(), session_id(), time()+$sessionLifetime); සත්‍ය ආපසු දෙන්න; ) වෙනත් අය අසත්‍ය ලබා දෙන්න)

    පැහැදිලි කිරීම් කිහිපයක්. ඔබ දන්නා පරිදි, ඉල්ලීම් ශීර්ෂයේ ඇති බ්‍රවුසරය විසින් එවන ලද කුකී නාමයෙන් දියත් කළ යුතු සැසිය PHP තීරණය කරයි. බ්‍රවුසරය, අනෙක් අතට, මෙම කුකිය සේවාදායකයෙන් ලබා ගනී, එහිදී එය session_start() ශ්‍රිතය ස්ථානගත කරයි. බ්‍රවුසර කුකිය කල් ඉකුත් වී ඇත්නම්, එය ඉල්ලීම තුළ නොයවනු ඇත, එයින් අදහස් කරන්නේ කුමන සැසිය ආරම්භ කළ යුතුද යන්න තීරණය කිරීමට PHP හට නොහැකි වන අතර මෙය නව සැසියක් නිර්මාණය කිරීමක් ලෙස සලකනු ඇත. PHP සැකසුම් පරාමිතිය session.gc_maxlifetime, අපගේ පරිශීලක අක්‍රිය කාලය අවසන් වීමට සමානව සකසා ඇති අතර, PHP සැසියක ආයු කාලය සකසන අතර සේවාදායකය විසින් පාලනය කරනු ලැබේ. සැසි ආයු කාලය පාලනය කිරීම පහත පරිදි ක්‍රියා කරයි (මෙහි අපි PHP හි වඩාත් පොදු සහ පෙරනිමි විකල්පය ලෙස තාවකාලික ගොනු වල සැසි ගබඩා කිරීමේ උදාහරණයක් සලකා බලමු).

    නව සැසියක් සෑදූ විට, PHP සැකසුම් පරාමිතිය තුළ සැසි ගබඩා නාමාවලිය ලෙස සකසන ලද බහලුම තුළ sess_ නමින් ගොනුවක් සාදනු ලැබේ.save_path , කොහෙද - සැසි හඳුනාගැනීම. ඊළඟට, සෑම ඉල්ලීමකදීම, දැනටමත් පවතින සැසියක් දියත් කරන අවස්ථාවේදී, PHP මෙම ගොනුවේ වෙනස් කිරීමේ කාලය යාවත්කාලීන කරයි. මේ අනුව, ඊළඟ සෑම අවස්ථාවකදීම PHP ඉල්ලීම, සැසි ගොනුවේ වත්මන් කාලය සහ අවසාන වෙනස් කිරීමේ කාලය අතර වෙනස මගින්, සැසිය සක්‍රියද නැතහොත් එහි ආයු කාලය දැනටමත් කල් ඉකුත් වී තිබේද යන්න තීරණය කළ හැක. (පැරණි සැසි ගොනු මකා දැමීමේ යාන්ත්‍රණය ඊළඟ කොටසේ වඩාත් විස්තරාත්මකව සාකච්ඡා කෙරේ.)

    සටහන:සැසි.gc_maxlifetime පරාමිතිය එක් සේවාදායකයක් තුළ ඇති සියලුම සැසි සඳහා (වඩාත් නිවැරදිව, එක් ප්‍රධාන PHP ක්‍රියාවලියක් තුළ) අදාළ වන බව මෙහිදී සටහන් කළ යුතුය. ප්‍රායෝගිකව, මෙයින් අදහස් කරන්නේ වෙබ් අඩවි කිහිපයක් සේවාදායකයේ ක්‍රියාත්මක වන්නේ නම් සහ ඒ සෑම එකක්ම තමන්ගේම පරිශීලක අක්‍රියතා කල් ඉකුත්වීමක් තිබේ නම්, මෙම පරාමිතිය එක් වෙබ් අඩවියක සැකසීම වෙනත් අඩවි සඳහා එය සැකසීමට හේතු වේ. හවුල් සත්කාරකත්වය සඳහා ද එය අදාළ වේ. මෙම තත්ත්වය මඟහරවා ගැනීම සඳහා, එකම සේවාදායකය තුළ එක් එක් වෙබ් අඩවිය සඳහා වෙන වෙනම සැසි නාමාවලි භාවිතා කරනු ලැබේ. සැසි නාමාවලිය වෙත මාර්ගය සැකසීම php.ini සිටුවම් ගොනුව තුළ ඇති session.save_path පරාමිතිය භාවිතයෙන් හෝ ini_set() ශ්‍රිතය ඇමතීමෙන් සිදු කෙරේ. මෙයින් පසු, එක් එක් වෙබ් අඩවියේ සැසි වෙන වෙනම නාමාවලි තුළ ගබඩා කරනු ලබන අතර, එක් වෙබ් අඩවියක පිහිටුවා ඇති session.gc_maxlifetime පරාමිතිය එහි සැසිය සඳහා පමණක් වලංගු වේ. අපි මෙම නඩුව විස්තරාත්මකව සලකා බලන්නේ නැත, විශේෂයෙන් පරිශීලක අක්‍රියතාව නිරීක්ෂණය කිරීම සඳහා අපට වඩාත් නම්‍යශීලී විකල්පයක් ඇති බැවින්.

    සැසි විචල්‍ය භාවිතයෙන් පරිශීලක අක්‍රියතාව පාලනය කිරීම

    පෙර විකල්පය, එහි සියලු සරල බව සඳහා (අමතර කේත රේඛා කිහිපයක් පමණක්) අපට අවශ්‍ය සියල්ල ලබා දෙන බව පෙනේ. නමුත් සෑම ඉල්ලීමක්ම පරිශීලක ක්‍රියාකාරකම්වල ප්‍රතිඵලයක් ලෙස සැලකිය නොහැකි නම් කුමක් කළ යුතුද? උදාහරණයක් ලෙස, පිටුවක කාල ගණකයක් ඇති අතර එය සේවාදායකයෙන් යාවත්කාලීන ලබා ගැනීමට වරින් වර AJAX ඉල්ලීමක් කරයි. එවැනි ඉල්ලීමක් පරිශීලක ක්‍රියාකාරකම් ලෙස සැලකිය නොහැක, එයින් අදහස් වන්නේ ස්වයංක්‍රීයව සැසි ආයු කාලය දීර්ඝ කිරීම මෙම නඩුවේදී නිවැරදි නොවන බවයි. නමුත් PHP විසින් session_start() ශ්‍රිතය කැඳවන සෑම අවස්ථාවකම ස්වයංක්‍රීයව සැසි ගොනුවේ වෙනස් කිරීමේ කාලය යාවත්කාලීන කරන බව අපි දනිමු, එයින් අදහස් වන්නේ ඕනෑම ඉල්ලීමක් සැසියේ ආයු කාලය දීර්ඝ කිරීමට හේතු වන අතර පරිශීලක අක්‍රියතා කල් ඉකුත්වීම කිසි විටෙකත් සිදු නොවන බවයි. මීට අමතරව, session.gc_maxlifetime පරාමිතියෙහි සංකීර්ණතා පිළිබඳ පෙර කොටසේ අවසාන සටහන සමහර අයට ක්‍රියාත්මක කිරීමට අපහසු සහ ව්‍යාකූල බවක් පෙනෙන්නට ඇත.

    මෙම ගැටළුව විසඳීම සඳහා, අපි ගොඩනඟන ලද PHP යාන්ත්‍රණ භාවිතය අතහැර දමා නව සැසි විචල්‍ය කිහිපයක් හඳුන්වා දෙන්නෙමු, එමඟින් පරිශීලක අක්‍රියතාවයේ කාලය අප විසින්ම පාලනය කිරීමට ඉඩ සලසයි.

    Function startSession($isUserActivity=true) ($sessionLifetime = 300; (session_id()) return true නම්; // බ්‍රවුසරය වැසීමට පෙර කුකී ආයු කාලය සකසන්න (අපි සේවාදායකයේ පැත්තෙන් සියල්ල පාලනය කරන්නෙමු) ini_set("සැසිය. cookie_lifetime", 0) ; (! session_start()) අසත්‍ය ලෙස ආපසු ලබා දෙන්නේ නම්; $t = කාලය(); නම් ($sessionLifetime) ( // පරිශීලකයාගේ අක්‍රිය කාලය අවසන් වී ඇත්නම්, // පරිශීලකයාගේ අවසන් ක්‍රියාකාරකමේ සිට ගත වූ කාලය පරීක්ෂා කරන්න // (අවසාන ඉල්ලීමේ වේලාව) අවසාන ක්‍රියාකාරී සැසි විචල්‍යය යාවත්කාලීන කළ විට) නම් (isset($_SESSION["lastactivity"]) && $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( // නම් පරිශීලකයාගේ අවසන් ක්‍රියාකාරකමේ සිට ගත වූ කාලය, // අකර්මණ්‍ය කාල සීමාවට වඩා වැඩි වේ, එයින් අදහස් වන්නේ සැසිය කල් ඉකුත් වී ඇති අතර සැසිය අවසන් කළ යුතු බවයි විනාශය (// කල් ඉකුත්වීම තවමත් සිදුවී නොමැති නම්, // සහ නම්). ඉල්ලීම පැමිණියේ පරිශීලක ක්‍රියාකාරකම්වල ප්‍රතිඵලයක් වශයෙනි, // අවසාන ක්‍රියාකාරීත්ව විචල්‍යය වත්මන් වේලාවේ අගය සමඟ යාවත්කාලීන කරන්න, // එමගින් ($isUserActivity) $_SESSION["lastactivity"] = සැසි කාලය තවත් සැසියකින් දීර්ඝ කරයි. $t; )) සත්‍ය ප්‍රතිලාභ; )

    අපි සාරාංශ කරමු. සෑම ඉල්ලීමකදීම, අපි අවසාන පරිශීලක ක්‍රියාකාරකමේ සිට වත්මන් මොහොත දක්වා කාලය අවසන් වී ඇත්දැයි පරීක්ෂා කර, එය ළඟා වී ඇත්නම්, අපි සැසිය විනාශ කර ශ්‍රිතය ක්‍රියාත්මක කිරීමට බාධා කරමින්, FALSE වෙත ආපසු යමු. කල් ඉකුත්වීම ළඟා වී නොමැති නම්, සහ $isUserActivity පරාමිතිය සත්‍ය අගය සමඟ ශ්‍රිතයට ලබා දුන්නේ නම්, අපි පරිශීලකයාගේ අවසන් ක්‍රියාකාරකමේ කාලය යාවත්කාලීන කරන්නෙමු. අප කළ යුත්තේ ඇමතුම් ස්ක්‍රිප්ටය තුළ ඉල්ලීම පරිශීලක ක්‍රියාකාරකම්වල ප්‍රතිඵලයක් දැයි තීරණය කිරීම සහ එසේ නොමැති නම්, FALSE ලෙස සකසා ඇති $isUserActivity පරාමිතිය සමඟින් startSession ශ්‍රිතය අමතන්න.

    2013-06-07 සිට යාවත්කාලීන කිරීම
    sessionStart() ශ්‍රිතයේ ප්‍රතිඵලය සැකසීම

    FALSE නැවත ලබා දීමෙන් දෝෂයට හේතුව පිළිබඳ සම්පූර්ණ අවබෝධයක් ලබා නොදෙන බවත්, මෙය සම්පූර්ණයෙන්ම සාධාරණ බවත් අදහස් පෙන්වා දුන්නේය. මම මෙහි සවිස්තරාත්මක දෝෂ හැසිරවීම ප්‍රකාශයට පත් කළේ නැත (ලිපියේ දිග දැනටමත් තරමක් විශාලයි), මෙය ලිපියේ මාතෘකාවට කෙලින්ම සම්බන්ධ නොවන බැවිනි. නමුත් අදහස් දැක්වීමේදී මම පැහැදිලි කරන්නම්.

    ඔබට පෙනෙන පරිදි, sessionStart ශ්‍රිතයට අවස්ථා දෙකකදී FALSE ලබා දිය හැක. සමහර අභ්‍යන්තර සේවාදායක දෝෂ හේතුවෙන් සැසිය ආරම්භ කළ නොහැක (උදාහරණයක් ලෙස, php.ini හි වැරදි සැසි සැකසුම්), නැතහොත් සැසි ආයු කාලය ඉකුත් වී ඇත. පළමු අවස්ථාවේ දී, සේවාදායකයේ ගැටළු ඇති බව සහ සහාය සම්බන්ධ කර ගැනීම සඳහා පෝරමයක් ඇති දෝෂයක් සහිත පිටුවකට අපි පරිශීලකයා හරවා යැවිය යුතුය. දෙවන අවස්ථාවේදී, අපි පරිශීලකයා පිවිසුම් පෝරමයට මාරු කළ යුතු අතර සැසිය කල් ඉකුත් වී ඇති බවට අනුරූප පණිවිඩයක් එහි පෙන්විය යුතුය. මෙය සිදු කිරීම සඳහා, අපට දෝෂ කේත ඇතුළත් කර FALSE වෙනුවට අදාළ කේතය ආපසු ලබා දිය යුතු අතර, ඇමතුම් ක්‍රමයේදී එය පරීක්ෂා කර ඒ අනුව ක්‍රියා කරන්න.

    දැන්, සේවාදායකයේ සැසියක් තවමත් පැවතුනද, පරිශීලකයාගේ අක්‍රිය කාලය අවසන් වී ඇත්නම් එය ප්‍රවේශ වූ පළමු වරට එය විනාශ වේ. ගෝලීය PHP සැකසුම් තුළ කුමන සැසියේ ආයු කාලය සකසා තිබුණද මෙය සිදුවනු ඇත.

    සටහන:බ්‍රව්සරය වසා දමා සැසියේ නම කුකී ස්වයංක්‍රීයව විනාශ වුවහොත් කුමක් සිදුවේද? මීළඟ වතාවේ බ්‍රවුසරය විවෘත කරන විට සේවාදායකයට කරන ඉල්ලීමේ සැසි කුකීස් අඩංගු නොවන අතර, සේවාදායකයට සැසිය විවෘත කිරීමට සහ පරිශීලකයාගේ අක්‍රිය කාලය පරීක්ෂා කිරීමට නොහැකි වනු ඇත. අපට, මෙය නව සැසියක් නිර්මාණය කිරීමට සමාන වන අතර ක්‍රියාකාරීත්වයට හෝ ආරක්ෂාවට කිසිම ආකාරයකින් බලපාන්නේ නැත. නමුත් සාධාරණ ප්‍රශ්නයක් පැනනඟින්නේ - කල් ඉකුත් වූ පසු අපි මෙතෙක් එය විනාශ කර ඇත්නම් පැරණි සැසිය විනාශ කරන්නේ කවුද? නැතහොත් එය දැන් සැසි නාමාවලියෙහි සදහටම එල්ලා තිබේද? PHP හි පැරණි සැසි පිරිසිදු කිරීම සඳහා, කුණු එකතු කිරීමේ යාන්ත්‍රණයක් ඇත. එය සේවාදායකයට ඊළඟ ඉල්ලීමේ වේලාවේදී ක්‍රියාත්මක වන අතර සැසි ගොනුවල අවසාන වෙනස් කිරීමේ දිනය මත පදනම්ව සියලුම පැරණි සැසි ඉවත් කරයි. නමුත් කසළ එකතු කිරීමේ යාන්ත්‍රණය සේවාදායකයට කරන සෑම ඉල්ලීමකින්ම ආරම්භ නොවේ. දියත් කිරීමේ සංඛ්‍යාතය (හෝ ඒ වෙනුවට, සම්භාවිතාව) සැකසුම් පරාමිති දෙකකින් තීරණය වේ session.gc_probability සහ session.gc_divisor. පළමු පරාමිතිය දෙවැන්නෙන් බෙදීමේ ප්රතිඵලය වන්නේ කසළ එකතු කිරීමේ යාන්ත්රණය දියත් කිරීමේ සම්භාවිතාවයි. මේ අනුව, සේවාදායකයට එක් එක් ඉල්ලීම සමඟ සැසි නිෂ්කාශන යාන්ත්‍රණය දියත් කිරීම සඳහා, මෙම පරාමිතීන් සමාන අගයන්ට සැකසිය යුතුය, උදාහරණයක් ලෙස “1”. මෙම ප්‍රවේශය පිරිසිදු සැසි නාමාවලියක් සහතික කරයි, නමුත් පැහැදිලිවම සේවාදායකයට මිල අධික වේ. එබැවින්, නිෂ්පාදන පද්ධති මත, session.gc_divisor හි පෙරනිමි අගය 1000 ලෙස සකසා ඇත, එයින් අදහස් වන්නේ කසළ එකතු කිරීමේ යාන්ත්‍රණය 1/1000 සම්භාවිතාවකින් ක්‍රියාත්මක වන බවයි. ඔබ ඔබේ php.ini ගොනුවේ මෙම සිටුවම් අත්හදා බැලුවහොත්, ඉහත විස්තර කර ඇති අවස්ථාවෙහිදී, බ්‍රවුසරය වසා එහි සියලුම කුකීස් ඉවත් කරන විට, සැසි නාමාවලියෙහි යම් කාලයක් සඳහා පැරණි සැසි ඉතිරිව ඇති බව ඔබට පෙනෙනු ඇත. නමුත් මෙය ඔබට කරදර විය යුතු නැත, මන්ද ... දැනටමත් සඳහන් කර ඇති පරිදි, මෙය කිසිදු ආකාරයකින් අපගේ යාන්ත්රණයේ ආරක්ෂාවට බලපාන්නේ නැත.

    2013-06-07 සිට යාවත්කාලීන කිරීම

    සැසි ගොනු අගුලු දැමීම හේතුවෙන් ස්ක්‍රිප්ට් කැටි කිරීම වැළැක්වීම

    සැසි ගොනුව අවහිර වීම හේතුවෙන් එකවර ක්‍රියාත්මක වන ස්ක්‍රිප්ට් කැටි කිරීමේ ප්‍රශ්නය අදහස් මතු කළේය (වඩාත් කැපී පෙනෙන විකල්පය දිගු ඡන්ද විමසීමයි).

    ආරම්භ කිරීම සඳහා, මෙම ගැටළුව සෘජුවම සේවාදායක පැටවීම හෝ පරිශීලකයින් සංඛ්යාව මත රඳා නොපවතින බව මම සටහන් කරමි. ඇත්ත වශයෙන්ම වඩා තවත් ඉල්ලීම්, ස්ක්‍රිප්ට් ධාවනය මන්දගාමී වේ. නමුත් මෙය වක්‍ර යැපීමකි. එක් පරිශීලකයෙකු වෙනුවෙන් සේවාදායකයට ඉල්ලීම් කිහිපයක් ලැබුණු විට ගැටළුව දිස්වන්නේ එක් සැසියක් තුළ පමණි (උදාහරණයක් ලෙස, ඒවායින් එකක් දිගු ඡන්ද විමසීමක් වන අතර ඉතිරිය සාමාන්‍ය ඉල්ලීම් වේ). සෑම ඉල්ලීමක්ම එකම සැසි ගොනුව වෙත ප්‍රවේශ වීමට උත්සාහ කරන අතර, පෙර ඉල්ලීම ගොනුව අගුළු නොදැමුවේ නම්, පසුව එන එක රැඳෙනු ඇත.

    සැසි ගොනු අගුලු දැමීම අවම මට්ටමක තබා ගැනීම සඳහා, සැසි විචල්‍යයන් සහිත සියලුම ක්‍රියා අවසන් වූ වහාම session_write_close() ශ්‍රිතය ඇමතීමෙන් සැසිය වසා දැමීම තරයේ නිර්දේශ කෙරේ. ප්‍රායෝගිකව, මෙයින් අදහස් කරන්නේ ඔබ සැසි විචල්‍යයන් තුළ සියල්ල ගබඩා නොකළ යුතු අතර ස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමේදී ඒවාට ප්‍රවේශ විය යුතු බවයි. ඔබට වැඩ කරන දත්ත කිහිපයක් සැසි විචල්‍යවල ගබඩා කිරීමට අවශ්‍ය නම්, සැසිය ආරම්භ වූ වහාම ඒවා කියවා, පසුව භාවිතා කිරීම සඳහා ඒවා දේශීය විචල්‍යවල සුරකින්න සහ සැසිය වසා දමන්න (එනම් session_write_close ශ්‍රිතය භාවිතයෙන් සැසිය වසා දැමීම සහ එය session_destroy භාවිතයෙන් විනාශ නොකිරීමයි. )

    අපගේ උදාහරණයේ දී, මෙයින් අදහස් කරන්නේ සැසියක් විවෘත කිරීමෙන් පසු, එහි ආයු කාලය සහ බලයලත් පරිශීලකයෙකුගේ පැවැත්ම පරීක්ෂා කිරීමෙන් පසුව, අප විසින් අමතර සියල්ල කියවා සුරැකිය යුතු බවයි. යෙදුම මගින් අවශ්ය වේසැසි විචල්‍යයන් (තිබේ නම්), පසුව session_write_close() වෙත ඇමතුමක් භාවිතයෙන් සැසිය වසා දමා, දිගු ඡන්ද විමසීමක් හෝ සාමාන්‍ය ඉල්ලීමක් වේවා, ස්ක්‍රිප්ට් එක දිගටම ක්‍රියාත්මක කරන්න.

    අනවසර භාවිතයෙන් සැසි ආරක්ෂා කිරීම

    අපි හිතමු තත්ත්වය. ඔබගේ එක් පරිශීලකයෙකුට බ්‍රවුසර කුකීස් සොරකම් කරන ට්‍රෝජන් එකක් ලබා ගනී (අපගේ සැසිය ගබඩා කර ඇති) සහ එය නිශ්චිත විද්‍යුත් තැපෑල වෙත යවයි. ප්‍රහාරකයා කුකිය ලබාගෙන අපගේ බලයලත් පරිශීලකයා වෙනුවෙන් ඉල්ලීමක් වංචා කිරීමට එය භාවිතා කරයි. සේවාදායකය මෙම ඉල්ලීම බලයලත් පරිශීලකයෙකුගෙන් ලැබුණු පරිදි සාර්ථකව පිළිගෙන සකසයි. IP ලිපිනයෙහි අතිරේක සත්‍යාපනය ක්‍රියාත්මක නොකළහොත්, එවැනි ප්‍රහාරයක් ඊළඟ සියලු ප්‍රතිවිපාක සමඟ පරිශීලකයාගේ ගිණුම සාර්ථක ලෙස අනවසරයෙන් ඇතුළු කිරීමට හේතු වේ.

    මෙය කළ හැකි වූයේ ඇයි? නිසැකවම, නම සහ සැසි හැඳුනුම්කාරකය සැසියේ මුළු ජීවිත කාලය සඳහාම සමාන වන අතර, ඔබට මෙම දත්ත ලැබෙන්නේ නම්, ඔබට වෙනත් පරිශීලකයෙකු වෙනුවෙන් පහසුවෙන් ඉල්ලීම් යැවිය හැකිය (ඇත්ත වශයෙන්ම, මෙම සැසියේ ජීවිත කාලය තුළ). මෙය වඩාත් සුලභ ආකාරයේ ප්‍රහාරයක් නොවිය හැකි නමුත් න්‍යායාත්මකව එය තරමක් ශක්‍ය බව පෙනේ, විශේෂයෙන් එවැනි ට්‍රෝජන් පරිශීලකයාගේ බ්‍රව්සර් කුකීස් කොල්ලකෑමට පරිපාලක අයිතිවාසිකම් පවා අවශ්‍ය නොවන බව සලකයි.

    මෙවැනි ප්‍රහාරවලින් ඔබ ආරක්ෂා වන්නේ කෙසේද? නැවතත්, පැහැදිලිවම, සැසි හඳුනාගැනීමේ ආයු කාලය සීමා කිරීම සහ එම සැසිය තුළම හඳුනාගැනීම වරින් වර වෙනස් කිරීම මගින්. පැරණි එක සම්පූර්ණයෙන්ම මකා දමා නව සැසියක් සාදා, පැරණි එකේ ඇති සියලුම සැසි විචල්‍යයන් එයට පිටපත් කිරීමෙන් අපට සැසියේ නම වෙනස් කළ හැකිය. නමුත් මෙය ප්‍රවේශයේ සාරයට බලපාන්නේ නැත, එබැවින් සරල බව සඳහා අපි සැසි හැඳුනුම්කාරකයට පමණක් සීමා වෙමු.

    සැසි හැඳුනුම්පතේ ආයු කාලය කෙටි වන තරමට, ප්‍රහාරකයෙකුට පරිශීලක ඉල්ලීමක් ව්‍යාජ ලෙස ලබා ගැනීමට කුකීස් ලබා ගැනීමට සහ භාවිතා කිරීමට ඇති කාලය අඩු බව පැහැදිලිය. ඉතා මැනවින්, එක් එක් ඉල්ලීම සඳහා නව හඳුනාගැනීමක් භාවිතා කළ යුතු අතර, එය වෙනත් කෙනෙකුගේ සැසියක් භාවිතා කිරීමේ හැකියාව අවම කරයි. නමුත් සැසි හඳුනාගැනීමේ පුනර්ජනන කාලය අත්තනෝමතික ලෙස සකසා ඇති විට අපි සාමාන්ය නඩුව සලකා බලමු.

    (අපි දැනටමත් සාකච්ඡා කර ඇති කේතයේ කොටස ඉවත් කරමු).

    Function startSession($isUserActivity=true) (// Session identifier lifetime $idLifetime = 60; ... ($idLifetime) නම් ( // සැසි හඳුනාගැනීමේ ආයු කාලය සකසා ඇත්නම්, // සැසිය සිට ගත වූ කාලය පරීක්ෂා කරන්න සාදන ලද හෝ අවසන් පුනර්ජනනය // (සැසි විචල්‍ය ආරම්භක වේලාව යාවත්කාලීන කරන ලද අවසාන ඉල්ලීමේ වේලාව) නම් (isset($_SESSION["ආරම්භක වේලාව"])) (($t-$_SESSION["ආරම්භක වේලාව"] නම්" >= $ idLifetime) ( // කාල සැසි හඳුනාගැනීමේ ආයු කාලය කල් ඉකුත් වී ඇත // නව හඳුනාගැනීමක් ජනනය කරන්න session_regenerate_id(true); $_SESSION["ආරම්භක වේලාව"] = $t) ) වෙනත් ( // සැසිය දැන් නිර්මාණය කර ඇත්නම් අපි මෙහි පැමිණෙමු // සැසි හඳුනාගැනීමේ උත්පාදන කාලය සකසන්න දැන් වේලාව$_SESSION["ආරම්භක වේලාව"] = $t; )) ඇත්ත ආපසු; )

    එබැවින්, නව සැසියක් නිර්මාණය කිරීමේදී (පරිශීලකයා සාර්ථකව ලොග් වූ විට එය සිදු වේ), අපි සැසි හඳුනාගැනීමේ අවසාන පරම්පරාවේ කාලය අප වෙනුවෙන් ගබඩා කරන සැසි විචල්‍ය ආරම්භක වේලාව, වත්මන් සේවාදායක කාලයට සමාන අගයකට සකසමු. මීළඟට, සෑම ඉල්ලීමකදීම, හඳුනාගැනීමේ අවසාන පරම්පරාවේ සිට ප්‍රමාණවත් කාලයක් (idLifetime) ගතවී ඇත්දැයි අපි පරීක්ෂා කරමු, එසේ නම්, අපි නව එකක් උත්පාදනය කරමු. මේ අනුව, හඳුනාගැනීමේ නියම කළ ජීවිත කාලය තුළ බලයලත් පරිශීලකයාගේ කුකිය ලබා ගත් ප්‍රහාරකයාට එය භාවිතා කිරීමට කාලය නොමැති නම්, ව්‍යාජ ඉල්ලීම සේවාදායකය විසින් අනවසර ලෙස සලකනු ලබන අතර, ප්‍රහාරකයා පිවිසුම් පිටුවට ගෙන යනු ඇත. .

    සටහන:නව සැසි හැඳුනුම බ්‍රවුසරයේ කුකියට ඇතුළු වන්නේ session_regenerate_id() ශ්‍රිතය හැඳින්වූ විට, එය නව කුකිය යවයි, එය session_start() ශ්‍රිතයට සමාන වේ, එබැවින් අපට කුකිය අප විසින්ම යාවත්කාලීන කිරීමට අවශ්‍ය නොවේ.

    අපට අපගේ සැසි හැකිතාක් ආරක්ෂිත කිරීමට අවශ්‍ය නම්, හඳුනාගැනීමේ ආයු කාලය එකකට සැකසීමට හෝ වරහන් වලින් session_regenerate_id() ශ්‍රිතය ඉවත් කර සියලු චෙක්පත් ඉවත් කිරීමට ප්‍රමාණවත් වේ, එය එක් එක් හඳුනාගැනීමේ පුනර්ජනනයට තුඩු දෙනු ඇත. ඉල්ලීම. (මෙම ප්‍රවේශයේ ක්‍රියාකාරීත්වයේ බලපෑම මා විසින් පරීක්‍ෂා කර නොමැති අතර, මට පැවසිය හැක්කේ session_regenerate_id(true) ශ්‍රිතය අත්‍යවශ්‍යයෙන්ම ක්‍රියා 4ක් පමණක් සිදු කරන බව පමණි: නව හඳුනාගැනීමක් උත්පාදනය කිරීම, සැසි කුකී සමඟ ශීර්ෂයක් නිර්මාණය කිරීම, පැරණි එක මකා දැමීම සහ නිර්මාණය කිරීම නව සැසි ගොනුවක්).

    ගීතමය අපගමනය:ට්‍රෝජන් කොතරම් දක්ෂද යත් එය ප්‍රහාරකයාට කුකීස් නොයවන්නේ නම්, නමුත් කුකිය ලැබුණු වහාම පෙර සූදානම් කළ ව්‍යාජ ඉල්ලීමක් යැවීම සංවිධානය කරන්නේ නම්, ඉහත විස්තර කර ඇති ක්‍රමයට බොහෝ විට එවැනි දේවලින් ආරක්ෂා වීමට නොහැකි වනු ඇත. ප්‍රහාරයක්, මක්නිසාද යත් ට්‍රෝජන් හට කුකිය ලැබෙන වේලාව සහ ව්‍යාජ ඉල්ලීම යැවීම අතර ප්‍රායෝගිකව කිසිදු වෙනසක් සිදු නොවන අතර, මේ මොහොතේ සැසි හඳුනාගැනීම් නැවත උත්පාදනය නොවීමට ඉහළ සම්භාවිතාවක් ඇත.

    පරිශීලකයින් කිහිප දෙනෙකු වෙනුවෙන් එක් බ්‍රව්සරයක එකවර වැඩ කිරීමේ හැකියාව

    මම සලකා බැලීමට කැමති අවසාන කාර්යය වන්නේ පරිශීලකයින් කිහිප දෙනෙකුට එක් බ්‍රව්සරයක එකවර වැඩ කිරීමේ හැකියාවයි. ඔබට පරිශීලකයින්ගේ සමකාලීන වැඩ අනුකරණය කිරීමට අවශ්‍ය වූ විට, පරීක්ෂණ අදියරේදී මෙම විශේෂාංගය විශේෂයෙන් ප්‍රයෝජනවත් වන අතර, පවතින සම්පූර්ණ අවි ගබඩාව භාවිතා කිරීමට හෝ අප්‍රකට මාදිලියේ බ්‍රව්සරයේ අවස්ථා කිහිපයක් විවෘත කිරීමට වඩා ඔබේ ප්‍රියතම බ්‍රව්සරයේ මෙය කිරීම සුදුසුය. .

    අපගේ පෙර උදාහරණ වලදී, අපි සැසි නාමයක් නිශ්චිතව සඳහන් නොකළ නිසා පෙරනිමි PHP නම (PHPSESSID) භාවිතා කරන ලදී. ඒ කියන්නේ අපි මෙතෙක් හදපු හැම සැසියක්ම PHPSESSID නමින් බ්‍රවුසරයට කුකියක් යවා තිබෙනවා. නිසැකවම, කුකීස් නම සෑම විටම එකම නම්, එකම බ්‍රවුසරය තුළ එකම නමින් සැසි දෙකක් සංවිධානය කිරීමට ක්‍රමයක් නොමැත. නමුත් අපි එක් එක් පරිශීලකයා සඳහා අපගේම සැසියේ නම භාවිතා කළහොත්, ගැටළුව විසඳනු ඇත. අපි එහෙම කරමු.

    Function startSession($isUserActivity=true, $prefix=null) (... නම් (session_id()) true return කරන්න; // පරිශීලක උපසර්ගය පරාමිති තුළ සමත් වී ඇත්නම්, // මෙය ඇතුළත් අද්විතීය සැසි නාමයක් සකසන්න උපසර්ගය, // වෙනත් ආකාරයකින් සියලුම පරිශීලකයින් සඳහා පොදු නම සකසන්න (උදාහරණයක් ලෙස, MYPROJECT) session_name("MYPROJECT".($ උපසර්ගය ? "_".$ උපසර්ගය: "") ini_set("session.cookie_lifetime", 0); (! session_start()) බොරු නම්...

    දැන් ඉතිරිව ඇත්තේ ඇමතුම් ස්ක්‍රිප්ට් එක එක් එක් පරිශීලකයා සඳහා අනන්‍ය උපසර්ගයක් startSession() ශ්‍රිතයට ලබා දෙන බවට වග බලා ගැනීමයි. උදාහරණයක් ලෙස, එක් එක් ඉල්ලීමෙහි GET/POST පරාමිතිවල උපසර්ගයක් සම්මත කිරීමෙන් හෝ අතිරේක කුකියක් හරහා මෙය සිදු කළ හැක.

    නිගමනය

    අවසාන වශයෙන්, ඉහත සාකච්ඡා කර ඇති සියලුම කාර්යයන් ඇතුළුව, PHP සැසි සමඟ වැඩ කිරීම සඳහා අපගේ ක්‍රියාකාරකම්වල සම්පූර්ණ අවසාන කේතය මම ලබා දෙන්නෙමි.

    Function startSession($isUserActivity=true, $prefix=null) ($sessionLifetime = 300; $idLifetime = 60; නම් (session_id()) true ලබා දෙන්න; session_name("MYPROJECT".($prefix ? "_".$prefix "")); $t-$_SESSION["lastactivity"] >= $sessionLifetime) ( විනාශ සැසිය(); අසත්‍ය ආපසු දෙන්න; ) වෙනත් (($isUserActivity) නම් $_SESSION["lastactivity"] = $t; ) ) නම් ($idLifetime ) ( නම් (isset($_SESSION["ආරම්භක කාලය"])) (($t-$_SESSION["ආරම්භක කාලය"] >= $idLifetime) ( session_regenerate_id(true); $_SESSION["ආරම්භක කාලය"] = $t; ) ) වෙනත් ($_SESSION["ආරම්භක වේලාව"] = $t;) ) සත්‍යයක් ලබා දෙන්න; 60 * 24 සැසිය_ විනාශය ();

    මෙම ලිපිය කිසි දිනක සැසි යාන්ත්‍රණය ගැන ගැඹුරින් අධ්‍යයනය නොකළ අයට යම් කාලයක් ඉතිරි කර දෙනු ඇතැයි මම බලාපොරොත්තු වෙමි, සහ PHP සමඟ දැන හඳුනා ගැනීමට පටන් ගන්නා අයට මෙම යාන්ත්‍රණය පිළිබඳ ප්‍රමාණවත් අවබෝධයක් ලබා දෙනු ඇතැයි මම බලාපොරොත්තු වෙමි.