আমি পিএইচপি মধ্যে সেশন সময়সীমা প্রসারিত করতে চাই
আমি জানি যে php.ini ফাইলটি সংশোধন করে এটি করা সম্ভব। তবে আমার এতে অ্যাক্সেস নেই।
তাহলে কি কেবল পিএইচপি কোড দিয়ে এটি করা সম্ভব?
আমি পিএইচপি মধ্যে সেশন সময়সীমা প্রসারিত করতে চাই
আমি জানি যে php.ini ফাইলটি সংশোধন করে এটি করা সম্ভব। তবে আমার এতে অ্যাক্সেস নেই।
তাহলে কি কেবল পিএইচপি কোড দিয়ে এটি করা সম্ভব?
উত্তর:
সেশন সময়সীমা এমন একটি ধারণা যা আপনি কঠোর গ্যারান্টি চাইলে কোডে প্রয়োগ করতে হবে; যে একমাত্র উপায় আপনি একেবারে নির্দিষ্ট কোনো অধিবেশন কি কখনো নিষ্ক্রিয়তার এক্স মিনিট পরে টিকে থাকবে হতে পারে।
যদি এই প্রয়োজনীয়তাটি কিছুটা শিথিল করা গ্রহণযোগ্য হয় এবং আপনি সময়কালের সীমাবদ্ধতার পরিবর্তে একটি নিম্ন সীমা স্থাপনের সাথে ভাল থাকেন তবে আপনি সহজেই এবং কাস্টম যুক্তি না লিখে এটি করতে পারেন।
যদি আপনার সেশনগুলি কুকিজের সাথে প্রয়োগ করা হয় (যা তারা সম্ভবত হয়) এবং যদি ক্লায়েন্টরা দূষিত না হয় তবে আপনি নির্দিষ্ট পরামিতিগুলিতে টুইট করে সেশনের সময়কালে উপরের বাউন্ড সেট করতে পারেন। আপনি যদি কুকিজের সাথে পিএইচপি-র ডিফল্ট সেশন হ্যান্ডলিং ব্যবহার করেন, তবে সেটিংটি আপনার session.gc_maxlifetime
সাথে session_set_cookie_params
কাজ করা উচিত:
// server should keep session data for AT LEAST 1 hour
ini_set('session.gc_maxlifetime', 3600);
// each client should remember their session id for EXACTLY 1 hour
session_set_cookie_params(3600);
session_start(); // ready to go!
এটি কমপক্ষে এক ঘন্টা নিষ্ক্রিয়তার জন্য সেশন ডেটা প্রায় রাখার জন্য সার্ভারকে কনফিগার করে এবং আপনার ক্লায়েন্টদের নির্দেশ দেয় যে একই সময়কালের পরে তাদের সেশন আইডিটি "ভুলে যেতে" হবে। এই দুটি পদক্ষেপই প্রত্যাশিত ফলাফল অর্জনের জন্য প্রয়োজনীয়।
যদি আপনি ক্লায়েন্টদের এক ঘন্টা পরে তাদের সেশন আইডি ভুলে যেতে না বলেন (বা যদি ক্লায়েন্টরা দূষিত হয় এবং আপনার নির্দেশাবলী উপেক্ষা করতে চান) তবে তারা একই সেশনের আইডি ব্যবহার চালিয়ে যাবে এবং এর কার্যকর সময়কালটি অ-নিরোধক হবে। কারণ এটি যে সেশনগুলির আজীবন সার্ভার সাইডে শেষ হয়ে গেছে তা অবিলম্বে আবর্জনা সংগ্রহ করা হয় না তবে কেবল যখনই সেশন জিসি লিক করে ।
জিসি একটি সম্ভাব্য ব্যয়বহুল প্রক্রিয়া, সুতরাং সাধারণত সম্ভাবনাটি বরং ছোট বা শূন্যও হয় (প্রচুর পরিমাণে হিট ওয়েবসাইট সম্ভবত সম্ভাব্য জিসি পুরোপুরি ছেড়ে চলে যাবে এবং প্রতি X মিনিটে ব্যাকগ্রাউন্ডে হওয়ার জন্য সময় নির্ধারণ করবে)। উভয় ক্ষেত্রে (অসহযোগী ক্লায়েন্ট ধরে নিলে) কার্যকর সেশনের লাইফটাইমগুলির জন্য নিম্ন সীমাটি হবে session.gc_maxlifetime
, তবে উপরের সীমাটি অনির্দেশ্য হবে।
আপনি যদি session.gc_maxlifetime
একই সময়ের ব্যবধানে সেট না করেন তবে সার্ভার তার চেয়েও অলস সেশন ডেটা বাতিল করতে পারে; এই ক্ষেত্রে, একটি ক্লায়েন্ট যা এখনও তাদের সেশন আইডি মনে রাখে তা উপস্থাপন করবে তবে সার্ভার সেই অধিবেশনটির সাথে সম্পর্কিত কোনও ডেটা খুঁজে পাবে না, কার্যকরভাবে আচরণ করবে যেন সেশনটি সবে শুরু হয়েছিল।
আপনি সেশন নিষ্ক্রিয়তার উপরের অংশের উপর চাপ দেওয়ার জন্য কাস্টম লজিক ব্যবহার করে জিনিসগুলি সম্পূর্ণ নিয়ন্ত্রণযোগ্য করতে পারেন ; উপরে থেকে নিম্ন সীমাটি একসাথে এক কঠোর সেটিংয়ের ফলাফল।
উপরের সীমাটি বাকী সেশন ডেটার সাথে একত্রে সংরক্ষণ করে এটি করুন:
session_start(); // ready to go!
$now = time();
if (isset($_SESSION['discard_after']) && $now > $_SESSION['discard_after']) {
// this session has worn out its welcome; kill it and start a brand new one
session_unset();
session_destroy();
session_start();
}
// either new or old, it should live at most for another hour
$_SESSION['discard_after'] = $now + 3600;
এখন পর্যন্ত আমরা প্রতিটি সেশনের আইডির সঠিক মানগুলি নিয়ে মোটেই উদ্বিগ্ন হইনি, কেবলমাত্র প্রয়োজনীয়তার সাথে আমাদের প্রয়োজন যতক্ষণ ডেটা প্রয়োজন। সচেতন থাকুন যে (সম্ভাব্য) ক্ষেত্রে সেশন আইডির বিষয়টি আপনার কাছে গুরুত্বপূর্ণ, session_regenerate_id
প্রয়োজনের সাথে সেগুলি পুনরায় জন্মানোর জন্য যত্ন নেওয়া উচিত ।
session_start()
হিসাবে ভাল (অন্যথায় সব সময়ে কোন প্রভাব) এবং কেবল যদি আপনি সবসময় পূর্ববর্তীদের দুই কল session_start
(অন্যথায় gc_maxlifetime
, সম্ভাব্য বর্তমানে খোলা সকল সেশান প্রভাবিত করার আছে, যখন session_set_cookie_params
শুধুমাত্র একটি নতুন সেশন প্রভাবিত করতে পারে যে দিয়ে শুরু হয় বর্তমান অনুরোধ)।
আপনি যদি পিএইচপি-র ডিফল্ট সেশন হ্যান্ডলিং ব্যবহার করেন তবে সমস্ত প্ল্যাটফর্মে সেশন সময়কালকে নির্ভরযোগ্যভাবে পরিবর্তন করার একমাত্র উপায় হ'ল php.ini পরিবর্তন করা । কারণ কিছু প্ল্যাটফর্মে, আবর্জনা সংগ্রহ এমন একটি স্ক্রিপ্টের মাধ্যমে প্রয়োগ করা হয় যা প্রতিটি নির্দিষ্ট সময় ( ক্রোন স্ক্রিপ্ট) চালায় যা সরাসরি পিএইচপি.এনই থেকে পড়ে এবং তাই রান সময় সময়ে এটি পরিবর্তন করার কোনও প্রচেষ্টা যেমন ini_set()
অবিশ্বাস্য এবং সম্ভবত কাজ করবে না
উদাহরণস্বরূপ, ডেবিয়ান লিনাক্স সিস্টেমে পিএইচপি-র অভ্যন্তরীণ আবর্জনা সংগ্রহটি session.gc_probability=0
কনফিগারেশনে ডিফল্টরূপে সেট করে অক্ষম করা হয় এবং এর পরিবর্তে /etc/cron.d/php এর মাধ্যমে সম্পন্ন হয় যা XX: 09 এবং XX: 39 এ চলেছে (যা, প্রতি আধ ঘন্টা). এই ক্রোন জবটি কনফিগারেশনে উল্লিখিত সেশন. gc_max Lifetime এর চেয়ে পুরানো সেশনগুলির সন্ধান করে এবং যদি কোনও সন্ধান পাওয়া যায় তবে সেগুলি মুছে ফেলা হয়। ফলস্বরূপ, এই সিস্টেমগুলিতে ini_set('session.gc_maxlifetime', ...)
উপেক্ষা করা হয়। এটি আরও ব্যাখ্যা করে যে এই প্রশ্নে: পিএইচপি সেশনগুলি খুব দ্রুত শেষ হয়ে যায় , ওপিতে একটি হোস্টে সমস্যা ছিল তবে অন্য হোস্টে স্যুইচ করার সময় সমস্যাগুলি থেমে গেছে।
সুতরাং, আপনি যদি php.ini তে অ্যাক্সেস না পেয়ে থাকেন তবে আপনি যদি এটি বহনযোগ্যভাবে করতে চান তবে ডিফল্ট সেশন হ্যান্ডলিং ব্যবহার করা কোনও বিকল্প নয়। স্পষ্টতই, কুকির আজীবন সময় বাড়ানো আপনার হোস্টের পক্ষে যথেষ্ট ছিল, তবে আপনি যদি এমন কোনও সমাধান চান যা হোস্টগুলি স্যুইচ করেও নির্ভরযোগ্যভাবে কাজ করে, আপনাকে আলাদা বিকল্প ব্যবহার করতে হবে।
উপলভ্য বিকল্প পদ্ধতিগুলির মধ্যে রয়েছে:
পিএইচপি: কাস্টম সেশন হ্যান্ডলারের (পিএইচপি ম্যানুয়াল) নির্দিষ্ট করে আলাদা আলাদা ডিরেক্টরিতে বা ডাটাবেসে আপনার সেশনগুলি সংরক্ষণ করতে পিএইচপি-তে একটি পৃথক সেশন (সেভ) হ্যান্ডলার সেট করুন , যাতে ক্রোন জব এটি না পৌঁছায় এবং কেবল পিএইচপি'র অভ্যন্তরীণ আবর্জনা সংগ্রহ স্থান গ্রহণ। এই বিকল্পটি সম্ভবত ব্যবহার করতে পারেন ini_set()
সেটে session.gc_maxlifetime কিন্তু আমি শুধু উপেক্ষা করতে পছন্দ maxlifetime আমার মাপদণ্ড gc()
কলব্যাক এবং আমার নিজের উপর সর্বাধিক জীবনকাল নির্ধারণ করে।
পিএইচপি অভ্যন্তরীণ সেশন হ্যান্ডলিং সম্পর্কে সম্পূর্ণরূপে ভুলে যান এবং আপনার নিজের সেশন পরিচালনার বাস্তবায়ন করুন। এই পদ্ধতির দুটি প্রধান অসুবিধা রয়েছে: আপনার নিজের বৈশ্বিক সেশন ভেরিয়েবলগুলির প্রয়োজন হবে, সুতরাং আপনি $_SESSION
সুপারগ্লোবালের সুবিধাটি হারাবেন এবং এর জন্য আরও কোডের প্রয়োজন রয়েছে যাতে বাগ এবং সুরক্ষা ত্রুটিগুলির আরও সুযোগ রয়েছে। সর্বাধিক গুরুত্বপূর্ণ, সেশন আইডির পূর্বাভাসতা (সম্ভাব্য সেশন হাইজ্যাকিংয়ের দিকে পরিচালিত করা) এড়াতে সেশন আইডেন্টিফায়ারটি ক্রিপ্টোগ্রাফিকভাবে নিরাপদ এলোমেলো বা সিউডোর্যান্ডম সংখ্যার বাইরে উত্পন্ন করা উচিত, এবং এটি পিএইচপি সহ বহনযোগ্যভাবে করা সহজ নয়। প্রধান সুবিধাটি হ'ল এটি সমস্ত প্ল্যাটফর্মগুলিতে ধারাবাহিকভাবে কাজ করবে এবং কোডের উপর আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে। এটি হ'ল উদাহরণটি পিএইচপিবিবি ফোরাম সফ্টওয়্যার দ্বারা নেওয়া (কমপক্ষে সংস্করণ 1; আমি সাম্প্রতিক সংস্করণগুলি সম্পর্কে নিশ্চিত নই)।
এর জন্য ডকুমেন্টেশনেsession_set_save_handler()
(1) উদাহরণ রয়েছে । উদাহরণটি দীর্ঘ তবে আমি অধিবেশন সময়কাল বাড়ানোর জন্য প্রয়োজনীয় প্রাসঙ্গিক পরিবর্তন সহ এখানে এটি পুনরুত্পাদন করব। session_set_cookie_params()
পাশাপাশি কুকির জীবনকাল বাড়ানোর অন্তর্ভুক্তকরণটি নোট করুন ।
<?php
class FileSessionHandler
{
private $savePath;
private $lifetime;
function open($savePath, $sessionName)
{
$this->savePath = 'my_savepath'; // Ignore savepath and use our own to keep it safe from automatic GC
$this->lifetime = 3600; // 1 hour minimum session duration
if (!is_dir($this->savePath)) {
mkdir($this->savePath, 0777);
}
return true;
}
function close()
{
return true;
}
function read($id)
{
return (string)@file_get_contents("$this->savePath/sess_$id");
}
function write($id, $data)
{
return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true;
}
function destroy($id)
{
$file = "$this->savePath/sess_$id";
if (file_exists($file)) {
unlink($file);
}
return true;
}
function gc($maxlifetime)
{
foreach (glob("$this->savePath/sess_*") as $file) {
if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime
unlink($file);
}
}
return true;
}
}
$handler = new FileSessionHandler();
session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);
// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');
session_set_cookie_params(3600); // Set session cookie duration to 1 hour
session_start();
// proceed to set and retrieve values by key from $_SESSION
পদ্ধতির (2) আরও জটিল; মূলত, আপনাকে নিজেরাই সমস্ত অধিবেশন ফাংশন পুনরায় প্রয়োগ করতে হবে। আমি এখানে বিশদে যাব না।
php.ini
আপনার ব্যবহারিক বিকল্পগুলিতে অ্যাক্সেস না থাকলে কঠোরভাবে সীমাবদ্ধ।
/usr/lib/php5/maxlifetime
24 মিনিটের নিচে কোনও মান গণনা করবে না। সুতরাং আপনি আপনার সেশন সময়সীমা এর চেয়ে কম সেট করতে পারবেন না।
উপরের যে কোনও আমার কাছে পাগল হওয়ায় প্লেস্ককে যে কারও সাথে সমস্যা রয়েছে সে সম্পর্কে মন্তব্য যুক্ত করা, আপনার পিএইচপি স্ক্রিপ্ট থেকে সেশন.gc_max Lifeটাই সেট করে প্লেস্কের ক্রোন থেকে নিজস্ব আবর্জনা সংগ্রহের স্ক্রিপ্ট রয়েছে বলে কাজ করবে না।
এই সমস্যাটি এড়াতে আমি ক্রোন জবকে ঘন্টার পর ঘন্টা থেকে প্রতিদিনে সরানোর নীচের লিঙ্কে পোস্ট করা সমাধানটি ব্যবহার করেছি, তারপরে উপরের শীর্ষ উত্তরের কাজ করা উচিত:
mv /etc/cron.hourly/plesk-php-cleanuper /etc/cron.daily/
https://websavers.ca/plesk-php-sessions-timing-earlier-expected
$_SESSION['login_time'] = time();
পূর্ববর্তী প্রমাণীকরণ পৃষ্ঠাতে রাখুন । এবং প্রতিটি অন্যান্য পৃষ্ঠাতে আপনি সেশন সময়-আউট পরীক্ষা করতে চান যেখানে নীচে ছিটিয়ে।
if(time() - $_SESSION['login_time'] >= 1800){
session_destroy(); // destroy session.
header("Location: logout.php");
die(); // See https://thedailywtf.com/articles/WellIntentioned-Destruction
//redirect if the page is inactive for 30 minutes
}
else {
$_SESSION['login_time'] = time();
// update 'login_time' to the last time a page containing this code was accessed.
}
সম্পাদনা: এটি কেবলমাত্র যদি আপনি ইতিমধ্যে অন্য পোস্টগুলিতে টুইটগুলি ব্যবহার করেন, বা আবর্জনা সংগ্রহ নিষ্ক্রিয় করেন এবং ম্যানুয়ালি সেশনের সময়কাল পরীক্ষা করতে চান তবে এটি কাজ করে। die()
পুনর্নির্দেশের পরে যুক্ত করতে ভুলবেন না কারণ কিছু স্ক্রিপ্ট / রোবট এটিকে উপেক্ষা করতে পারে। এছাড়াও, session_destroy()
কোনও পুনর্নির্দেশের উপর নির্ভর না করে সরাসরি সেশনটি ধ্বংস করে দেওয়া কারণ এটির জন্য আবার কোনও দূষিত ক্লায়েন্ট বা রোবটের ক্ষেত্রে আরও ভাল বিকল্প হতে পারে।
একটি ভাগ করে নেওয়ার হোস্টিং সার্ভারের জন্য একটি নোটিশ বা ডোমেনগুলি = এ যুক্ত হয়েছে
আপনার সেটিংসটি কাজ করার জন্য আপনার পিএইচপি_ভ্যালু সেশন.সভ_প্যাথ "ফোল্ডারএ / সেশনসএ" ব্যবহার করে যুক্ত ডোমেনের জন্য আলাদা সেভ সেশন দির থাকতে হবে।
সুতরাং আপনার রুট সার্ভারে একটি ফোল্ডার তৈরি করুন, সর্বজনীন_এইচটিএমএলে নয় এবং বাইরে থেকে প্রচারিত হওয়ার জন্য নয়। আমার সিপ্যানেল / সার্ভারের জন্য 0700 ফোল্ডারের অনুমতিগুলি সূক্ষ্মভাবে কাজ করেছে a
পিএইচপি কোড =
#Session timeout, 2628000 sec = 1 month, 604800 = 1 week, 57600 = 16 hours, 86400 = 1 day
ini_set('session.save_path', '/home/server/.folderA_sessionsA');
ini_set('session.gc_maxlifetime', 57600);
ini_set('session.cookie_lifetime', 57600);
ini_set('session.cache_expire', 57600);
ini_set('session.name', 'MyDomainA');
সেশন_স্টার্ট এর আগে ();
অথবা
.htaccess =
php_value session.save_path /home/server/.folderA_sessionsA
php_value session.gc_maxlifetime 57600
php_value session.cookie_lifetime 57600
php_value session.cache_expire 57600
php_value session.name MyDomainA
অনেক গবেষণা এবং পরীক্ষার পরে ভাগ করা সিপেনেল / পিএইচপি 7 সার্ভারের জন্য এটি দুর্দান্ত কাজ করেছে। অনেক ধন্যবাদ: NoiS
না। যদি আপনার php.ini অ্যাক্সেস না থাকে তবে আপনি গ্যারান্টি দিতে পারবেন না যে পরিবর্তনের কোনও প্রভাব থাকবে।
আমি আপনাকে আপনার সেশন সময় বাড়ানোর প্রয়োজন সন্দেহ।
এই মুহুর্তে এটির বুদ্ধিমান সময়সীমা রয়েছে এবং এটি প্রসারিত করার কোনও কারণ নেই।
SELECT id FROM gallery WHERE SortOrder > $currentsortorder LIMIT 1
আপনি আপনার পিএইচপি কোড ব্যবহার করে php.ini এর মানগুলি ওভাররাইড করতে পারেন ini_set()
।
session.gc_maxlifetime
সেশন আজীবন নিয়ন্ত্রণ করে এমন সেটিংস নয়। যদি আপনি সেট এটা এভাবে কাজ করে তার আগেই ইনিংসের যাবে session.gc_divisor
থেকে 1
, কিন্তু যে শুধু ভয়ঙ্কর।
gc_maxlifetime
বিরতি নির্ধারণ করে যার পরে সেশন ডেটা আবর্জনা সংগ্রহের জন্য যোগ্য - যদি জিসি যদি অনেক বেশি সময় অতিবাহিত হওয়ার পরে ঘটে তবে সেশন ডেটা নষ্ট হয়ে যাবে (ডিফল্ট সেটিংসের সাথে এটি অধিবেশনটির মেয়াদ শেষ হওয়ার সমান)। তবে প্রতিটি সেশন শুরুর দিকে জিসি সম্ভাব্যতার সূত্রপাত ঘটায়, সুতরাং অধিবেশনটি আসলে শেষ হওয়ার কোনও গ্যারান্টি নেই - আপনি প্রোব বনাম সময়ের একটি বক্ররেখা প্লট করতে পারেন, তবে এটি কোনও ইটওয়ালের মতো দেখাবে না। এটি হিমশৈলের একমাত্র ডগা; দেখতে stackoverflow.com/questions/520237/...