मुझे खुशी है कि आपने महसूस किया कि यह केवल एक खराब और अस्थायी समाधान है और आपको अपना कोड अनुकूलित करना चाहिए। अपने टोकन और सामान को भूल जाओ। सबसे आसान और अभी भी कुशल तरीका शायद प्रति ऑपरेशन एक साझा फ़ाइल पर एक विशेष फ़ाइल लॉक होना है। आप इसकी कल्पना लकड़ी के टुकड़े की तरह कर सकते हैं और केवल एक ही आईडी पकड़ सकता है और केवल जिसके पास है उसे ही बात करने या कुछ करने की अनुमति है।
<?php
$fp = fopen("/tmp/only-one-bed-available.txt", "w+");
if (flock($fp, LOCK_EX)) { // do an exclusive lock
// do some very important critical stuff here which must not be interrupted:
// sleeping.
sleep(60);
echo "I now slept 60 seconds";
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
यदि आप इस स्क्रिप्ट को समानांतर में 10 बार निष्पादित करते हैं, तो इसे समाप्त होने में 10 मिनट का समय लगेगा (क्योंकि केवल एक बिस्तर उपलब्ध है!)>
यह इस कोड के सभी निष्पादन को वैश्विक रूप से क्रमबद्ध करता है। यह शायद वह नहीं है जो आप चाहते हैं (आप इसे प्रति उपयोगकर्ता के आधार पर चाहते हैं, है ना?) मुझे यकीन है कि आपके पास उपयोगकर्ता-आईडी जैसा कुछ है, अन्यथा विदेशी आईपी-एड्रेस का उपयोग करें , और प्रत्येक उपयोगकर्ता के लिए एक अद्वितीय फ़ाइल नाम रखें:
<?php $fp = fopen("/tmp/lock-".$_SERVER["REMOTE_ADDR"].".txt", "w+"); ?>
आप संचालन के समूह के लिए लॉक फ़ाइल नाम भी परिभाषित कर सकते हैं। मैबी उपयोगकर्ता कुछ सामान समानांतर कर सकता है लेकिन केवल यह ऑपरेशन ही समस्या पैदा करता है? इसे एक टैग दें और इसे लॉक फ़ाइलनाम में शामिल करें!
यह अभ्यास वास्तव में उतना बुरा नहीं है और इसका उपयोग किया जा सकता है! इसे तेजी से करने के बहुत कम तरीके हैं (mysql इंटर्नल, साझा मेमोरी सेगमेंट, लोड बैलेंसर जैसी उच्च परत पर क्रमांकन...)
ऊपर पोस्ट किए गए समाधान के साथ आप इसे अपने आवेदन में कर सकते हैं जो शायद अच्छा है। आप उसी योजना का उपयोग मैसकल में भी कर सकते हैं:http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_get-lock
लेकिन आपके उपयोग के मामले में PHP कार्यान्वयन शायद आसान और बेहतर है।
यदि आप वास्तव में एक और अधिक सुरुचिपूर्ण समाधान चाहते हैं, तो बस इस फ़ंक्शन को देखें http://www.php.net/manual/en/function.sem-get.php