क्या कमांड को पूरा करने के लिए इंतजार किए बिना शेल_सेक्स का उपयोग करने का एक तरीका है?


95

मेरे पास एक प्रक्रिया गहन कार्य है जिसे मैं पृष्ठभूमि में चलाना चाहूंगा।

उपयोगकर्ता एक पृष्ठ पर क्लिक करता है, PHP स्क्रिप्ट चलाता है, और अंत में, कुछ शर्तों के आधार पर, यदि आवश्यक हो, तो उसे एक शेल स्क्रिप्ट, ईजी चलाना होगा:

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');

वर्तमान में मैं shell_exec का उपयोग करता हूं , लेकिन इसके लिए स्क्रिप्ट को आउटपुट के लिए प्रतीक्षा करने की आवश्यकता होती है। क्या कोई आज्ञा है जिसे मैं पूरा करने की प्रतीक्षा किए बिना अपनी इच्छा के अनुसार निष्पादित करना चाहता हूं ?


नोट: इस प्रक्रिया को तुरंत शुरू करना है इसलिए क्रोन एक विकल्प नहीं है।
टॉफेल

2
बस एक त्वरित नोट: सुनिश्चित करें कि पृष्ठ सभी (खोज इंजन / धोखाधड़ी करने वाले उपयोगकर्ता) द्वारा सुलभ नहीं होगा और यदि आप साझा वातावरण पर हैं, तो आपकी सभी लिपियों का निष्पादन समय (विशेष रूप से php!) शायद सीमित है। किसी भी स्थिति में आप set_time_limit / php.ini पर एक नज़र डालना चाहते हैं।
मर्कुरो

जवाबों:


150

कैसे जोड़ रहा है?

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');

नोट यह भी stdio और stderr से छुटकारा दिलाता है।


2
नहीं, कोई साइड इफेक्ट नहीं। यदि आप कुछ समय के लिए तय करते हैं कि आप अपनी प्रक्रिया का stdio या stderr आउटपुट चाहते हैं तो stackoverflow.com/questions/45953/…
jitter

1
प्रश्न: यह सिर्फ उत्पादन को छोड़ रहा है, है ना? क्या PHP अभी भी निष्पादन को जारी रखने से पहले समाप्त होने की प्रक्रिया का इंतजार कर रहा है, या यह आग और भूल जाता है?
एलन स्टॉर्म

5
हाँ बाहर। हाँ आग और भूल जाओ
घबराना

3
नोट: > /dev/null 2>&1 &जैसा कि अन्य उत्तरों में देखा > /dev/null 2>/dev/null &गया है, यहाँ दिया गया एक संक्षिप्त रूप है। यह मूल रूप से "रीडायरेक्ट STDERR (2) को उसी स्थान पर STDOUT (& 1)" कह रहा है।
rymo

3
मैं आमतौर पर गूंज $ जोड़कर स्क्रिप्ट चलाने का पीआईडी ​​प्राप्त करता हूं! >> /tmp/pid.txt निष्पादन कमांड के अंत में, लेकिन / dev / null में आउटपुट और त्रुटि को पुनर्निर्देशित करके, कोई और अधिक पीआईडी ​​फ़ाइल नहीं: क्या आप में से कोई भी आउटपुट का इंतजार नहीं करते हुए निष्पादन द्वारा लॉन्च की गई स्क्रिप्ट की PID प्राप्त कर सकता है?
hugsbrugs

28

यह एक कमांड निष्पादित करेगा और रनिंग प्रक्रिया से डिस्कनेक्ट करेगा। बेशक, यह कोई भी आज्ञा हो सकती है जिसे आप चाहते हैं। लेकिन एक परीक्षण के लिए, आप नींद के साथ एक php फ़ाइल बना सकते हैं (20) इसे कमांड करें।

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");

क्या यह बेहतर है या शेल_सेक्स?
realtebo

नमस्ते, क्या मैं इस शेल_सेक्स ("nohup / usr / bin / php -f example.com/notifications/sendnotifications_async > / dev / null 2> & 1 &") का उपयोग करके फ़ंक्शन चला सकता हूं ;
वसीम बशीर

दोनों nohup और क्यों &?
Bugmenot123

11

आप अपने आउटपुट को तुरंत क्लाइंट को वापस दे सकते हैं और अपने PHP कोड को बाद में प्रोसेस करना जारी रख सकते हैं।

यह वह विधि है जो मैं लंबे समय से प्रतीक्षित अजाक्स कॉल के लिए उपयोग कर रहा हूं, जिसका क्लाइंट पर कोई प्रभाव नहीं होगा:

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.

आप यहाँ विस्तृत विवरण पा सकते हैं: http://oytun.co/response-now-process-later


1
ऑप्स ... मैं यहां एक ज़ोंबी सवाल उठा रहा था, मुझे एहसास हुआ। लेकिन यह थोड़ी सी जानकारी दूसरों के लिए फायदेमंद हो सकती है।
ओयटुन

3
इसका शेल_सेक्स के साथ कोई लेना- देना नहीं है
Bugmenot123

8

Windows 2003 पर, प्रतीक्षा के बिना किसी अन्य स्क्रिप्ट को कॉल करने के लिए, मैंने इसका उपयोग किया:

$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; 
pclose(popen($commandString, 'r'));

यह केवल AFTER को बदलने की अनुमति देने पर काम करता है cmd.exe- इसके लिए रीड एंड एक्सक्यूट जोड़ें IUSR_YOURMACHINE(मैं इनकार भी लिखता हूं)।


7

ज़रूर, windowsआप के लिए उपयोग कर सकते हैं:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);

ध्यान दें:

यदि आपको कोई COMत्रुटि मिलती है , तो अपने एक्सटेंशन को जोड़ें php.iniऔर पुनरारंभ करें apache:

[COM_DOT_NET]
extension=php_com_dotnet.dll

मुझे कोई पता नहीं है लेकिन यह मेरे लिए काम करता है। कृपया किसी को भी समझाएं कि wscript.shell क्या है और यह क्या करता है।
GeekWithGlasses

क्या आप बता सकते हैं कि यह लाइन कोई आउटपुट क्यों नहीं दे रही है? `$ oExec = $ WshShell-> भागो ('C: \ Users \ Shreyash \ Desktop \ phantomjs-2.1.1-windows \ bin \ phantomjs.exe -f C: \ xampp \ h \ _ \ _ \ _ कंपोज़र \ test_0.js', 0) , झूठी); `
GeekWithGlasses

आपको test_0.js पर एक त्रुटि हो सकती है, प्रेत लॉग की जाँच करें।
CONvid19

6

PHP की popenकमांड का उपयोग करें , जैसे:

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));

यह एक बच्चे की प्रक्रिया बनाएगा और स्क्रिप्ट आउटपुट के लिए इंतजार किए बिना पृष्ठभूमि में बहाना होगा।


4
यह बच्चे की प्रक्रिया समाप्त होने का इंतजार करता है। कम से कम विन
मैक्स चेरनोपॉल्स्की

यहां बैकग्राउंडिंग को विंडोज "स्टार्ट" कमांड की मदद से प्राप्त किया जाता है जो आपके द्वारा चलाए जा रहे एक्सई को प्रीफिक्स करता है, यदि आप इसे छोड़ देते हैं तो यह काम नहीं करेगा, और मैं इसे दूसरे ओएस पर काम करने की उम्मीद नहीं करूंगा ... लेकिन यह नहीं है मेरे लिए काम करता है, धन्यवाद! :-)
एंटनी

1

यदि यह एक वेब पेज से दूर है, तो मैं किसी तरह का सिग्नल जेनरेट करने की सलाह देता हूं (किसी डायरेक्टरी में किसी फाइल को छोड़ना, शायद) और क्रोन जॉब के लिए जरूरी काम को पूरा करना। अन्यथा, हम एक अपाचे प्रक्रिया के अंदर pcntl_fork()और exec()अंदर से उपयोग करने के क्षेत्र में आने की संभावना रखते हैं , और यह सिर्फ खराब मोजो है।


1
आपने कहा कि यह एक बुरा मोजो है। क्या आप विस्तृत कर सकते हैं?
मयंक

1

यह काम करेगा लेकिन आपको अपने सर्वर को ओवरलोड नहीं करने के लिए सावधान रहना होगा क्योंकि यह इस फ़ंक्शन को कॉल करने पर हर बार एक नई प्रक्रिया बनाएगा जो पृष्ठभूमि में चलेगा। यदि एक ही समय में केवल एक समवर्ती कॉल है तो यह समाधान कार्य करेगा।

यदि नहीं, तो मैं उदाहरण के लिए beanstalkd / gearman / amazon sqs जैसे संदेश कतार चलाने की सलाह दूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.