2010-01-14 14 views
6

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

अभी, मैं उपयोग कर रहा हूं: shell_exec ($ कमांड); इस समस्या के साथ यह प्रोग्राम बंद होने की प्रतीक्षा करता है।

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

मैंने पृष्ठभूमि में कमांड चलाने के लिए .bat फ़ाइल जेनरेट करने का विचार किया है, लेकिन फिर भी, मैं प्रक्रिया को बाद में कैसे मारूं?

कोड मैं लिनक्स के लिए देखा है है:

$PID = shell_exec("nohup $Command > /dev/null & echo $!"); 
// Later on to kill it 
exec("kill -KILL $PID"); 

संपादित: बाहर कर देता है मैं exec के लिए php पुस्तिका से प्रक्रिया

+0

तो समाधान क्या था? – Aramil

उत्तर

4

क्या यह function from the PHP Manual सहायता करेगा?

function runAsynchronously($path,$arguments) { 
    $WshShell = new COM("WScript.Shell"); 
    $oShellLink = $WshShell->CreateShortcut("temp.lnk"); 
    $oShellLink->TargetPath = $path; 
    $oShellLink->Arguments = $arguments; 
    $oShellLink->WorkingDirectory = dirname($path); 
    $oShellLink->WindowStyle = 1; 
    $oShellLink->Save(); 
    $oExec = $WshShell->Run("temp.lnk", 7, false); 
    unset($WshShell,$oShellLink,$oExec); 
    unlink("temp.lnk"); 
} 
+0

मैं बैच फ़ाइल लॉन्च करने के लिए (लगभग) इसका उपयोग कर समाप्त हुआ और यह अब पूरी तरह से काम करता है। –

+0

इस पुरानी कब्र को खोदने के लिए खेद है। मैं सी # में किए गए बाहरी प्रोग्राम को निष्पादित करने के लिए एक ही कोड का उपयोग कर रहा हूं। ब्राउजर/PHP स्क्रिप्ट या अपाचे बस लटकता है, अगर यह सी # एप्लिकेशन अपवाद फेंकता है। क्या इसके समाधान की कोई युक्ति है?? – WatsMyName

+0

@LoVeSmItH: कोई विचार आदमी नहीं। = \ –

1

को मारने के लिए की जरूरत नहीं है:

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

यानी पाइप एक फ़ाइल और php में उत्पादन इसके लिए इंतजार नहीं कर देगा:

exec('myprog > output.txt'); 

स्मृति से, मेरा मानना ​​है कि वहाँ एक नियंत्रण चरित्र है कि आप पहले जोड़ें कर सकते हैं (जैसे आप के साथ @ करते हैं) exec आदेशों के परिवार जो निष्पादन को रोकने से रोकता है - याद नहीं कर सकता कि यह क्या है।

संपादित करें इसे मिला! यूनिक्स पर, & के साथ निष्पादित प्रोग्राम पृष्ठभूमि में चलाए जाएंगे। क्षमा करें, आपको बहुत मदद नहीं करता है।

+0

मैं बैच फ़ाइल का उपयोग करके समाप्त हुआ और कर रहा हूं: सिस्टम ("cmd/c सी: [फ़ाइल का पथ]"); जो स्क्रिप्ट को जारी रखता है। प्रक्रिया को मारने के तरीके पर कोई विचार? यह वास्तव में एडोब रीडर खोलता है, और मुझे अभी भी स्क्रिप्ट चलाने से पहले इसे बंद करने का एक तरीका चाहिए। –

+0

कभी नहीं, पता चला कि मुझे प्रक्रिया को मारने की आवश्यकता नहीं है। मैं इसे चल सकता हूँ। –

+1

मैं वर्तमान में इसे विंडोज सिस्टम पर आज़मा रहा हूं और यह अभी भी स्क्रिप्ट के लिए ब्राउज़र विंडो में समाप्त होने का इंतजार कर रहा है, भले ही यह फ़ाइल में आउटपुट हो रहा हो। इस पर कोई विचार? –

8

shell_exec('start /B "C:\Path\to\program.exe"');

/B पैरामीटर यहाँ कुंजी है।

मुझे लगता है कि मुझे यह कहां नहीं मिला है। लेकिन यह मेरे लिए काम करता है।

+0

मुझे/बी के बारे में पता नहीं था। बहुत आसान, धन्यवाद। –

+0

पूर्णता के लिए, मैं यहां प्रारंभ कमांड के बारे में दस्तावेज़ों को लिंक छोड़ देता हूं: https://technet.microsoft.com/en-us/library/cc770297(v=ws.11).aspx – zinky

2

PHP 5.2.8 के साथ Windows 2000 सर्वर पर इसे प्राप्त करने का प्रयास किया।

मेरे लिए कोई भी समाधान काम नहीं करता है। PHP प्रतिक्रिया के लिए इंतजार कर रखा।

मिले समाधान:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php"; 
pclose(popen("start /B ". $cmd, "a")); // mode = "a" since I had some logs to edit 
1

मेरे Windows 10 और Windows Server 2012 मशीनों, एकमात्र समाधान है कि मज़बूती से pclose भीतर काम पर/popen powershell के प्रारंभ प्रक्रिया आदेश को लागू करने, के रूप में किया गया था:

pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r')); 

या वरबोस रूप में दर्शा यदि आप तर्क की आपूर्ति और आउटपुट रीडायरेक्ट करना चाहते हैं:

pclose(popen('powershell.exe "Start-Process foo.bat 
      -ArgumentList \'bar\',\'bat\' 
      -WindowStyle Hidden 
      -RedirectStandardOutput \'.\\console.out\' 
      -RedirectStandardError \'.\\console.err\'"','r')); 
संबंधित मुद्दे