আপনার Rails অ্যাপটি কে এটি পরিদর্শন করছে তা বলতে না পারলে কী হবে? যদি আপনার কোন ধারণা ছিল না যে একই ব্যক্তি দুটি ভিন্ন পৃষ্ঠার অনুরোধ করেছেন? যদি আপনি একটি প্রতিক্রিয়া ফেরত দেওয়ার সাথে সাথে আপনার সংরক্ষণ করা সমস্ত ডেটা অদৃশ্য হয়ে যায়?
এটি বেশিরভাগ স্ট্যাটিক সাইটের জন্য জরিমানা হতে পারে। কিন্তু অধিকাংশ অ্যাপের কিছু সঞ্চয় করতে সক্ষম হওয়া প্রয়োজন একটি ব্যবহারকারী সম্পর্কে ডেটা৷৷ হতে পারে এটি একটি ব্যবহারকারীর আইডি, বা একটি পছন্দের ভাষা, অথবা তারা সবসময় তাদের iPad এ আপনার সাইটের ডেস্কটপ সংস্করণ দেখতে চায় কিনা।
সেশন
এই ধরনের ডেটা রাখার উপযুক্ত জায়গা। একের অধিক অনুরোধের জন্য অল্প কিছু ডেটা আপনি রাখতে চান।
সেশনগুলি ব্যবহার করা সহজ:
session[:current_user_id] = @user.id
কিন্তু তারা একটু যাদুকর হতে পারে। একটি অধিবেশন কি? রেল কীভাবে সঠিক ব্যক্তিকে সঠিক ডেটা দেখাতে জানে? এবং আপনি কীভাবে সিদ্ধান্ত নেবেন যে আপনি আপনার সেশনের ডেটা কোথায় রাখবেন?
একটি সেশন কি?
একটি অধিবেশন শুধুমাত্র একটি অনুরোধের সময় ডেটা সঞ্চয় করার একটি জায়গা যা আপনি পরবর্তী অনুরোধের সময় পড়তে পারেন৷৷
আপনি একটি কন্ট্রোলার অ্যাকশনে কিছু ডেটা সেট করতে পারেন:
def create
# ...
session[:current_user_id] = @user.id
# ...
end
এবং এটি অন্যটিতে পড়ুন:
def index
current_user = User.find_by_id(session[:current_user_id])
# ...
end
এটি মনে নাও হতে পারে৷ যে আকর্ষণীয় কিন্তু সবকিছু সংযুক্ত করতে আপনার ব্যবহারকারীর ব্রাউজার এবং আপনার Rails অ্যাপের মধ্যে সমন্বয় প্রয়োজন। এবং এটি সব কুকি দিয়ে শুরু হয়।
আপনি যখন একটি ওয়েবপৃষ্ঠার অনুরোধ করেন, তখন সার্ভার একটি কুকি সেট করতে পারে যখন এটি উত্তর দেয়:
~ jweiss$ curl -I https://www.google.com | grep Set-Cookie
Set-Cookie: NID=67=J2xeyegolV0SSneukSOANOCoeuDQs7G1FDAK2j-nVyaoejz-4K6aouUQtyp5B_rK3Z7G-EwTIzDm7XQ3_ZUVNnFmlGfIHMAnZQNd4kM89VLzCsM0fZnr_N8-idASAfBEdS; expires=Wed, 16-Sep-2015 05:44:42 GMT; path=/; domain=.google.com; HttpOnly
আপনার ব্রাউজার সেই কুকি সংরক্ষণ করবে। এবং কুকির মেয়াদ শেষ না হওয়া পর্যন্ত, আপনি যতবার অনুরোধ করবেন, আপনার ব্রাউজার কুকিগুলিকে সার্ভারে ফেরত পাঠাবে:
...
> GET / HTTP/1.1
> User-Agent: curl/7.37.1
> Host: www.google.com
> Accept: */*
> Cookie: NID=67=J2xeyegolV0SSneukSOANOCoeuDQs7G1FDAK2j-nVyaoejz-4K6aouUQtyp5B_rK3Z7G-EwTIzDm7XQ3_ZUVNnFmlGfIHMAnZQNd4kM89VLzCsM0fZnr_N8-idASAfBEdS; expires=Wed, 16-Sep-2015 05:44:42 GMT; path=/; domain=.google.com; HttpOnly
...
অনেক কুকি শুধু অবাস্তব মত দেখায়। এবং তারা অনুমিত হয়. কারণ কুকির ভিতরের তথ্য ব্যবহারকারীর জন্য নয়। আপনার Rails অ্যাপ একটি কুকি মানে কি তা বের করার দায়িত্বে রয়েছে৷৷ আপনার অ্যাপ এটি সেট করেছে, যাতে আপনার অ্যাপ এটি পড়তে পারে৷
৷এর সাথে একটি অধিবেশনের কি সম্পর্ক?
সুতরাং, আপনি একটি কুকি আছে. আপনি একটি অনুরোধের সময় ডেটা রাখেন এবং আপনি পরবর্তীতে একই ডেটা পাবেন। এটি এবং একটি সেশনের মধ্যে পার্থক্য কী?
ডিফল্টরূপে, রেলগুলিতে, খুব বেশি পার্থক্য নেই৷৷ কুকিকে আরও সুরক্ষিত করতে রেলগুলি কিছু কাজ করে৷ কিন্তু এর পাশাপাশি, এটি আপনার প্রত্যাশা অনুযায়ী কাজ করে। আপনার রেল অ্যাপ কুকিতে কিছু ডেটা রাখে, একই ডেটা কুকি থেকে বেরিয়ে আসে। যদি এই সবই থাকত, তাহলে কুকিজ থেকে সেশনগুলিকে আলাদা করার কোনো কারণ থাকত না৷
৷কিন্তু কুকিজ সবসময় সেশন ডেটার জন্য সঠিক উত্তর নয়:
-
আপনি একটি কুকিতে প্রায় 4kb ডেটা সঞ্চয় করতে পারেন৷৷
এটি সাধারণত যথেষ্ট, কিন্তু কখনও কখনও তা হয় না৷
৷ -
আপনার করা প্রতিটি অনুরোধের সাথে কুকিজ পাঠানো হয়।
বড় কুকি মানে বড় অনুরোধ এবং প্রতিক্রিয়া, যার মানে হল ধীরগতির ওয়েবসাইট।
-
যদি আপনি ভুলবশত আপনার
secret_key_base
প্রকাশ করেন , আপনার ব্যবহারকারীরা আপনার কুকিতে রাখা ডেটা পরিবর্তন করতে পারে।যখন এটি
current_user_id
এর মত বিষয়গুলি অন্তর্ভুক্ত করে , যে কেউ চাইলেই ব্যবহারকারী হতে পারে! -
কোকির ভিতরে ভুল ধরনের ডেটা সংরক্ষণ করা অনিরাপদ হতে পারে৷৷
আপনি যদি সতর্ক থাকেন, তাহলে এগুলি বড় সমস্যা নয়৷
৷কিন্তু যখন আপনি এই কারণগুলির মধ্যে একটির জন্য একটি কুকির মধ্যে আপনার সেশনের ডেটা সংরক্ষণ করতে পারবেন না, তখন আপনার সেশনগুলি রাখার জন্য রেলের আরও কয়েকটি জায়গা রয়েছে:
বিকল্প সেশন স্টোর
সমস্ত সেশন স্টোর যা নয়৷ কুকি সেশন স্টোর প্রায় একই ভাবে কাজ করে। কিন্তু একটি বাস্তব উদাহরণ ব্যবহার করার বিষয়ে চিন্তা করা সবচেয়ে সহজ।
আপনি যদি ActiveRecord এর মাধ্যমে আপনার সেশনগুলির উপর নজর রাখছিলেন:
-
যখন আপনি
session[:current_user_id] =1
কল করেন আপনার অ্যাপে, এবং একটি সেশন ইতিমধ্যেই বিদ্যমান নেই: -
রেল আপনার
সেশনে
একটি নতুন রেকর্ড তৈরি করবে র্যান্ডম সেশন আইডি সহ টেবিল )। -
এটি
{current_user_id:1}
সঞ্চয় করবে (Base64-এনকোডেড)ডেটা
-এ সেই রেকর্ডের বৈশিষ্ট্য। -
এবং এটি জেনারেট করা সেশন আইডি ফেরত দেবে,
09497d46978bf6f32265fefb5cc52264
,সেট-কুকি
ব্যবহার করে ব্রাউজারে .
পরের বার আপনি একটি পৃষ্ঠার অনুরোধ করবেন,
-
ব্রাউজার
কুকি:
ব্যবহার করে আপনার অ্যাপে সেই একই কুকি পাঠায় শিরোনাম।(যেমন:
কুকি:_my_app_session=09497d46978bf6f32265fefb5cc52264;
পথ=/; শুধুমাত্র Http
) -
যখন আপনি
সেশন[:current_user_id]
কল করেন : -
আপনার অ্যাপ্লিকেশানটি আপনার কুকি থেকে সেশন আইডি ধরে নেয় এবং
সেশনস
-এ তার রেকর্ড খুঁজে পায় টেবিল। -
তারপর, এটি
current_user_id
প্রদান করেডেটা
এর বাইরে সেই রেকর্ডের বৈশিষ্ট্য।
আপনি ডাটাবেসে, মেমক্যাশে, রেডিসে বা অন্য কোথাও সেশন সংরক্ষণ করছেন না কেন, তারা বেশিরভাগই একই প্রক্রিয়া অনুসরণ করে। আপনার কুকি শুধু একটি সেশন আইডি রয়েছে, এবং আপনার রেল অ্যাপটি সেই আইডি ব্যবহার করে আপনার সেশন স্টোরের ডেটা খোঁজে।
কুকি স্টোর, ক্যাশ স্টোর, নাকি ডাটাবেস স্টোর?
যখন এটি কাজ করে, আপনার সেশনগুলি কুকিতে সংরক্ষণ করা এখন পর্যন্ত সবচেয়ে সহজ উপায়৷ এর জন্য কোনো অতিরিক্ত পরিকাঠামো বা সেটআপের প্রয়োজন নেই।
কিন্তু আপনি যদি কুকি সেশন স্টোরের বাইরে যেতে চান, আপনার কাছে দুটি বিকল্প রয়েছে:
একটি ডাটাবেসে সেশন সংরক্ষণ করুন, অথবা আপনার ক্যাশে সংরক্ষণ করুন৷
৷ক্যাশে সেশন সংরক্ষণ করা হচ্ছে
আপনি ইতিমধ্যে আপনার আংশিক বা ডেটা ক্যাশে করতে মেমক্যাশের মতো কিছু ব্যবহার করছেন। যদি তাই হয়, ক্যাশে স্টোর হল সেশন ডেটা সঞ্চয় করার দ্বিতীয়-সহজ জায়গা, যেহেতু এটি ইতিমধ্যেই সেট আপ করা আছে৷
আপনার সেশন স্টোর নিয়ন্ত্রণের বাইরে চলে যাওয়ার বিষয়ে আপনাকে চিন্তা করতে হবে না, কারণ পুরানো সেশনগুলি খুব বড় হয়ে গেলে স্বয়ংক্রিয়ভাবে ক্যাশে থেকে বের হয়ে যাবে। এবং এটি দ্রুত, কারণ আপনার ক্যাশে সম্ভবত মেমরিতে রাখা হবে।
কিন্তু এটি নিখুঁত নয়:
-
আপনি যদি সত্যিই পুরানো সেশনগুলিকে ঘিরে রাখার বিষয়ে চিন্তা করেন, আপনি সম্ভবত চান না৷ তাদের ক্যাশে থেকে বের করে দেওয়ার জন্য।
-
আপনার সেশন এবং আপনার ক্যাশে করা ডেটা স্থানের জন্য লড়াই করবে। আপনার যদি পর্যাপ্ত মেমরি না থাকে, তাহলে আপনি এক টন ক্যাশে মিস এবং তাড়াতাড়ি মেয়াদোত্তীর্ণ সেশনের সম্মুখীন হতে পারেন।
-
আপনার যদি কখনও আপনার ক্যাশে রিসেট করার প্রয়োজন হয় (বলুন আপনি রেলগুলি আপগ্রেড করেছেন এবং আপনার পুরানো ক্যাশে করা ডেটা আর সঠিক নয়), সকলের মেয়াদ শেষ না করে এটি করার কোন উপায় নেই সেশন।
তবুও, এভাবেই আমরা Avvo-এ সেশনের ডেটা সঞ্চয় করি, এবং এটি এখনও পর্যন্ত আমাদের জন্য ভাল কাজ করেছে।
ডাটাবেসে সেশন সংরক্ষণ করা
যদি আপনি আপনার সেশনের ডেটা বৈধভাবে মেয়াদ শেষ না হওয়া পর্যন্ত রাখতে চান, তাহলে আপনি সম্ভবত এটিকে কোনো ধরনের ডাটাবেসে রাখতে চান। সেটা Redis, ActiveRecord বা অন্য কিছু হোক না কেন।
কিন্তু ডাটাবেস সেশন স্টোরেজেরও ত্রুটি রয়েছে:
-
কিছু ডাটাবেস স্টোরের সাথে, আপনার সেশনগুলি স্বয়ংক্রিয়ভাবে পরিষ্কার হবে না।
তাই আপনাকে নিজেরাই মেয়াদ উত্তীর্ণ সেশনের মধ্য দিয়ে যেতে হবে এবং পরিষ্কার করতে হবে।
-
আপনাকে জানতে হবে যে আপনার ডাটাবেসটি সেশন ডেটাতে পূর্ণ হলে কীভাবে আচরণ করবে৷
আপনি কি আপনার সেশন স্টোর হিসাবে Redis ব্যবহার করছেন? এটি কি আপনার সমস্ত সেশন ডেটা মেমরিতে রাখার চেষ্টা করবে? আপনার সার্ভারে কি এর জন্য যথেষ্ট মেমরি আছে, নাকি এটি এত খারাপভাবে অদলবদল শুরু করবে আপনি
ssh
করতে পারবেন না এটা ঠিক করতে? -
আপনি যখন সেশন ডেটা তৈরি করেন তখন আপনাকে আরও সতর্ক থাকতে হবে, অথবা আপনি আপনার ডেটাবেস অকেজো সেশন দিয়ে পূরণ করবেন।
উদাহরণস্বরূপ, আপনি যদি ভুলবশত প্রতিটি অনুরোধে সেশনটি স্পর্শ করেন, তাহলে googlebot কয়েক হাজার অকেজো সেশন তৈরি করতে পারে। এবং এটি একটি খারাপ সময় হবে৷
এই সমস্যাগুলির বেশিরভাগই বেশ বিরল। তবে আপনার এখনও তাদের সম্পর্কে সচেতন হওয়া উচিত।
তাহলে আপনার সেশনগুলি কীভাবে সংরক্ষণ করা উচিত?
আপনি যদি নিশ্চিত হন যে আপনি কুকি স্টোরের কোনো সীমাবদ্ধতার মধ্যে পড়বেন না, তাহলে এটি ব্যবহার করুন। এটির খুব বেশি সেটআপের প্রয়োজন নেই, এবং বজায় রাখতে মাথাব্যথাও নয়৷
৷ক্যাশে বনাম ডাটাবেসে সেশনগুলি সংরক্ষণ করা একটি সেশনের আগে মেয়াদ শেষ হওয়া কতটা খারাপ হবে সে সম্পর্কে একটি বিচার কল। আমি সেশন ডেটাকে বেশ অস্থায়ী হিসাবে বিবেচনা করি, তাই ক্যাশে স্টোরটি আমার জন্য ভাল কাজ করে। তাই আমি সাধারণত প্রথমে কুকি চেষ্টা করি, তারপর ক্যাশে, তারপর ডাটাবেস।
কিন্তু তোমার কি অবস্থা? আপনি কিভাবে আপনার সঞ্চয় করবেন সেশন? একটি মন্তব্য করুন এবং আমাকে জানান!
এবং আপনি যদি রুবি এবং রেলের অভ্যন্তরীণগুলি কীভাবে কাজ করে সে সম্পর্কে আরও জানতে চান তবে এই নিবন্ধটি দেখুন:রত্নগুলি কীভাবে কাজ করে? অথবা, আপনি যদি ওয়েব কীভাবে কাজ করে সে সম্পর্কে আরও আগ্রহী হন, তাহলে একটি ওয়েব সার্ভার বনাম একটি অ্যাপ সার্ভার দেখুন।