PHP का निष्पादन () बनाम सिस्टम () बनाम पार्थस्ट्रु ()


312

क्या अंतर हैं?

क्या प्रत्येक कार्य के लिए कोई विशिष्ट स्थिति या कारण है? यदि हाँ, तो क्या आप उन स्थितियों के कुछ उदाहरण दे सकते हैं?

PHP.net का कहना है कि उनका उपयोग बाहरी कार्यक्रमों को निष्पादित करने के लिए किया जाता है। संदर्भ देखें मेरे द्वारा देखे गए उदाहरणों से, मुझे कोई स्पष्ट अंतर दिखाई नहीं देता है।

अगर मैं केवल एक स्क्रिप्ट (बैश या पाइथन) चला रहा था, तो आप मुझे कौन सा फंक्शन इस्तेमाल करने की सलाह देते हैं?


16
वहाँ भी है proc_open()और popen()दोनों, जो उच्च स्तर पर नियंत्रित प्रक्रिया की अनुमति देते हैं।
ईसाई

जवाबों:


195

उनके कुछ अलग उद्देश्य हैं।

  • exec() एक सिस्टम कमांड को कॉल करने के लिए है, और शायद आउटपुट से निपटने के लिए।
  • system() एक सिस्टम कमांड को निष्पादित करने और तुरंत आउटपुट प्रदर्शित करने के लिए है - संभवतः पाठ।
  • passthru() एक सिस्टम कमांड निष्पादित करने के लिए है जिसे आप कच्चे रिटर्न से चाहते हैं - संभवतः कुछ बाइनरी।

भले ही, मेरा सुझाव है कि आप उनमें से किसी का भी उपयोग न करें। वे सभी अत्यधिक अस्थिर कोड का उत्पादन करते हैं।


147
कभी-कभी कार्यक्षमता के लिए पोर्टेबिलिटी का त्याग करना पड़ता है। कुछ चीजें हैं जो PHP अच्छा नहीं कर सकती हैं।
फ्रैंक क्रुक

30
@ कालियम: क्या आप अपने बयान पर अधिक विस्तार कर सकते हैं? सिर्फ कुछ अस्पष्ट प्रतिशत आँकड़े बताते हुए मुझे आश्वस्त नहीं करता है। मेरा मानना ​​है कि स्क्रिप्ट को निष्पादित करने के लिए सिस्टम कॉल का उपयोग करना तब तक पूरी तरह से ठीक है जब तक कि पूरा एप्लिकेशन बैक-एंड में स्क्रिप्ट के एक गुच्छा पर निर्भर न हो।
कोडिंगबियर

46
@ izkata@izein:~$ dir -bash: dir: command not found
क्रिसियन

5
@OZ_ मैं उस स्थिति में आ गया हूँ जहाँ मुझे बहुत महंगी संगणनाएँ करनी थीं। कोई भी PHP- मॉड्यूल उस के लिए उपलब्ध नहीं था (है)। मैंने अपना स्वयं का सी कार्यक्रम लिखा और मैं इसे पार्थस्ट्रु () के साथ आमंत्रित करता हूं। कभी-कभी अन्य चीजों की तुलना में पोर्टेबिलिटी कम महत्वपूर्ण हो सकती है। परियोजना पर निर्भर करता है।
पाओलो

9
इसके अलावा, यह एक है भ्रम को लगता है कि पीएचपी के रूप में आप से बचने के लंबे समय के रूप पोर्टेबल है exec, system, passthru। PHP कोड उस वातावरण पर निर्भर है जो इसमें चलता है, और कई सुरक्षा बग इस पर ध्यान नहीं देने के कारण हैं। यहाँ एक त्वरित उदाहरण है: stackoverflow.com/questions/3003145/…
पेसियर

131

जैसा कि http://php.net/ && Chipmunkninja से लिया गया है :

प्रणाली () समारोह

PHP में सिस्टम फ़ंक्शन कमांड के साथ एक स्ट्रिंग तर्क लेता है और साथ ही आप उस कमांड को पास करने के लिए किसी भी तर्क को निष्पादित करना चाहते हैं। यह फ़ंक्शन निर्दिष्ट कमांड को निष्पादित करता है, और आउटपुट स्ट्रीम (वेब ​​सर्वर स्थिति में HTTP आउटपुट, या कंसोल यदि आप कमांड लाइन टूल के रूप में पीएचपी चला रहे हैं, तो किसी भी परिणामी टेक्स्ट को डंप करता है)। इस फ़ंक्शन की वापसी कार्यक्रम से आउटपुट की अंतिम पंक्ति है, अगर यह पाठ आउटपुट का उत्सर्जन करता है।

कार्यकारी () समारोह

सिस्टम फ़ंक्शन काफी उपयोगी और शक्तिशाली है, लेकिन इसके साथ एक सबसे बड़ी समस्या यह है कि प्रोग्राम से सभी परिणामी टेक्स्ट सीधे आउटपुट स्ट्रीम में जाते हैं। ऐसी परिस्थितियाँ होंगी जहाँ आप परिणामी पाठ को प्रारूपित करना और कुछ अलग तरीके से प्रदर्शित करना पसंद कर सकते हैं, या इसे बिल्कुल भी प्रदर्शित नहीं कर सकते हैं।

इसके लिए, PHP में निष्पादन फ़ंक्शन पूरी तरह से अनुकूलित है। प्रोग्राम द्वारा उत्पन्न सभी पाठ को आउटपुट स्ट्रीम में निष्पादित करने के बजाय स्वचालित रूप से डंप करने के बजाय, यह आपको फ़ंक्शन के दूसरे पैरामीटर में दिए गए सरणी में इस पाठ को डालने का अवसर देता है:

Shell_exec () समारोह

अधिकांश कार्यक्रम जिन्हें हम अब तक निष्पादित कर रहे हैं, कम या ज्यादा, वास्तविक प्रोग्राम 1। हालाँकि, जिस वातावरण में विंडोज और यूनिक्स उपयोगकर्ता काम करते हैं, वह वास्तव में इससे बहुत समृद्ध है। विंडोज उपयोगकर्ताओं के पास विंडोज कमांड प्रॉम्प्ट प्रोग्राम, cmd.exe का उपयोग करने का विकल्प है। इस प्रोग्राम को कमांड शेल के रूप में जाना जाता है।

Passthru () समारोह

एक आकर्षक कार्य जो PHP उन लोगों के समान प्रदान करता है जिन्हें हमने अब तक देखा है वह है पस्स्त्र्रू फ़ंक्शन। यह फ़ंक्शन, अन्य लोगों की तरह, उस प्रोग्राम को निष्पादित करता है जिसे आप इसे बताते हैं। हालाँकि, यह तब इस प्रोग्राम से कच्चे आउटपुट को आउटपुट स्ट्रीम में भेजने के लिए आगे बढ़ता है, जिसके साथ PHP वर्तमान में काम कर रहा है (यानी या तो वेब सर्वर परिदृश्य में HTTP, या PHP के कमांड लाइन संस्करण में शेल)।

Proc_open () समारोह और popen () समारोह

proc_open () पॉपेन () के समान है, लेकिन कार्यक्रम के निष्पादन पर बहुत अधिक नियंत्रण प्रदान करता है। cmd शेल द्वारा निष्पादित होने वाली कमांड है। डिस्क्रिप्टरपेक एक अनुक्रमित सरणी है जहां कुंजी डिस्क्रिप्टर संख्या का प्रतिनिधित्व करती है और मान यह दर्शाता है कि कैसे PHP उस डिस्क्रिप्टर को बाल प्रक्रिया में पास करेगा। पाइप फ़ाइल पॉइंटर्स के अनुक्रमित सरणी पर सेट किए जाएंगे जो कि बनाए गए किसी भी पाइप के PHP के अंत के अनुरूप हैं। वापसी मूल्य प्रक्रिया का प्रतिनिधित्व करने वाला एक संसाधन है; जब आप इसे पूरा कर लें तो आप proc_close () का उपयोग करके इसे मुक्त कर दें।


6
shell_exec निष्पादन की गति अन्य वैकल्पिक की तुलना में तेज़ है।
दिनेश सैनी

29
आपको यह उल्लेख करना चाहिए कि आपने अपने उत्तर को सीधे ChipmunkNinja से कॉपी किया है ।
TachyonVortex

7
@TachyonVortex सौभाग्य से उन्होंने उत्तर शब्दशः की नकल की, क्योंकि चिपमंक निन्जा अब मौजूद नहीं है।
Phileo99

2

2
Popen और proc_open के बारे में क्या?
CMCDragonkai

103

पिछले उत्तर सभी को थोड़ा भ्रमित या अधूरा लगता है, इसलिए यहाँ मतभेदों की एक तालिका है ...

+----------------+-----------------+----------------+----------------+
|    Command     | Displays Output | Can Get Output | Gets Exit Code |
+----------------+-----------------+----------------+----------------+
| system()       | Yes (as text)   | Last line only | Yes            |
| passthru()     | Yes (raw)       | No             | Yes            |
| exec()         | No              | Yes (array)    | Yes            |
| shell_exec()   | No              | Yes (string)   | No             |
| backticks (``) | No              | Yes (string)   | No             |
+----------------+-----------------+----------------+----------------+
  • "आउटपुट प्रदर्शित करता है" इसका अर्थ है कि यह ब्राउज़र को आउटपुट स्ट्रीम करता है (या कमांड लाइन आउटपुट कमांड लाइन से चलने पर)।
  • "आउटपुट प्राप्त करें" का अर्थ है कि आप कमांड का आउटपुट प्राप्त कर सकते हैं और इसे PHP चर में निर्दिष्ट कर सकते हैं।
  • "एक्जिट कोड" कमांड द्वारा लौटाया गया एक विशेष मान है (जिसे "रिटर्न स्टेटस" भी कहा जाता है)। शून्य का आमतौर पर मतलब है कि यह सफल था, अन्य मान आमतौर पर त्रुटि कोड होते हैं।

अन्य जानकारी के बारे में पता होना चाहिए:

  • Shell_exec () और backticks ऑपरेटर एक ही काम करते हैं।
  • वहाँ भी proc_open () और popen () हैं जो आपको एक निष्पादन कमांड के साथ इंटरेक्टिव रूप से पढ़ने / लिखने की अनुमति देते हैं।
  • कमांड स्ट्रिंग में "2> और 1" जोड़ें यदि आप भी त्रुटि संदेशों को कैप्चर / प्रदर्शित करना चाहते हैं।
  • आदेश तर्कों से बचने के लिए esapsehellcmd () का उपयोग करें जिसमें समस्या वर्ण हो सकते हैं।
  • यदि आउटपुट को स्टोर करने के लिए $ आउटपुट वेरिएबल को पास किया जाता है, अगर $ आउटपुट खाली नहीं है, तो यह नए आउटपुट को इसमें जोड़ देगा। इसलिए आपको पहले ($ आउटपुट) को परेशान करना पड़ सकता है।

जो लोग एक php फ़ाइल निष्पादित कर सकते हैं?
जॉनी क्यों

1
जब तक आप स्पष्ट रूप से php cli या इस तरह के आह्वान नहीं करते हैं, तब तक @johnywhy कोई नहीं। मुझे लगता है कि आप चाहते हैं includeऔर दोस्तों
Hagen von Eitzen

21

यह वास्तव में सब कुछ नीचे आता है कि आप आउटपुट को कैसे संभालना चाहते हैं जो कमांड वापस आ सकता है और आप चाहते हैं कि आपकी PHP स्क्रिप्ट कैलली प्रोग्राम के खत्म होने का इंतजार करे या न करे।

  • exec कमांड को निष्पादित करता है और कॉलर को आउटपुट देता है (या इसे वैकल्पिक चर में लौटाता है)।

  • passthruउस exec()फ़ंक्शन के समान है जिसमें यह एक कमांड निष्पादित करता है। इस फ़ंक्शन का उपयोग तब किया जाना चाहिए exec()या system()जब यूनिक्स कमांड से आउटपुट बाइनरी डेटा होता है जिसे सीधे ब्राउज़र में वापस पारित करने की आवश्यकता होती है।

  • system एक बाहरी कार्यक्रम निष्पादित करता है और आउटपुट प्रदर्शित करता है, लेकिन केवल अंतिम पंक्ति।

यदि आपको एक कमांड निष्पादित करने की आवश्यकता है और कमांड से सभी डेटा बिना किसी हस्तक्षेप के सीधे वापस पारित हो जाते हैं, तो passthru()फ़ंक्शन का उपयोग करें ।


8

यदि आप अपने PHP स्क्रिप्ट को कमांड-लाइन से चला रहे हैं, तो passthru()इसका एक बड़ा फायदा है। कि आप जैसा लिपियों / कार्यक्रमों पर अमल करने देगा vim, dialog, आदि, उन कार्यक्रमों संभाल नियंत्रण दे और अपनी स्क्रिप्ट की ओर लौटने केवल जब वे किया जाता है।

यदि आप उन लिपियों / कार्यक्रमों का उपयोग करते हैं system()या exec()निष्पादित करते हैं, तो यह आसानी से काम नहीं करेगा।

पकड़ लिया: किसी कारण के लिए, आप पर अमल नहीं कर सकते हैं lessके साथ passthru()PHP में।


1
मुझे समझ नहीं आ रहा है कि आप क्या कह रहे हैं। आप CLI और (F) CGI (साथ ही mod_php) दोनों से प्रोग्राम निष्पादित कर सकते हैं। सिस्टम-लगाए गए प्रतिबंध हो सकते हैं, जैसे कि सेलिनक्स। लेकिन एक अच्छी तरह से सेट-अप प्रणाली उन चुनिंदा बंद होगा। बेशक एक साझा होस्ट एक अलग कहानी है, लेकिन आप सम्मानित ग्राहकों को साझा वातावरण प्रदान नहीं करेंगे , नहीं?
ईसाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.