2012-09-13 37 views
24

मुझे निम्न कोड मिला है और सेमफोर इसे अपेक्षित रूप से लॉक नहीं करेगा।php semaphore काम नहीं करता

(मैं apc_inc के बारे में पता कर रहा हूँ। यह नहीं है कि मैं क्या देख रहा हूँ।)

$semkey = sem_get(123); 
sem_acquire($semkey); 

$count = apc_fetch('count111'); 
if(!$count) $count = 0; 
$count++; 
apc_store('count111', $count); 

sem_release($semkey); 

ab -n 4000 -c 200 http://localhost/test.php

0 अनुरोध विफल रहा है के बाद।

लेकिन उसके बाद एक apc_fetch('count111') चलता ही ~ 1200 हिट

Ubuntu 12.04 (64 बिट), php 5.3.16 ~ dotdeb, php-एफ पी एम पर nginx

  • अद्यतन 1: पूरी तरह से पर काम करता है लिनक्स टकसाल, 5.4.6 ~ dotdeb, वेब सर्वर में बनाया गया। मैं उसी मशीन के साथ उसी मशीन के साथ nginx के साथ कोशिश करने जा रहा हूँ।
+2

बस स्पष्ट करने के लिए: मैंने लॉक ब्लॉक के अंदर 'apc_inc' कॉल डालने का प्रयास किया है और इसे सभी 4000 बार निष्पादित किया गया है। – Alex

+0

जहां तक ​​मैं समझता हूं कि PHP सेमफोर साझा स्मृति और संसाधन लॉक कर रहा है, कोड ब्लॉक नहीं। मेरा मानना ​​है कि यह PHP साझा मेमोरी फ़ंक्शन – Bnaya

+1

के साथ काम करेगा, मुझे लगता है कि sem_get सभी आवश्यक संसाधनों को प्रारंभ करता है और PHP के स्रोत कोड को बहुत अधिक पुष्टि करता है। उन्हें पॉजिक्स के सेमेट पर सीधी कॉल मिली है, जो वहां से निकलती है। इसके अलावा, सेमेफोर प्रक्रियाओं को सिंक करने के लिए मानसिक हैं जो ** ** किसी भी स्मृति को साझा नहीं करते हैं। – Alex

उत्तर

1

समस्या जाहिर है, एपीसी के साथ ही, सैमफोर के साथ नहीं।
को अपडेट करने के लिए PHP 5.4.8 -1 ~ dotdeb.0 ने nginx और अंतर्निहित सर्वर परीक्षण रन दोनों के लिए समस्या हल कर दी है।