পিএইচপি: objects _SESSION এর ভিতরে 'অবজেক্টস' সংরক্ষণ করছে


188

আমি ঠিক বুঝতে পেরেছি যে আমি আসলে $ _SESSION এ অবজেক্টগুলি সঞ্চয় করতে পারি এবং আমি এটি বেশ শীতল বলে মনে করি কারণ যখন আমি অন্য পৃষ্ঠায় ঝাঁপ দাও তখনও আমার অবজেক্ট থাকে। এখন আমি এই পদ্ধতির ব্যবহার শুরু করার আগে আমি এটি জানতে চাই যে এটি সত্যিই এত ভাল ধারণা কিনা বা এর মধ্যে সম্ভাব্য সমস্যা রয়েছে কিনা ।

আমি জানি যে আমার যদি প্রবেশের একক পয়েন্ট থাকে তবে আমার তা করার দরকার ছিল না তবে আমি এখনও সেখানে নেই তাই আমার প্রবেশের একটি বিন্দু নেই এবং আমি সত্যই আমার বিষয়টি রাখতে চাই কারণ আমি ডোন না ' এর মতো আমার রাজ্যটি হারাবে না। (এখন আমি আরও পড়েছি যে আমার স্টেটলেস সাইটগুলি প্রোগ্রাম করা উচিত তবে আমি এখনও এই ধারণাটি বুঝতে পারি না))

সুতরাং সংক্ষেপে : সেশনে কী জিনিসগুলি সংরক্ষণ করা ঠিক আছে, এতে কোনও সমস্যা আছে?


সম্পাদনা:

অস্থায়ী সংক্ষিপ্তসার : এখনই আমি বুঝতে পেরেছি যে এটি আবার ডাটাবেস জিজ্ঞাসা জড়িত এমনকি যদি অবজেক্টটি পুনরায় তৈরি করা ভাল তবে ভাল

আরও উত্তর সম্ভবত সেই দিকটি আরও বিস্তৃত হতে পারে !


13
আমি কীভাবে 'বোকা' ছিলাম 2008 :-)
মার্কাস

49
তবে 2014 সালে আমাদের মতো বোকা'দের জন্য কার্যকর প্রশ্ন: ডি
মমিন আল আজিজ

3
আপনি
মারকাসকে

1
আপনি বোকা ছিল না! আপনি যা জিজ্ঞাসা করতে যাচ্ছেন তা আপনি জিজ্ঞাসা করেছিলেন এবং 10 বছর পরে আমাকে কঠিন করেছিলেন!
টুডমো

ঠিক আছে, আমি অনুমান করেছি আপনি 2019 সালে আমাকে একটি বোকা প্রশ্ন জিজ্ঞাসা থেকে কেবল বাঁচিয়েছিলেন
ম্যাক্সওয়েল

উত্তর:


133

আমি জানি এই বিষয়টি পুরানো, তবে এই সমস্যাটি সামনে আসছে এবং আমার সন্তুষ্টির দিকে নজর দেওয়া হয়নি:

আপনি objects _SESSION এ অবজেক্টগুলি সংরক্ষণ করুন, বা লুকানো ফর্ম ক্ষেত্রগুলিতে স্ট্যাশ করা ডেটার উপর ভিত্তি করে তাদের পুরো কাপড়টি পুনর্গঠন করুন বা ডিবি থেকে প্রতিবার তাদের আবার জিজ্ঞাসা করুন, আপনি রাষ্ট্র ব্যবহার করছেন। এইচটিটিপি রাষ্ট্রবিহীন (কম বা কম; তবে জিইটি বনাম পিইউটি দেখুন) তবে যে কেউ ওয়েব অ্যাপ্লিকেশনটির সাথে যত্ন নিতে দেখা প্রায় সবকিছুরই কোনও জায়গায় রাষ্ট্র বজায় রাখা দরকার। রাজ্যকে কুকর্ম ও ক্রেণির দিকে ঠেলে দেওয়া একরকম তাত্ত্বিক জয়ের সমপরিমাণ অভিনয় ঠিক ভুল। রাষ্ট্র রাষ্ট্র। আপনি যদি রাষ্ট্র ব্যবহার করেন তবে আপনি রাষ্ট্রবিহীন হয়ে বিভিন্ন প্রযুক্তিগত সুবিধা হারাবেন। এটি ঘুম হারানোর কিছু নয় তবে আপনি যদি আগেই জানেন না যে আপনার এটির ঘুম কমিয়ে দেওয়া উচিত।

হ্যাঙ্ক গেইয়ের দেওয়া "ডাবল ভ্যাম্মি" যুক্তি দ্বারা প্রাপ্ত আশীর্বাদে আমি বিশেষত ঝাপটায় পড়েছি। ওপি কি বিল্ডিং এবং লোড-ভারসাম্য ই-কমার্স সিস্টেম বিল্ডিং করছে? আমার অনুমান নেই; এবং আমি আরও পোস্ট করব যে তার $ ব্যবহারকারীর শ্রেণি বা যা কিছু হোক না কেন, তার সার্ভারটি মেরামতির বাইরে পঙ্গু করে দেবে না। আমার পরামর্শ: আপনার প্রয়োগের জন্য বোধগম্য কৌশলগুলি ব্যবহার করুন। $ _SESSION এ থাকা বিষয়গুলি সূক্ষ্ম, সাধারণ জ্ঞানের সতর্কতার সাপেক্ষে। যদি আপনার অ্যাপটি হঠাৎ ট্র্যাফিকের অ্যামাজনকে প্রতিদ্বন্দ্বী করে এমন কোনও কিছুতে রূপান্তরিত করে তবে আপনাকে পুনরায় অভিযোজন করতে হবে। এটাই জীবন.


16
আমি এর মাধ্যমে পড়ছি বলে আমার নিজের চিন্তাভাবনাগুলি খুব ভালভাবে জড়াল answer আধুনিক ইন্টারনেট দরকার রাষ্ট্র। কিছু অ্যাপ্লিকেশন রাষ্ট্রের প্রয়োজন হয় না এবং রাষ্ট্রহীন পদ্ধতিতে বোধগম্য হয় না, আধুনিক ইন্টারনেট কেবলমাত্র তাদের ছেড়ে দেওয়ার জন্য রাষ্ট্রের (একে: লগিন!) ভিত্তিক অনেকগুলি সিস্টেমে নির্ভর করে! ইন্টারনেটের গ্রেট গডস এমনকি কয়েক বছর ধরে কুকিগুলির আকারে এই প্রাথমিক ধারণাটি সংযুক্ত করেছে এবং একটি প্রাথমিক স্তরে তারা এটিকে এইচটিএমএল স্থানীয় স্টোরেজ আকারে যুক্ত করেছে। কিছু অ্যাপ্লিকেশনগুলিতে রাষ্ট্রের অতিরিক্ত ব্যবহার এড়ানো বুদ্ধিমান হতে পারে তবে কিছু! = সব!
রনলগ

ঠিক আছে, মানুষ যখন আগুন আবিষ্কার করেছিল তার খুব শীঘ্রই আমি যখন এই প্রশ্নটি জিজ্ঞাসা করেছি, আমি আজ জানি অনেক কিছুই জানতাম না ... যা ঠিক তেমনটিও। এর মধ্যে আমি বলব যে কয়েকটি ভাল ব্যবহারের ক্ষেত্রেও থাকতে পারে তবে সাধারণত আমি প্রথমে অন্যান্য সমাধানগুলি সন্ধান করব। এখনও এটিকে নতুন গৃহীত উত্তর হিসাবে চিহ্নিত করা হচ্ছে কারণ অন্য উত্তরটি শ্রেণিবদ্ধ।
মার্কাস

খুব কম উত্তর আমাকে জোরে হেসে ফেলেছে। এই এক করেছে। ব্রাভো +1
টুডমো

114

এটি ঠিক আছে যতক্ষণ সেশন_স্টার্ট () কল করার সময়, ক্লাস ডিক্লারেশন / সংজ্ঞা ইতিমধ্যে পিএইচপি-র মুখোমুখি হয়েছিল বা ইতিমধ্যে ইনস্টলড অটোলোডার দ্বারা পাওয়া যেতে পারে। অন্যথায় এটি সেশন স্টোর থেকে অবজেক্টটি ডিসরিয়ালাইজ করতে সক্ষম হবে না।


12
ধন্যবাদ! এটি আমার জন্য একটি বাগ ঠিক করেছে: ডি
ম্যাট এলেন

আমি ধরে নিচ্ছি যে আপনার যদি সঠিক কোনও কাজ করা হয় তবে এই সমস্যাটি এড়ানো যেতে পারে __autoload()
ল্যাঙ্গেল

সিরিয়ালযুক্ত অবজেক্টটি আনসিয়ালাইজ করার সময় আমাদের কি ক্লাসের সংজ্ঞা যুক্ত করতে হবে ??? বস্তুটি সিরিয়ালকরণের সময় এটির শ্রেণি সংজ্ঞা দরকার যা আমি সম্মত হই, তবে যে ফাইলটি আমাকে সিরিয়ালাইজড অবজেক্টটি আনসিরিয়ালাইজ করতে হবে সেখানে আমাকে ক্লাস সংজ্ঞাও যুক্ত করতে হবে ???
রাজেশ পল

35

এইচটিটিপি একটি কারণে একটি স্টেটলেস প্রোটোকল। এইচটিটিপি-তে সেশনস ওয়েল্ডের অবস্থা। থাম্বের নিয়ম হিসাবে, সেশন স্টেট ব্যবহার করা এড়িয়ে চলুন।

আপডেট: এইচটিটিপি স্তরে কোনও সেশনের ধারণা নেই; সার্ভারগুলি ক্লায়েন্টকে একটি অনন্য আইডি দিয়ে এবং ক্লায়েন্টকে প্রতিটি অনুরোধে পুনরায় জমা দেওয়ার কথা বলে এটি সরবরাহ করে। তারপরে সার্ভার সেই আইডিটি সেশন অবজেক্টের একটি বৃহত হ্যাশটেবলের কী হিসাবে ব্যবহার করে। সার্ভারটি যখনই কোনও অনুরোধ পেয়েছে, অনুরোধের সাথে জমা দেওয়া ক্লায়েন্টের আইডির ভিত্তিতে এটির সেশন আইটেমগুলির হ্যাশটেবলের বাইরে সেশন তথ্য সন্ধান করে। এই সমস্ত অতিরিক্ত কাজ স্কেলিবিলিটির উপর দ্বিগুণ ঘৃণ্য (একটি বড় কারণ এইচটিটিপি রাষ্ট্রবিহীন)।

  • Whammy One: এটি একক সার্ভারের কাজ কমিয়ে দেয়।
  • ওহামি টু: স্কেল করা শক্ত করে তোলে কারণ এখন আপনি কেবল কোনও পুরানো সার্ভারের জন্য কোনও অনুরোধটি রুট করতে পারবেন না - তাদের সবার একই সেশন হয় না। আপনি একই সার্ভারে প্রদত্ত সেশন আইডি সহ সমস্ত অনুরোধগুলি পিন করতে পারেন। এটি সহজ নয় এবং এটি ব্যর্থতার একক পয়েন্ট (পুরো সিস্টেমের জন্য নয়, তবে আপনার ব্যবহারকারীদের বড় অংশের জন্য)। অথবা, আপনি ক্লাস্টারের সমস্ত সার্ভার জুড়ে সেশন স্টোরেজটি ভাগ করে নিতে পারতেন, তবে এখন আপনার আরও জটিলতা রয়েছে: নেটওয়ার্ক-সংযুক্ত মেমরি, স্ট্যান্ড-একা সেশন সার্ভার ইত্যাদি

এই সমস্ত কিছু দেওয়া, আপনি অধিবেশনটিতে যত বেশি তথ্য রাখবেন তত কার্যকারীতার উপর তত বেশি প্রভাব পড়বে (ভিনকো যেমন উল্লেখ করেছেন)। ভিনকো যেমন উল্লেখ করেছে, যদি আপনার অবজেক্ট সিরিয়ালযোগ্য না হয়, সেশনটি খারাপ ব্যবহার করবে। সুতরাং, থাম্বের নিয়ম হিসাবে, অধিবেশনটিতে একেবারে প্রয়োজনের চেয়ে বেশি কিছু এড়াতে হবে।

@ ভিঙ্কো আপনি যে প্রতিক্রিয়াটি ফেরত পাঠিয়েছেন তাতে ডেটা এম্বেড করে এবং ক্লায়েন্টটি এটি পুনরায় জমা দিয়ে যেমন সার্ভার স্টোর স্টেট থাকার আশেপাশে কাজ করতে পারেন, উদাহরণস্বরূপ, কোনও গোপন ইনপুটটিতে ডেটা প্রেরণ করে। আপনার যদি সত্যিই রাষ্ট্রের সার্ভার-সাইড ট্র্যাকিংয়ের প্রয়োজন হয় তবে এটি সম্ভবত আপনার ব্যাকিং ডেটাস্টোরের মধ্যে থাকা উচিত।

(ভিঙ্কো যোগ করেছেন: পিএইচপি অধিবেশন তথ্য সংরক্ষণের জন্য একটি ডাটাবেস ব্যবহার করতে পারে এবং ক্লায়েন্টটি প্রতিবার ডেটা পুনরায় জমা দেওয়ার ফলে সম্ভাব্য স্কেলাবিলিটি সমস্যাগুলি সমাধান করতে পারে তবে সুরক্ষার সমস্যাগুলির একটি বড় সম্ভাবনা খোলে যা আপনাকে এখনই মনোযোগ দিতে হবে যে ক্লায়েন্টের নিয়ন্ত্রণ সকলের নিয়ন্ত্রণে থাকে) তোমার অবস্থা)


1
এইচটিটিপি স্তরে কোনও সেশনের ধারণা নেই; সার্ভারগুলি ক্লায়েন্টকে একটি অনন্য আইডি দিয়ে এবং ক্লায়েন্টকে প্রতিটি অনুরোধে পুনরায় জমা দেওয়ার কথা বলে এটি সরবরাহ করে। তারপরে সার্ভার সেই আইডিটি সেশন অবজেক্টের একটি বৃহত হ্যাশটেবলের কী হিসাবে ব্যবহার করে। চালিয়ে যেতে ...
হ্যাঙ্ক গে

1
সার্ভারটি যখনই কোনও অনুরোধ পেয়েছে, অনুরোধের সাথে জমা দেওয়া ক্লায়েন্টের আইডির ভিত্তিতে এটির সেশন আইটেমগুলির হ্যাশটেবলের বাইরে সেশন তথ্য সন্ধান করে। এই সমস্ত অতিরিক্ত কাজ স্কেলিবিলিটির উপর দ্বিগুণ ঘৃণ্য (একটি বড় কারণ এইচটিটিপি রাষ্ট্রবিহীন)। চালিয়ে যেতে ...
হ্যাঙ্ক গে

1
আমি অবাক হয়েছি আপনি কীভাবে কোনওভাবে ওয়েল্ডিং স্টেট ছাড়াই এইচটিটিপি-র মাধ্যমে জটিল অ্যাপ্লিকেশনগুলি বাস্তবায়ন করবেন
ভিনকো ভার্সালভিক

3
এই সমস্ত মন্তব্য অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তর সম্পাদনা করুন। উইকির পক্ষে এটি পড়া সহজ এবং আরও ভাল এবং যাইহোক আমি আপনার উত্তরটি গ্রহণযোগ্য হিসাবে বেছে নিতে পারি না, যদি গুরুত্বপূর্ণ সমস্ত কিছু মন্তব্যে থাকে। ধন্যবাদ!
মার্কাস

6
"ভয়াবহ এক" আমি আশা করি আমি এটিকে আরও নীচে নামাতে পারতাম। আপনার সময় জানুন। একটি মেমরি রেফারেন্সের জন্য 100 ন্যানো সেকেন্ড বা 0.0001 এমএস খরচ হয়। সুতরাং প্রধান স্মৃতিতে সংরক্ষণ করা হ্যাশটেবলে একটি অনুসন্ধান করার জন্য আক্ষরিক অর্থে সময় লাগে না। না O(1)তোমাকে কিছু বলতে? @ দু'জনে: শুধু এলোমেলোভাবে সমস্ত অনুরোধগুলি এলোমেলো সার্ভারগুলিতে রুট করবেন না? রাউন্ড রবিন করুন এবং একই ব্যবহারকারীর কাছ থেকে একই সার্ভারে রাউটিং করুন। এটি বাহ, অতি সুস্পষ্ট। আপনার 30++ টিরও বেশি উত্স সহ আপনার বইগুলি ফিরে যেতে হবে
তোসকান

19
  • যে বিষয়গুলি সিরিয়াল করা যায় না (বা যার মধ্যে অপরিবর্তনীয় সদস্য রয়েছে) আপনার প্রত্যাশা অনুযায়ী $ _SESSION থেকে বেরিয়ে আসবে না
  • বিশাল অধিবেশনগুলি সার্ভারে একটি বোঝা চাপায় (প্রতিটি সময় ম্যাগ স্টেটকে সিরিয়ালিয়ালাইজিং এবং ডিসরিয়ালাইজিং করা ব্যয়বহুল)

তা ছাড়া আমি কোনও সমস্যা দেখিনি।


9

আমার অভিজ্ঞতার সাথে, কিছু বৈশিষ্ট্যযুক্ত স্টাডক্লাসের চেয়ে বেশি জটিল কোনও কিছুর জন্য সাধারণত এটি উপযুক্ত নয়। সেশন-স্টোরেড আইডেন্টিফায়ার প্রদত্ত ডেটাবেস থেকে পুনরায় তৈরি করার চেয়ে আনসিয়েরাইজিংয়ের ব্যয়টি সর্বদা বেশি। এটি দুর্দান্ত মনে হয়, তবে (সর্বদা হিসাবে), প্রোফাইলিংই মূল বিষয়।


প্রতিটি অনুরোধে ডেটা 5x2 সারণী জিজ্ঞাসা বনাম সেশনে ফলাফল ক্যাচিং এবং এটি ব্যবহারের মধ্যে পারফরম্যান্স সম্পর্কে কোনও মন্তব্য?
সঙ্গীতলিফ্সমে

6

আমি আপনাকে রাজ্যটি ব্যবহার না করার পরামর্শ দিচ্ছি যদি না একেবারে আপনার প্রয়োজন হয়। আপনি যদি সেশন ব্যবহার না করে অবজেক্টটি পুনর্নির্মাণ করতে পারেন তবে এটি করুন। আপনার ওয়েব অ্যাপ্লিকেশনটিতে স্টেটস থাকার ফলে অ্যাপ্লিকেশনটি আরও জটিল হয়ে উঠেছে, প্রতিটি অনুরোধের জন্য আপনাকে ব্যবহারকারীকে কী অবস্থায় রয়েছে তা দেখতে হবে c অবশ্যই এমন সময় রয়েছে যেখানে আপনি সেশন ব্যবহার এড়াতে পারবেন না (উদাহরণস্বরূপ: ব্যবহারকারীকে তার সেশনের সময় লগইন রাখতে হবে ওয়েব অ্যাপ্লিকেশন)। শেষ আমি আপনার সেশন অবজেক্টটিকে যতটা সম্ভব ছোট রাখার পরামর্শ দেব কারণ এটি বৃহত্তর অবজেক্টগুলিকে সিরিয়ালাইজ এবং আনসিরিয়ালাইজ করার জন্য পারফরম্যান্সকে প্রভাবিত করে।


সুতরাং, সমস্ত ডেটাবেস কোয়েরি করে আবারও বিষয়টিকে পুনর্নির্মাণ করা ভাল? কারণ এটি করার জন্য আমার একটি ধারণা ছিল যে আমাকে আবার একই জিনিসগুলির জন্য ডিবি জিজ্ঞাসা করতে হবে না।
মার্কাস

3
যদি এটি আপনার কাছে গুরুত্বপূর্ণ হয় যে এটি ডেটাবেসটিকে কোয়েরি করবে না তবে সেশনে এটি সংরক্ষণ করার পরিবর্তে ক্যাশে ব্যবহার করবে। তবে দয়া করে ক্যাচিং বিল্ডিংয়ের মতো কিছু করার আগে এটি সত্যিই পারফরম্যান্স হিট কিনা তা পরীক্ষা করে দেখুন।
জনি

ধন্যবাদ, আমি আসলে এটি মনে করি না। আমার আবার জিজ্ঞাসা করা উচিত।
মার্কাস

4

আপনাকে মনে রাখতে হবে যে উত্সের ধরণগুলি (যেমন ডিবি সংযোগ বা ফাইল পয়েন্টার) পৃষ্ঠা লোডের মধ্যে টিকে থাকবে না এবং আপনাকে এগুলি অদৃশ্যভাবে পুনরায় তৈরি করতে হবে।

অধিবেশনটির আকারটি বিবেচনা করুন, এটি কীভাবে সংরক্ষণ করা হয় তার উপর নির্ভর করে আপনার আকারের সীমাবদ্ধতা বা বিলম্বিত সমস্যা থাকতে পারে।


0

সফ্টওয়্যার লাইব্রেরিগুলিকে আপগ্রেড করার সময় আমিও এনেছি - আমরা আমাদের সফ্টওয়্যারটিকে আপগ্রেড করেছি এবং পুরানো সংস্করণটিতে ভি 1 সফ্টওয়্যারটির শ্রেণীর নামগুলির সাথে সেশনে অবজেক্ট ছিল, নতুন সফ্টওয়্যার ক্র্যাশ করছিল যখন সেশনে থাকা অবজেক্টগুলি তৈরি করার চেষ্টা করেছিল - ভি 2 হিসাবে সফ্টওয়্যার সেই একই ক্লাসগুলি আর ব্যবহার করে নি, এটি তাদের খুঁজে পেল না। সেশন অবজেক্টস সনাক্ত করতে আমাদের কিছু ফিক্স কোড লাগাতে হয়েছিল, সন্ধান পেলে সেশনটি মুছুন, পৃষ্ঠাটি পুনরায় লোড করুন। প্রথম দিকে সবচেয়ে বড় ব্যথা মনে হয় আপনি যখন এই বাগটি পুনরুদ্ধার করেছিলেন যখন এটি প্রথম প্রকাশিত হয়েছিল (সমস্ত খুব পরিচিত, "ভাল, এটি আমার পক্ষে কাজ করে" :) এটি কেবলমাত্র সেই সমস্ত ব্যক্তিকেই প্রভাবিত করেছিল যারা সম্প্রতি পুরানো এবং নতুন সিস্টেমে প্রবেশ ও আউট করেছেন - তবে ভাল লঞ্চের আগে এটি আমরা খুঁজে পেয়েছি কাজটি কারণ আমাদের সমস্ত ব্যবহারকারীদের অবশ্যই তাদের সেশনে পুরানো সেশন ভেরিয়েবলগুলি থাকতে হবে এবং সবার জন্য সম্ভাব্য ক্র্যাশ হয়ে গিয়েছিল,

যাইহোক, আপনি আপনার সংশোধনী হিসাবে পরামর্শ হিসাবে, আমি মনে করি অবজেক্টটি পুনরায় তৈরি করা ভাল। সুতরাং সম্ভবত কেবল আইডি সংরক্ষণ করা এবং তারপরে প্রতিটি অনুরোধে ডাটাবেস থেকে অবজেক্টটি টানানো ভাল / নিরাপদ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.