2013-01-10 11 views
5

का समवर्ती उपयोग मैं एक अधिसूचना सेवा सर्वर के लिए लगातार सॉकेट कनेक्शन बनाने के लिए PHP का उपयोग करना चाहता हूं और मुझे आश्चर्य है कि मुझे समस्या होने से पहले कितने अपाचे/PHP थ्रेड सॉकेट का उपयोग करने में सक्षम होंगे। मैं इस के साथ कुछ परीक्षण किया है, लेकिन मैं किसी भी समस्याओं का उत्पादन नहीं कर पा रहे।एक लगातार PHP सॉकेट


संपादित

मैं इस तरह सॉकेट उपयोग कर रहा हूँ:

$fh = pfsockopen('127.0.0.1', '1338'); 
fwrite($fh,$data); 

हर पीएचपी धागा ही लगातार सॉकेट

+0

तुम मुझे कल्पना आप क्या करते हैं मदद करने के लिए एक कोड उदाहरण प्रदान कर सकता है? –

+0

आप अपनी बैंडविड्थ/मेमोरी की अनुमति दे सकते हैं, मुझे लगता है ... – crush

+0

आप धागे के बीच सॉकेट कैसे साझा कर रहे हैं? pthreads? – glomad

उत्तर

23

साझा करेंगे fsockopen साथ सीमा अधिकतम राशि है खुले फ़ाइल वर्णनकर्ता सिस्टम कर्नेल सेटिंग में निर्धारित की। pfsockopen अच्छी तरह से कार्यान्वित किया जाता है, तो यह केवल एक एकल गर्तिका कनेक्शन का उपयोग करना चाहिए, php प्रक्रिया में केवल एक फ़ाइल वर्णनकर्ता का मतलब है।

आप इस परीक्षण करने के लिए होगा।

उदा।

$fd = pfsockopen('173.194.44.24', 80); 
echo $fd; 

हो जाएगा ताकि आउटपुट फ़ाइल वर्णनकर्ता की पहचान: Resource id #1

यह पृष्ठ खोलें कई बार एक वेब ब्राउज़र में और फिर से लोड - आप एक ही आईडी हर बार देखना चाहिए कि आप एक ही सॉकेट कनेक्शन का उपयोग कर रहे हैं ।

एक डिफ़ॉल्ट अपाचे prefork एम पी एम में - mod_php सेटअप आप शायद बेतरतीब ढंग से अलग काँटेदार प्रक्रियाओं जो n अलग आईडी में सबसे अधिक संभावना परिणाम को दोहराते रहते जाएगा के लिए भेजा जाता है, जबकि एन

  • के अपने अपाचे विन्यास पर निर्भर करता है MinSpareServers (< = n pConnections)
  • MaxSpareServers (> = n pConnections)
  • MaxRequestsPerChild (Tmax)

जब आप MaxRequestsPerChild तक पहुँचने के प्रोसेस को समाप्त कर और इस बच्चे पर लगातार कनेक्शन के रूप में अच्छी तरह से कर रहा है।

अपाचे वर्कर एमपीएम या किसी भी अन्य फास्टसी-सक्षम वेबसर्वर जैसे लाइटटैड या एनजिनक्स PHP-एफपीएम या PHP-cgi + fastcgi के साथ संयुक्त मैं एक ही व्यवहार की उम्मीद कर रहा हूं, अब वेबसर्वर के कारण नहीं बल्कि PHP प्रक्रियाओं के कारण।

समानांतर ऊपर दिए गए विवरण अपाचे जमाव के अनुसार, संबंधित सेटिंग्स

पीएचपी-एफ पी एम हैं

  • pm.min_spare_servers (< = n pConnections)
  • pm.max_spare_servers (> = n pConnections)
  • pm.max_requests (टीएमएक्स)

FastCGI

  • PHP_FCGI_CHILDREN (= n pConnections)
  • PHP_FCGI_MAX_REQUESTS (Tmax)

सभी विन्यास में एक लगातार कनेक्शन की अधिकतम जीवन भर है कि द्वारा नियंत्रित अनुरोधों की राशि में (है प्रक्रिया) tMax, समांतर निरंतर कनेक्शन की अधिकतम मात्रा n pConnections

(Php-CLI)

कमांड लाइन पर इस अनुकरण

# php -a 
Interactive shell       # in a webserver environment this is the equivalent of one child 

php > $fd1 = fsockopen('google.de', 80); # open non-persistent connection 
php > echo $fd1 . "\n"; 
Resource id #1 
php > $fd2 = fsockopen('google.de', 80); # open another one 
php > echo $fd2 . "\n"; 
Resource id #2        # new fd, new connection 

php > $pd1 = pfsockopen('google.de', 80); # persistent connection 
php > echo $pd1 . "\n"; 
Resource id #3        # first persistent fd 
php > $pd2 = pfsockopen('google.de', 80); 
php > echo $pd2 . "\n";       
Resource id #3        # uses the same connection 

php > exit         # simulating MaxRequestsPerChild threshold 
# php -a 
Interactive shell 

php > $pd3 = pfsockopen('google.de', 80); # persistent connection, same host 
php > echo $pd3 . "\n"; 
Resource id #1        # resource id reused because all old connections are gone 

संपादित

acually मैं एक दूसरी सीमा उल्लेख करना भूल गया। पाठ्यक्रम के कनेक्शन सर्वर द्वारा किसी भी समय बंद किया जा सकता है। यह आपके द्वारा उपयोग की जा रही सर्वर सेटिंग्स और प्रोटोकॉल पर निर्भर करता है।

अधिकांश सर्वर n चुप्पी के सेकंड के बाद कनेक्शन को बंद करते हैं और कुल कनेक्शन समय के x सेकंड के बाद कनेक्शन बंद करते हैं।

pconnect यह चुपचाप संभालता है, जब पुराना एक चला जाता है तो यह केवल एक नया कनेक्शन खुलता है।

फिर CLI पर इस अनुकरण:

# php -a 
Interactive shell 

php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #1 
php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #1 

(restarting my webserver on the another console /etc/init.d/nginx restart) 

php > $pd1 = pfsockopen('127.0.0.1', 80); 
php > echo $pd1 . "\n"; 
Resource id #2 
+2

वाह, यह एक बहुत ही अच्छी और अच्छी तरह से स्वरूपित स्पष्टीकरण था। मैं उम्मीद कर रहा था कि जवाब मूल रूप से होगा लेकिन मैं अपने परीक्षण परिणामों से अनिश्चित था। धन्यवाद! – nathanjosiah

+0

आपका स्वागत है, इस मदद से खुशी हुई –

संबंधित मुद्दे