PHP सिस्टम प्रोग्रामिंग: स्क्रिप्ट से डेमॉन तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

जब PHP वेब की सीमाओं से बाहर निकलता है

\n

एक स्थिति की कल्पना करें: आपको एक डेमॉन लिखना है जो सिस्टम लॉग्स को मॉनिटर करेगा, उन्हें पार्स करेगा और Telegram पर नोटिफिकेशन भेजेगा। या हो सकता है, आपको एक ऐसा टास्क शेड्यूलर बनाना हो जो cron पर निर्भर न हो। या फिर अपना खुद का एक सिंपल वेब सर्वर या प्रॉक्सी लिखना हो। ज्यादातर डेवलपर्स तुरंत Python, Go या C की ओर भागेंगे। लेकिन क्या होगा अगर मैं आपसे कहूँ कि PHP भी सिस्टम प्रोग्रामिंग कर सकता है? और वह भी काफी अच्छे से।

\n

PHP सिर्फ "WordPress साइट्स" की भाषा नहीं है। इसका CLI वर्जन (Command Line Interface) सिस्टम एडमिनिस्ट्रेशन, प्रोसेस मैनेजमेंट, नेटवर्क सॉकेट और यहाँ तक कि डेमॉनाइजेशन के लिए एक पूर्ण टूल है। इस आर्टिकल में हम देखेंगे कि PHP को सिस्टम प्रोग्रामिंग के लिए कैसे इस्तेमाल करें और Linux पर काम करने वाले रियल कोड उदाहरण दिखाएँगे।

\n\n

तैयारी: क्या जानना ज़रूरी है

\n

सबसे पहले सुनिश्चित करें कि आपके पास PHP CLI और एक्सटेंशन pcntl (प्रोसेस मैनेजमेंट), posix (सिस्टम कॉल्स) और sockets (सॉकेट प्रोग्रामिंग) इंस्टॉल हैं। ज़्यादातर Linux डिस्ट्रीब्यूशन में यह एक कमांड से हो जाता है:

\n
sudo apt install php-cli php-pcntl php-posix php-sockets
\n

एक्सटेंशन की उपलब्धता php -m | grep -E 'pcntl|posix|sockets' से चेक करें। अगर सब ठीक है, तो चलिए शुरू करते हैं।

\n\n

प्रोसेस के साथ काम: fork और exec

\n

PHP pcntl_fork() फंक्शन की मदद से चाइल्ड प्रोसेस बना सकता है। यह टास्क को समानांतर (parallel) चलाने का एक शक्तिशाली तरीका है। आइए एक उदाहरण देखें जो तीन चाइल्ड प्रोसेस बनाता है, और हर एक अपना काम करता है।

\n
<?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

बाहरी कमांड चलाना

\n

exec() फंक्शन और इसके वेरिएंट (shell_exec(), system()) किसी भी सिस्टम कमांड को चला सकते हैं। लेकिन असली सिस्टम प्रोग्रामिंग के लिए proc_open() बेहतर है — यह इनपुट/आउटपुट और प्रोसेस PID पर पूरा नियंत्रण देता है।

\n
<?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\n

सिग्नल हैंडलिंग: डेमॉन को विनम्र बनाना

\n

किसी भी गंभीर डेमॉन को ऑपरेटिंग सिस्टम के सिग्नल को सही ढंग से हैंडल करना चाहिए। PHP pcntl एक्सटेंशन के ज़रिए सिग्नल (SIGTERM, SIGHUP, SIGUSR1 और अन्य) को इंटरसेप्ट कर सकता है। यह एक महत्वपूर्ण कौशल है।

ब्लॉग

पुस्तक अनुशंसाएँ