What is Serialization : PHP में Object Serialization के लिए serialize() Function को Use किया जाता है। Serialization एक ऐसी प्रक्रिया होती है जिसमें PHP में Store की जा सकने वाली किसी भी तरह की Value जैसे कि String, Integer, Float, Array, Object आदि को एक Byte-Stream Representation String के रूप में Represent किया जाता है।
जब हम serialize() Function को Use करते हैं और Parameter के रूप में किसी PHP Value को इस Function में Pass करते हैं, तो ये Function उस Value का Serialization कर देता है। यानी उस Value को एक String के रूप में Return कर देता है। जिसे हम किसी Future Use के लिए Database में Store करके रख सकते हैं।
जब हम किसी Serialized Data को उपयोग में लेना चाहते हैं, तब हमें फिर से उस Data को unserialize() Function का प्रयोग करके Unsterilized करना पडता है।
हालांकि हम किसी भी तरह की Value को Serialize कर सकते हैं, लेकिन फिर भी किसी Array या Object को सामान्यतः ज्यादा उपयोग में लिया जाता है, इसलिए Array या Object को ज्यादा Serialize किया जाता है।
जब हम किसी Array या Object को Serialize करते हैं, तब Array के सभी Elements यानी Keys व Values का Pair तथा Object के सभी Accessible Members एक String के रूप में Arrange हो जाते हैं, जिन्हें हम एक Single String Value की तरह उपयोग में ले सकते हैं, Store कर सकते हैं अथवा Manipulate कर सकते हैं।
लेकिन जब हम किसी Serialized की गई String को फिर से Unsterilized करते हैं, तब वह Serialized String फिर से अपने पिछले रूप में हमें प्राप्त हो जाती है। यानी हमें फिर से Array या Object प्राप्त हो जाता है, जिसे हम Array या Object की तरह उपयोग में ले सकते हैं।
जब हम किसी Object को Serialize करते हैं, तब Object के केवल Data Members ही Serialize होते हैं, Methods Serialize नहीं होते। लेकिन Class का नाम Serialize होता है, जिससे जब हम उस Serialized Object को फिर से Unserialize करते हैं, तब PHP इस बात को Identify कर पाता है कि वास्तव में Object किस Class का है और PHP उस Object को उसी Class के Object के रूप में Unsterilized कर पाने में सक्षम हो पाता है।
हम किसी Serialized Object को फिर से Unserialilze कर सकें, इसके लिए जरूरी होता है कि वह Object जिस Class का है, वह Class Defined हो। यानी यदि हम हमारे पास Box Class का Object हो और हम इस Box Class के Object को Serialize कर दें, तो हमें Box Class के Object का एक Serialized String Representation प्राप्त होगा, जिसमें Box Object के सभी Data Members व उनकी Values होंगी।
अब यदि हम इस Serialized Box Object को Unserialize करें, तो जिस Script या Function में हम इस Object को Unserialize करेंगे, उस Function या Script में Box Class की Definition का पहले से उपलब्ध होना जरूरी होता है।
इसलिए सामान्यतः हम जिस Box Class के Object को Unserialize कर रहे होते हैं, उस Box Class की File को Current Script या Function में __autoload() Magic Method द्वारा Include कर लेते हैं। यानी जब PHP Box Class के Object को Unserialize करता है, उसे Box Class के Definition की जरूरत पडती है।
परिणामस्वरूप __autoload() Magic Method Execute हो जाता है और Current Script या Function में Box Class Available हो जाती है।
सामान्यतः जब हम किसी Value को Serialize करते हैं, तो उस Value को Future में किसी जरूरत को पूरा करने के लिए Serialize करते हैं। इसलिए जब हम किसी Value को Serialize करते हैं, तो उस Value को किसी Operating System File अथवा Database में Store करके रखते हैं।
चूंकि HTTP एक ऐसा Protocol है, जो Stateless होता है। यानी जब हम एक Web Page Open करते हैं, तो उस Web Page के Open हो जाने के बाद हमारे Web Browser व Web Server के बीच किसी तरह का कोई सम्बंध नहीं रह जाता। परिणामस्वरूप Web Browser में Load होने वाले Page को कभी भी पता नहीं होता कि वह किस Web Server से Load हुआ है।
ठीक इसी तरह से जब एक Web Server किसी Web Page को Web Browser में Send कर देता है, तो उसके बाद Web Server को भी ये पता नहीं होता कि उसने किस Client की Request को पूरा करने के लिए क्या Content Return किया है।
यानी सामान्यतः एक Web Server व Web Browser एक दूसरे के बारे में केवल तब तक जानते हैं, जब तक कि Client अपने Web Browser के Address Bar से Request Send करता है और Serer उस Request को पूरा करते हुए Client को उसका Requested Document Return करता है। जैसे ही Client ने कोई Request की और Web Server ने उस Request को पूरा किया, दोनों ही एक दूसरे से पूरी तरह से अनजान हो जाते हैं।
जबकि अक्सर हमें ऐसी जरूरत होती है कि हालांकि Stateless Connection होने के बावजूद भी Client व Server एक दूसरे को पहचान सकें। अन्यथा कई प्रकार की परेशानियां पैदा हो जाऐंगी। चलिए समझने की कोशिश करते हैं कि ब्सपमदज व ैमतअमत को एक दूसरे को प्कमदजपलि करना क्यों जरूरी है।
मानलो कि आप किसी Web Site पर जाते हैं और वहां से कुछ Online Purchasing करते हैं। जिस समय आप किसी Product की Purchasing करते हैं, ठीक उसी समय पर कोई और व्यक्ति भी उसी Site पर किसी Product की Purchasing कर रहा है।
चूंकि अलग-अलग लोग एक ही समय पर एक ही Web Site से अलग-अलग अथवा समान Product की Purchasing कर सकते हैं। इसलिए मानलो कि आपने उस Site से एक “C Language in Hindi” नाम की eBook को खरीदा जबकि उसी समय पर उसी Web Site से दूसरे User ने “C++ in Hindi” नाम की eBook को खरीदा।
चूंकि आपने “C Language in Hindi” खरीदा है, इसलिए आप इस पुस्तक का Online Payment करेंगे जबकि दूसरे व्यक्ति ने “C++ in Hindi” खरीदा है, इसलिए वह इस पुस्तक के लिए Online Payment करेगा।
अब यदि Web Server आपको व उस दूसरे User को Uniquely Identify करने में सक्षम न हो, तो हो सकता है कि Web Server आपको “C++ in Hindi” EBook Download के लिए Deliver कर दे जबकि उस दूसरे User को “C Language in Hindi” पुस्तक का Download Page दे दे।
इस प्रकार की स्थिति से बचने के लिए ये बात बहुत ही जरूरी हो जाती है कि HTTP Protocol के Stateless होने के बावजूद भी Web Client व Web Server एक दूसरे को Uniquely पहचान सकें, इसके लिए विभिन्न प्रकार की व्यवस्थाऐं की गई हैं। सामान्यतः इस व्यवस्था के रूप में Client Side में Cookies की तथा Server Side में Sessions की व्यवस्था की गई है।
उपरोक्त उदाहरण से आप समझ गए होंगे कि Client व Server का एक दूसरे को Uniquely Identify करना कितना जरूरी है। लेकिन अभी एक और बात समझना बाकी है।
चूंकि HTTP एक Stateless Protocol है, इसलिए Client व Server एक दूसरे को Cookies व Session द्वारा Uniquely Identify करते हैं। लेकिन जैसाकि हमने पिछले उदाहरण में देखा कि एक ही Web Site से एक ही समय पर अलग-अलग Users समान या अलग-अलग Products खरीद सकते हैं। इसलिए ऐसा भी जरूरी नहीं है कि आप या वह दूसरा User केवल एक ही पुस्तक खरीदे। हो सकता है कि आप एक से ज्यादा पुस्तकें खरीदना चाहते हों।
इस स्थिति में चूंकि समान Web Site पर भी अलग-अलग पुस्तकों की Details अलग-अलग Web Pages पर होती हैं। इसलिए अलग-अलग पुस्तकों को खरीदने के लिए आप Shopping Cart का प्रयोग करते हैं। Shopping Cart एक प्रकार से आपका Online थैला होता है, जिसमें आप अपने खरीदे हुए Products को रखते हैं ताकि आप एक ही बार में अपने सभी खरीदे गए Products का Payment कर सकें।
मानलो कि आपने “C in Hindi” पुस्तक को अपने Cart में Add किया और अब किसी दूसरी eBook को खरीदने के लिए उसकी Details देखना चाहते हैं, ताकि आप इस बात का निर्णय ले सकें कि आपको वह दूसरी पुस्तक भी खरीदनी है या नहीं। मानलो कि “C in Hindi” पुस्तक को अपने Cart में Add करने के बाद अब आप “C++ in Hindi” Web Page पर जाते हैं।
चूंकि HTTP एक Stateless Protocol है, इसलिए जैसे ही आप “C in Hindi” Web Page से “C++ in Hindi” के Web Page पर Move करेंगे, Web Server आपकी Cart में Add की गई पुस्तक “C in Hindi” को भूल जाएगा और जब आप “C++ in Hindi” के Web Page पर पहुंचेंगे, तो आपका Cart Empty हो जाएगा। जबकि जरूरत ये है कि जब आप “C” के Page से “C++” के Page पर पहुंचें, आपके Cart में “C in Hindi” पुस्तक Available रहनी चाहिए।
यानी HTTP Protocol के Stateless होने की स्थिति में भी हर User के लिए पहले Page का Data दूसरे Page में Uniquely Transfer होना चाहिए। दूसरे शब्दों में कहें, तो जब आप “C++” के पेज पर पहुंचे, आपकी “C in Hindi” पुस्तक की Details भी इस “C++” के Page पर Available होनी चाहिए और ऐसा तभी हो सकता है, जबकि Web Server आपके द्वारा Cart में Add की गई “C in Hindi” पुस्तक की Details को भी “C++” के Page पर Pass करे।
आपके Cart की Information को व आपको Uniquely Identify करने के लिए Web Server आपके Computer पर एक Cookie Place करेगा जबकि Web Server पर एक Session Create होगा और आपने जिस पुस्तक को Cart में Add किया है, उस पुस्तक की विभिन्न Details जैसे कि पुस्तक का नाम, उसकी Price, Pages की संख्या, Author का नाम आदि Information को फिर से “C++” के Page पर Transfer कर सके, इसके लिए Web Server Cart में Add की गई पुस्तक की इन सभी Details को या तो किसी File में Store करके रखेगा अथवा Database के किसी Field में Store करके रखेगा।
हालांकि Web Site Cart में Add की गई पुस्तक की Information को सामान्य Variables में भी Store करके रख सकता है और फिर से “C++” के Page पर इन Variables में Stored Values का Expand कर सकता है, लेकिन Data के टुकडों को Store व Manage करने में किसी तरह की परेशानी भी हो सकती है।
इसलिए बेहतर यही होता है कि पूरे एक Object को ही एक Page से दूसरे Page में Transfer किया जाए। परिणामस्वरूप इस जरूरत को पूरा करने के लिए PHP में Serialization की प्रक्रिया को Implement किया गया है।
जब आप “C in Hindi” पुस्तक को Cart में Add करते दूसरे Page पर Move होते हैं, तब PHP आपकी Cart में Add की गई पुस्तक की सारी Information को एक Object के रूप में Web Server पर Pass करता है।
PHP इस Object की सारी Information को Serialize करके एक Single String के रूप में Convert कर लेता है और उसे किसी Database में अथवा किसी Static File में Store कर लेता है।
फिर जब Web Server आपको “C++” के Page पर Move करता है, तो साथ में इस Serialized Object की सारी Information को अपनी Store की गई File अथवा Database से प्राप्त करता है और उसे फिर से Normal Object में Convert करने के लिए उसे Unserialize करता है।
परिणाम स्वरूप आपकी Cart में Add की गई पुस्तक एक Object के रूप में एक Web Page से दूसरे Web Page के बीच Transfer होती है और इस Transfer के बीच Serialization अपना Role Play करता है।
Serialization का प्रयोग केवल Shopping Cart के बीच ही हो, ऐसा नहीं है। हम किसी भी तरह की PHP Value जैसे कि String, Integer, Floating Point Values, Object या Array आदि को Serialize करके एक बडी ही आसानी से एक Web Page से दूसरे Web Page में Transfer कर सकते हैं।
क्योंकि किसी पूरे Object या Array को एक Page से दूसरे Page के बीच Transfer करना मुश्किल हो सकता है लेकिन किसी String को बडी ही आसानी से एक Web Page से दूसरे Web Page के बीच Transfer किया जा सकता है और Serialization एक ऐसी प्रक्रिया है, जो किसी Array या Object जैसे Complex Data को भी एक String Representation में Covert कर देता है और Un-serialization प्रक्रिया का प्रयोग करके हम इस String Representation Array या Object को फिर से Normal Array या Object में Convert कर लेते हैं। इस पूरी प्रक्रिया को समझने के लिए हम एक उदाहरण देखते है, जो कि निम्नानुसार हैः
<?php class Time{ private $hour, $minutes; public function __construct($hour=12, $minutes=0){ $this->hour = $hour; $this->minutes = $minutes; } public function display(){ echo $this->hour .":" . $this->minutes; } } echo "Time: "; $hmt = new Time(10, 13); $hmt->display(); $doSerial = serialize($hmt); echo "\n\nAfter Serialization of Time: \n"; echo $doSerial; $sonata = new Time; $sonata = unserialize($doSerial); echo "\n\nAfter UnSerialization of Time: \n"; $sonata->display(); //echo $sonata ?>
इस Program में सबसे पहले हमने $hmt नाम का एक Time Object Create किया है और उसे display() Method का प्रयोग करके Display किया है।
फिर हमने $doSerial नाम का एक Variable Create किया है और $hmt Object को serialize() Function में Parameter के रूप में Pass करके Serialize किया है। चूंकि Serialization के बाद Object एक String Representation में Convert हो जाता है, इसलिए echo Statement का प्रयोग करके $doSerial Variable के मान को Display किया है। परिणामस्वरूप हमें हमारे $htm Time Object का Serialized String Representation निम्नानुसार प्राप्त होता हैः
After Serialization of Time: O:4:"Time":2:{s:10:" Time hour";i:10;s:13:" Time minutes";i:13;}
फिर अगले Statement में हमने $sonata नाम का एक नया Time Object Create किया है और $doSerial नाम के Variable में Stored $hmt के Serialized Data को फिर से Time Object में Convert किया है।
परिणामस्वरूप हमें $sonata Object में $hmt Time Object के समान ही Output प्राप्त हो जाता है, क्योंकि Unserialization के बाद $doSerial Variable का String एक Time Object में Convert होकर Return होता है।
चूंकि Unserialization के बाद Return होने वाली String एक Time Object है, इसलिए इसे किसी Time Object में ही Store किया जा सकता है। इसीलिए हमने $sonata नाम का Time Object Create किया है और Unserialization के बाद प्राप्त होने वाले Output को एक Time Type के Object में प्राप्त किया है।
चूंकि $sonata भी एक Time Object है, इसलिए इसके Data को Display करने के लिए भी हमें Time Class के display() Method को Use करना जरूरी होता है, जबकि Serialization के बाद हमें Object का String Representation प्राप्त होता है, इसलिए इस String Representation को Hold करने वाले $doSerial Variable को हमने सीधे ही Echo Statement द्वारा Print कर लिया है।
यदि हम उपरोक्त Program की अन्तिम Line को Uncomment कर दें, तो PHP $sonata को भी एक String की तरह Print करने की कोशिश करेगा, जो कि सम्भव नहीं है, क्योंकि $sonata एक String नहीं बल्कि एक Time Object है। परिणामस्वरूप PHP हमें Error देगा।
लेकिन यदि हम चाहें, तो __toString Magic Method को Time Class में Override करके हम Echo Statement द्वारा भी Time Class के Object के Data को Output में Display कर सकते हैं।
Serialization Format
PHP में जब हम किसी Data को Serialize करते हैं, तब उस Data को एक String Representation में Convert करने के लिए PHP एक विशेष Format को Follow करता है। इस Format में PHP Serialize होने वाले Object या Array के हर Element को निम्न Format में Specify करता हैः
<Data Type>:<Length>:<Value>
PHP Serialization में Data के इस Format में Convert होने की वजह से हम इसे फिर से Unserialize किया जाना सम्भव हो पाता है। यदि हम इस Format को अपने Time Class के Serialize होने वाले Object पर Apply करके समझें, तो हमें हमारे Program के $hmt Time Object का Serialized Format निम्नानुसार प्राप्त होता हैः
O:4:”Time”:2:{s:10:” Time hour”;i:10;s:13:” Time minutes”;i:13;}
इस Format में सबसे पहले Colon से पहले का Character Data Type को Specify करता है, जो कि निम्न में से कोई एक होता हैः
- a – array
- b – boolean
- d – double
- i – integer
- o – common object
- r – reference
- s – string
- C – custom object
- O – Class
- N – null
- R – pointer reference
- U – unicode string
चूंकि हमारे Output में सबसे पहला Character “O” है, जो कि उपरोक्त List के अनुसार एक Class को Represent करता है, जो कि इस बात का Indication है कि Serialize होने वाला Data एक Class का Object है।
Colon के बाद Value 4 है, जो कि Class के नाम के कुल Characters की संख्या को Represent करता है। चूंकि हमारी Class का नाम Time है, इसलिए इस नाम में कुल 4 Characters होने की वजह से दूसरे मान के रूप में मान 4 Display हो रहा है।
तीसरा मान हमारी Class का नाम है जो कि Double Quotes के बीच Enclosed है। Serialize होने वाले हर Element की Value हमेंशा Double Quotes के बीच Enclosed रहती है।
अपने Serialized Output को बेहतर तरीके से समझने के लिए हम इसे निम्नानुसार Modified Form में Specify कर सकते हैं:
O:4:"Time":2:{ s:10:" Time hour"; i:10; s:13:" Time minutes"; i:13; }
इस Format का मान :2: इस बात को Specify कर रहा है कि हमारी Time Class में कुल दो Properties हैं।
Serialization के दौरान Class की सभी Properties Curly Braces के बीच Enclosed होती हैं, इसलिए हमारी Class की सभी Properties भी Curly Braces के बीच Enclosed हैं। अब यदि हम हर Property को समझें तो :
- s: इस बात को Represent कर रहा है कि पहली Property का नाम एक String है।
- 10: इस बात को Represent कर रहा है कि Property के नाम की कुल Size 10 है। यानी “ Time hour” के Space सहित कुल Characters की संख्या 10 है।
- ” Time hour”; इस बात को Represent कर रहा है कि Property का नाम hour है जो कि Time Class की Property है। तथा
- i:10; इस बात को Represent कर रहा है कि Property में Stored Value (i) Integer Type की Value है और Value 10 है।
इसी तरह से यदि हम दूसरी Property के बारे में समझें तोः
- s: इस बात को Represent कर रहा है कि पहली Property का नाम एक String है।
- 13: इस बात को Represent कर रहा है कि Property के नाम की कुल Size 13 है। यानी “ Time minutes” के Space सहित कुल Characters की संख्या 13 है। तथा
- “ Time minutes” इस बात को Represent कर रहा है कि Property का नाम hour है जो कि Time Class की Property है।
- i:13; इस बात को Represent कर रहा है कि Property में Stored Value (i) Integer Type की Value है और Value 13 है।
इस प्रकार से आप अब आसानी से समझ सकते हैं कि जब Serialization होता है, तब वास्तव में Internally क्या होता है। यानी एक Array या Object किस तरह से एक String Representation में Convert होता है और किस तरह से Unserialization के दौरान फिर से Serialized String किस तरह से Exactly पिछले Type यानी Array या Object में Convert हो जाता है।
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook PHP in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
PHP in Hindi | Page: 647 | Format: PDF