2009-02-19 14 views
15

का उपयोग कर PHP स्क्रिप्ट निष्पादित नहीं कर सकता है। मैं एक स्क्रिप्ट को आमंत्रित करने की कोशिश कर रहा हूं जिसमें PHP निष्पादन कॉल का उपयोग करके कई सेकंड (तृतीय पक्ष के साथ वेब सेवाएं) लगती हैं। बहुत संघर्ष करने के बाद, मैंने इसे क्लासिक हैलो वर्ल्ड उदाहरण में घटा दिया। बुला स्क्रिप्ट लगता है:PHP exec

exec('/usr/bin/php /home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &'); 

जब मैं इस चलाने के लिए, उत्पादन execoutput.txt प्रेरक स्क्रिप्ट पृष्ठ की एक प्रतिलिपि होता है, hello world नहीं के रूप में मैं उम्मीद थी।

मुझे यह PHP स्क्रिप्ट निष्पादित करने के लिए निष्पादित करने के लिए क्यों नहीं मिल सकता है? ध्यान दें कि जब मैं ls -l जैसे किसी आदेश को कम करता हूं, तो आउटपुट अपेक्षित निर्देशिका निर्देशिका है। Btw, मामला यह मायने रखता है, मैं 755 के लिए बुलाया स्क्रिप्ट ...

अद्यतन chmod था - मैं बुला स्क्रिप्ट के अंत में कार्यकारी कॉल चले गए और कम से कम अब मैं बुला स्क्रिप्ट नहीं दिख रहा है आउटपुट में निष्पादित। पोस्टर्स के लिए Thx और मैं इन विचारों में से कुछ कोशिश करेंगे।

सहायता!

धन्यवाद स्टीव

उत्तर

16

क्या कार्यकारी कर रही है सबसे दायीं ओर का आदेश ले रहे हैं और अपने गंतव्य के लिए यह जोड़कर किया जाता है। यदि आपके पास अपनी PHP स्क्रिप्ट में शेबैंग लाइन है, तो आपको php दुभाषिया के बाइनरी निर्देश को शामिल करने की आवश्यकता नहीं है।

अगर आप सिर्फ स्क्रिप्ट के उत्पादन चाहते हैं, की कोशिश:

exec('/home/quote2bi/tmp/helloworld.php > /tmp/execoutput.txt 2>&1 &') 

लेकिन यदि आप त्रुटियों फ़ाइल में होना नहीं करना चाहते, तो आप पहले फ़ाइल के लिए outputting के लिए STDERR पुनर्निर्देशित करना चाहिए। इस तरह:

exec('/home/quote2bi/tmp/helloworld.php 2> /dev/null > /tmp/execoutput.txt') 

उपर्युक्त केवल "हैलो वर्ल्ड" निष्पादन को आउटपुट करना चाहिए।

संपादित करें:

दिलचस्प आप इस व्यवहार हो रही है। आपने कहा "कमांड" कमांड ने कहा। इस के लिए एक उपनाम बनाने की कोशिश करो और इसे आगे एक फाइल करने के लिए तो जैसे:

alias pexec='php /home/quote2bi/tmp/helloworld.php'

तो

exec('pexec > /tmp/execoutput.txt 2>&1 &') 

यह तरीका कार्यकारी के साथ एक समस्या हो रहा है के रूप में खोल ही करने का विरोध किया इनपुट के प्रबंधन । पीएचपी ही है, यह लिपि में argv $ के रूप में सब कुछ व्यवहार करता है के साथ

-जॉन

+1

जॉन - आपके उत्तर के लिए धन्यवाद, लेकिन दुर्भाग्य से, यह मेरे लिए काम नहीं करता था। जब मैंने कोशिश की: exec ('/ home/quote2bi/tmp/helloworld.php> /tmp/execoutput.txt 2> और 1 &') ... मुझे एक ही परिणाम (आउटपुट फ़ाइल में वर्तमान पृष्ठ) मिला है। दूसरा निष्पादन अवरुद्ध (और गायब) - जब जोड़ा गया तो मुझे एक ही परिणाम मिला। –

+0

क्या कोई विकल्प है यदि मेरे सर्वर पर exec() फ़ंक्शन अक्षम है –

7

समस्या है। यह आउटपुट को किसी फ़ाइल को/dev/null पर रीडायरेक्ट नहीं करता है।

मुझे कुछ समय पहले एक ही समस्या का सामना करना पड़ा। मैंने क्या किया है runscript.php/opt/php-bin में और फिर इस स्क्रिप्ट के अंदर यह चलाना चाहिए कि यह क्या चलाना चाहिए।कुछ इस तरह:

$script = $argv[1] 
$params = implode(' ', array_slice($argv, 2)); 
$cmd = "{$script} {$params} > /dev/null &"; 

$output = array(); 
$return = 0; 
exec("php {$cmd}", $output, $return); 

exit((int)$return); 

और फिर आप का उपयोग कर इसे कहते:

exec('/opt/php-bin/runscript.php /path/to/your/script.php arg1 arg2') 

है यह एक ही रास्ता है कि मैं इस काम के पाने में कामयाब रहे।

0

इस क्षेत्र में PHP की निर्दिष्ट समस्याओं से बचने के लिए, इसे शेल स्क्रिप्ट के अंदर क्यों न रखें? PHP तब शेल स्क्रिप्ट निष्पादित कर सकता है जिसमें सभी पुनर्निर्देशन आंतरिक रूप से संभाले जाते हैं।

यदि आपको गतिशील रूप से चीजों को बदलने की आवश्यकता है, तो शेल स्क्रिप्ट क्यों नहीं लिखें और फिर इसे निष्पादित करें (और बेशक, बाद में साफ करें)?

28

मुझे यह समस्या भी थी और यह पता चला कि यह php (# 11430) में एक बग है। एक php स्क्रिप्ट के भीतर एक और php स्क्रिप्ट को कॉल करते समय php-cli का उपयोग करना ठीक है। तो आप अभी भी कार्यकारी लेकिन बजाय उपयोग कर सकते हैं उपयोग php उपयोग php-CLI जब यह ब्राउज़र में बुला:

exec("php-cli somescript.php"); 

यह मेरे लिए काम किया।

+1

यह मेरे लिए भी काम करता है। इच्छा है कि मैंने जल्द ही यह जवाब देखा, 5 घंटे का सिरदर्द हल कर दिया होगा। – Omar

+1

आप महोदय ने अभी अपना दिन बचाया है। यह सही जवाब है। – DataHerder

+1

मैं इसे HOURS के लिए ढूंढ रहा हूं और छोड़ने वाला था। ध्यान दें कि यदि आप PHPSuEXEC का उपयोग कर रहे हैं, तो यह आवश्यक नहीं लगता है, लेकिन जैसे ही आप suexec को अक्षम करते हैं, आपको निर्दिष्ट के रूप में php-cli का उपयोग करना होगा। – rinogo

1

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

<?php echo "Hello World!"; ?> 

लग रहा है तो यह है कि ब्राउज़र में थूक से बाहर होगा रहे हैं चाहिए। तो अपने दूसरे कोड,

<?php include("helloWorld.php"); echo " PHP ROCKS";?> 

एक पृष्ठ है कि कैसा दिखेगा, जिसके परिणामस्वरूप कैसा दिखेगा

नमस्ते दुनिया! PHP ROCKS

0

ऐसा लगता है जैसे आप ब्राउज़र से स्क्रिप्ट चलाते हैं।

यह लिनक्स मंच पर एक परियोजना पर काम करते समय आया।

exec('wget http://<url to the php script>) 

आशा है कि इससे मदद मिलती है !!

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