PHP

2012-05-01 2 views
10

में अद्वितीय कार्यकर्ता/थ्रेड/प्रक्रिया/अनुरोध आईडी प्राप्त करें बहु-थ्रेडेड वातावरण (जैसे अधिकांश वेब प्लेटफ़ॉर्म) में मैं अक्सर अपने ऐप्स के लॉग में कुछ प्रकार की थ्रेड आईडी शामिल करता हूं। यह मुझे यह बताने में सक्षम बनाता है कि कौन से लॉग एंट्री से अनुरोध किया गया था, अनुरोध/थ्रेड, जब एक साथ कई अनुरोध होते हैं जो एक ही लॉग पर एक साथ लिख रहे होते हैं।PHP

.NET/C# में, यह log4net के स्वरूपकों द्वारा किया जा सकता है, जो डिफ़ॉल्ट रूप से वर्तमान थ्रेड के ManagedThreadId (एक संख्या) या Name (दिए गए नाम) को शामिल करता है। इन गुणों विशिष्ट एक धागा पहचान (उदाहरण के लिए देखें: How to log correct context with Threadpool threads using log4net?

पीएचपी में, मैं इसी तरह कुछ भी नहीं मिला है (मैं गूगल, पीएचपी डॉक्स और एसओ) से कहा कि यह मौजूद है

+3

यह उपयोगी हो सकता है: http://php.net/manual/en/function.zend-thread-id.php – Daan

उत्तर

4

zend_thread_id():।?

int zend_thread_id (void) 

इस समारोह वर्तमान थ्रेड के लिए एक अद्वितीय पहचानकर्ता रिटर्न

हालांकि:।

यह फ़ंक्शन केवल तभी उपलब्ध होता है जब PHP जेडटीएस (ज़ेंड थ्रेड सुरक्षा) समर्थन और डीबग मोड (--enable-debug) के साथ बनाया गया हो।


जब आप अपने डेटाबेस का उपयोग करने के लिए है कि एपीआई का उपयोग (या mysqli::$thread_id जब mysqli का प्रयोग करके) तुम भी यो कॉल mysql_thread_id(), की कोशिश कर सकते।

+0

धन्यवाद, लेकिन दुर्भाग्यवश, मैं 'zend_thread_id()' का उपयोग नहीं कर सकता, और हालांकि मैं हूं लिनक्स पर चल रहा है, 'exec (' gettid ')' और 'mysql_thread_id()' कुछ भी वापस नहीं। शायद ऐसा इसलिए है क्योंकि मैं एक साझा वातावरण में चल रहा हूं। क्या कोई अन्य विकल्प भी हैं? – cheeesus

+0

केवल सी स्रोत से कॉल करने के लिए गेटिड नहीं है, टर्मिनल से नहीं? –

+0

@ लुकास आप सही हो सकते हैं ... पता नहीं क्यों मैंने वहां रखा। – CodeCaster

0

PHP के पास इस उपलब्ध के लिए कोई फ़ंक्शन नहीं लगता है, लेकिन आपका वेब सर्वर पर्यावरण चर के माध्यम से पहचानकर्ता को पास करने में सक्षम हो सकता है। उदाहरण के लिए "mod_unique_id" नामक अपाचे मॉड्यूल है [1] जो प्रत्येक अनुरोध के लिए एक अद्वितीय पहचानकर्ता उत्पन्न करता है और इसे पर्यावरण चर के रूप में संग्रहीत करता है। यदि चर मौजूद है, तो इसे $ _SERVER ['unique_id'] [2]

"शुद्ध PHP" समाधान एक स्क्रिप्ट लिखने के लिए हो सकता है जो उचित यादृच्छिक पहचानकर्ता उत्पन्न करता है, इसे परिभाषित करके ("unique_id" , वैल) और उसके बाद php.ini में auto_prepend_file [3] विकल्प का उपयोग करें जो इसे निष्पादित करने वाली प्रत्येक स्क्रिप्ट में शामिल करता है। इस तरह अद्वितीय आईडी तैयार की जाएगी जब अनुरोध प्रसंस्करण शुरू होता है और यह अनुरोध की प्रक्रिया के दौरान उपलब्ध होगा।

15

ऊपर हाल ही में जब तक, मैं apache_getenv ("UNIQUE_ID") का इस्तेमाल किया है, और यह एक CRC32 के साथ पूरी तरह से काम किया या एक और हैश समारोह।

आजकल मैं अपाचे और इस मॉड पर निर्भरता को दूर करने के लिए निम्नलिखित का उपयोग कर रहा हूं।

$uniqueid = sprintf("%08x", abs(crc32($_SERVER['REMOTE_ADDR'] . $_SERVER['REQUEST_TIME'] . $_SERVER['REMOTE_PORT'])));

यह पर्याप्त अद्वितीय को समझने के लिए जो लॉग जो अनुरोध के हैं है। यदि आपको अधिक सटीकता की आवश्यकता है, तो आप अन्य हैश फ़ंक्शंस का उपयोग कर सकते हैं।

उम्मीद है कि इससे मदद मिलती है।

+0

बस एक अनुस्मारक कि यदि दो अनुरोध एक ही समय में आते हैं, तो इस विधि के परिणामस्वरूप दो समान आईडी होंगे। –

+2

REMOTE_ADDR और REQUEST_TIME उस मामले में समान होंगे, लेकिन REMOTE_PORT अलग-अलग होंगे। रखरखाव अनुरोध के मामले में REMOTE_PORT पिछले अनुरोध के समान हो सकता है, लेकिन फिर REQUEST_TIME समान नहीं होगा। – gilm

+1

'REQUEST_TIME_FLOAT' PHP 5.4 के बाद उपलब्ध है, और सटीक नीचे माइक्रोसॉन्ड तक है। –

1

मैंने इस उद्देश्य के लिए getmypid() देखा है, लेकिन ऐसा लगता है कि यह विभिन्न प्रणालियों पर अलग-अलग व्यवहार करता है। कुछ मामलों में आईडी प्रत्येक अनुरोध के लिए अद्वितीय है, लेकिन दूसरों पर यह साझा किया जाता है।

तो, पोर्टेबिलिटी सुनिश्चित करने के लिए आप शायद अन्य उत्तरों में से एक के साथ जाने के बेहतर हैं।

0

अनुरोध की सेवा से लॉग डेटा की पहचान करने के लिए एक आईडी असाइन करना शायद यूयूआईडी संस्करण 4 (यादृच्छिक) बनाने और लॉग की प्रत्येक पंक्ति में लिखने के समान सरल है।

भी सॉफ्टवेयर है कि के साथ मदद कर रहा है: जब LoggerMDC आंकड़ों के UUID डालने और एक उचित LogFormatter का उपयोग करके log4php का उपयोग कर ramsey/uuid, php-middleware/request-id

प्रवेश के हर लाइन के लिए यह जोड़ना आसान है। पीएसआर -3 लॉगर्स के साथ, यह थोड़ा और जटिल हो सकता है, वाईएमएमवी।

एक यादृच्छिक रूप से बनाया गया यूयूआईडी एक अनुरोध की पहचान करने के लिए उपयुक्त होगा, और उप अनुरोधों के HTTP शीर्षलेखों में उस यूयूआईडी का उपयोग करके और प्रतिक्रिया में, यह भी कई प्रणालियों और प्लेटफार्मों में एक अनुरोध का पता लगाने के लिए संभव होगा सर्वर फार्म। हालांकि, इसे हेडर के रूप में डालने का मैंने उल्लेख किए गए किसी भी पैकेज का कार्य नहीं है।

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

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