जब PHP वेब की सीमाओं से बाहर निकलता है
\nएक स्थिति की कल्पना करें: आपको एक डेमॉन लिखना है जो सिस्टम लॉग्स को मॉनिटर करेगा, उन्हें पार्स करेगा और Telegram पर नोटिफिकेशन भेजेगा। या हो सकता है, आपको एक ऐसा टास्क शेड्यूलर बनाना हो जो cron पर निर्भर न हो। या फिर अपना खुद का एक सिंपल वेब सर्वर या प्रॉक्सी लिखना हो। ज्यादातर डेवलपर्स तुरंत Python, Go या C की ओर भागेंगे। लेकिन क्या होगा अगर मैं आपसे कहूँ कि PHP भी सिस्टम प्रोग्रामिंग कर सकता है? और वह भी काफी अच्छे से।
\nPHP सिर्फ "WordPress साइट्स" की भाषा नहीं है। इसका CLI वर्जन (Command Line Interface) सिस्टम एडमिनिस्ट्रेशन, प्रोसेस मैनेजमेंट, नेटवर्क सॉकेट और यहाँ तक कि डेमॉनाइजेशन के लिए एक पूर्ण टूल है। इस आर्टिकल में हम देखेंगे कि PHP को सिस्टम प्रोग्रामिंग के लिए कैसे इस्तेमाल करें और Linux पर काम करने वाले रियल कोड उदाहरण दिखाएँगे।
\n\nतैयारी: क्या जानना ज़रूरी है
\nसबसे पहले सुनिश्चित करें कि आपके पास PHP CLI और एक्सटेंशन pcntl (प्रोसेस मैनेजमेंट), posix (सिस्टम कॉल्स) और sockets (सॉकेट प्रोग्रामिंग) इंस्टॉल हैं। ज़्यादातर Linux डिस्ट्रीब्यूशन में यह एक कमांड से हो जाता है:
sudo apt install php-cli php-pcntl php-posix php-sockets\nएक्सटेंशन की उपलब्धता php -m | grep -E 'pcntl|posix|sockets' से चेक करें। अगर सब ठीक है, तो चलिए शुरू करते हैं।
प्रोसेस के साथ काम: fork और exec
\nPHP pcntl_fork() फंक्शन की मदद से चाइल्ड प्रोसेस बना सकता है। यह टास्क को समानांतर (parallel) चलाने का एक शक्तिशाली तरीका है। आइए एक उदाहरण देखें जो तीन चाइल्ड प्रोसेस बनाता है, और हर एक अपना काम करता है।
<?php\n$workers = 3;\n$pids = [];\n\nfor ($i = 0; $i < $workers; $i++) {\n $pid = pcntl_fork();\n if ($pid == -1) {\n die("प्रोसेस बनाने में विफल");\n } elseif ($pid) {\n // पैरेंट प्रोसेस: चाइल्ड का PID सेव करें\n $pids[] = $pid;\n echo "चाइल्ड प्रोसेस बनाया गया PID: $pid\\n";\n } else {\n // चाइल्ड प्रोसेस\n echo "चाइल्ड प्रोसेस " . getmypid() . " ने काम शुरू किया\\n";\n sleep(rand(2, 5)); // काम का अनुकरण\n echo "चाइल्ड प्रोसेस " . getmypid() . " समाप्त हुआ\\n";\n exit(0);\n }\n}\n\n// पैरेंट सभी चाइल्ड प्रोसेस के खत्म होने का इंतज़ार करता है\nforeach ($pids as $pid) {\n pcntl_waitpid($pid, $status);\n echo "प्रोसेस $pid स्टेटस $status के साथ समाप्त हुआ\\n";\n}\n?>\nयह कोड PHP में बेसिक मल्टीटास्किंग दिखाता है। आप समानांतर टास्क चला सकते हैं — लॉग पार्स करना, फ़ाइल प्रोसेस करना, नेटवर्क रिक्वेस्ट भेजना। सिस्टम प्रोग्रामिंग में यह तब बहुत काम आता है जब बिना मुख्य थ्रेड को ब्लॉक किए बड़ी मात्रा में डेटा प्रोसेस करना हो।
\n\nबाहरी कमांड चलाना
\nexec() फंक्शन और इसके वेरिएंट (shell_exec(), system()) किसी भी सिस्टम कमांड को चला सकते हैं। लेकिन असली सिस्टम प्रोग्रामिंग के लिए proc_open() बेहतर है — यह इनपुट/आउटपुट और प्रोसेस PID पर पूरा नियंत्रण देता है।
<?php\n$descriptorspec = [\n 0 => ["pipe", "r"], // stdin\n 1 => ["pipe", "w"], // stdout\n 2 => ["pipe", "w"] // stderr\n];\n\n$process = proc_open('ping -c 4 8.8.8.8', $descriptorspec, $pipes);\n\nif (is_resource($process)) {\n // आउटपुट पढ़ें\n $output = stream_get_contents($pipes[1]);\n fclose($pipes[1]);\n fclose($pipes[2]);\n proc_close($process);\n \n echo "ping का परिणाम:\\n$output";\n}\n?>\nयह तरीका PHP को ps से लेकर ffmpeg तक किसी भी सिस्टम यूटिलिटी के साथ जोड़ने की अनुमति देता है।
सिग्नल हैंडलिंग: डेमॉन को विनम्र बनाना
\nकिसी भी गंभीर डेमॉन को ऑपरेटिंग सिस्टम के सिग्नल को सही ढंग से हैंडल करना चाहिए। PHP pcntl एक्सटेंशन के ज़रिए सिग्नल (SIGTERM, SIGHUP, SIGUSR1 और अन्य) को इंटरसेप्ट कर सकता है। यह एक महत्वपूर्ण कौशल है।