কমান্ডটি সম্পূর্ণ হওয়ার অপেক্ষা না করে শেল_এক্সেক ব্যবহার করার কোনও উপায় আছে কি?


95

আমার একটি প্রক্রিয়া নিবিড় কাজ রয়েছে যা আমি পটভূমিতে চালাতে চাই।

ব্যবহারকারী কোনও পৃষ্ঠায় ক্লিক করে, পিএইচপি স্ক্রিপ্টটি চালায় এবং অবশেষে কিছু শর্তের ভিত্তিতে প্রয়োজন হয়, তবে এটি শেল স্ক্রিপ্ট চালাতে হবে, EG:

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

বর্তমানে আমি ব্যবহার shell_exec , কিন্তু এই একটি আউটপুট জন্য অপেক্ষা করতে স্ক্রিপ্টের প্রয়োজন হয়। সেখানে কমান্ড আমি চাই চালানো কোন উপায় আছে কি ছাড়া সম্পূর্ণ করার জন্য এটি জন্য অপেক্ষা?


দ্রষ্টব্য: প্রক্রিয়াটি তাত্ক্ষণিকভাবে শুরু করতে হবে যাতে ক্রোন কোনও বিকল্প নয়।
টফপাল

4
কেবলমাত্র একটি দ্রষ্টব্য নোট: নিশ্চিত করুন যে পৃষ্ঠাটি প্রত্যেকের দ্বারা অ্যাক্সেসযোগ্য হবে না (অনুসন্ধান ইঞ্জিন / প্রতারণামূলক ব্যবহারকারী) এবং আপনি যদি একটি ভাগ করা পরিবেশে থাকেন তবে আপনার সমস্ত স্ক্রিপ্টগুলির (বিশেষত পিএইচপি!) কার্যকর করার সময় সম্ভবত সীমিত। যে কোনও ক্ষেত্রে আপনি 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 &');

নোট করুন এটি স্টডিও এবং স্টাডার থেকেও মুক্তি পেয়েছে।


4
কোন পার্শ্ব প্রতিক্রিয়া। আপনি একদা সিদ্ধান্ত নেন আপনি stdio অথবা আপনার প্রক্রিয়ার দ্বারা stderr আউটপুট বিবেচনা চান stackoverflow.com/questions/45953/...
নার্ভাসভাবে

4
প্রশ্ন: এটি ঠিক আউটপুট ফেলে দিচ্ছে, তাই না? পিএইচপি কি এখনও বাস্তবায়ন চালিয়ে যাওয়ার আগে প্রক্রিয়াটি শেষ হওয়ার জন্য অপেক্ষা করে, বা গুলি চালিয়ে এবং ভুলে যায়?
অ্যালান স্টর্ম

4
হ্যাঁ প্রত্যাখ্যান। হ্যাঁ ফায়ার এবং ভুলে
নার্ভাসভাবে

4
দ্রষ্টব্য: > /dev/null 2>&1 &অন্যান্য উত্তরে যেমন দেখা যায় তা > /dev/null 2>/dev/null &এখানে দেওয়া একটি ক্ষুদ্র রূপ । এটি মূলত "এসটিডিআরআর (2) কে একই জায়গায় STDOUT (& 1) হিসাবে পুনঃনির্দেশ" বলে দিচ্ছে।
রাইমো

4
আমি সাধারণত ইকো by যুক্ত করে স্ক্রিপ্ট চলমান পিআইডি পাই! >> এক্সটেক্ট কমান্ডের শেষে /tmp/pid.txt কিন্তু আউটপুট এবং ত্রুটিটিকে / dev / নালকে রিডাইরেক্ট করে আর কোনও পিড ফাইল নেই: আউটপুটটির জন্য অপেক্ষা না করে আপনারা কেউ কি এক্সিকিউটের মাধ্যমে স্ক্রিপ্টের পিআইডি পেতে পারেন?
hugsbrugs

28

এটি একটি কমান্ড কার্যকর করবে এবং চলমান প্রক্রিয়া থেকে সংযোগ বিচ্ছিন্ন করবে। অবশ্যই এটি আপনার যে কোনও আদেশ হতে পারে। তবে একটি পরীক্ষার জন্য, আপনি ঘুমের (20) কমান্ড দিয়ে পিএইচপি ফাইল তৈরি করতে পারেন।

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

এটা এই শেল_এক্সেক ভাল?
রিয়েলটিবো

হাই, আমি এই shell_exec ব্যবহার ফাংশন চালাতে পারেন ( "nohup / usr / bin / পিএইচপি -f example.com/notifications/sendnotifications_async >, / dev / নাল 2> & 1 &");
ওয়াসিম বশির 12

4
কেন এবং উভয় ? nohup&
বাগম্যানট 123

11

আপনি তাত্ক্ষণিকভাবে ক্লায়েন্টকে আপনার আউটপুট ফিরিয়ে দিতে এবং পরে আপনার পিএইচপি কোডটি প্রক্রিয়া চালিয়ে যেতে পারেন।

আমি দীর্ঘ-প্রতীক্ষিত আজাক্স কলগুলির জন্য এই পদ্ধতিটি ব্যবহার করছি যা ক্লায়েন্টের পক্ষে কোনও প্রভাব ফেলবে না:

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


4
ওপস ... আমি এখানে একটি জম্বি প্রশ্ন জাগছিলাম, আমি বুঝতে পারি নি। তবে এই বিট তথ্য অন্যের পক্ষে উপকারী হতে পারে।
ওয়তুন

4
এই আছে কিছুই shell_exec সঙ্গে কাজ করতে
bugmenot123

8

উইন্ডোজ 2003 এ, অপেক্ষা না করেই অন্য স্ক্রিপ্ট কল করতে, আমি এটি ব্যবহার করেছি:

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

এটি কেবলমাত্র পরিবর্তনের অনুমতি দেওয়ার পরে কাজ করে 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- কে ব্যাখ্যা করুন she শেল কী এবং এটি কী করে।
গিক উইথগ্লাস

আপনি দয়া করে ব্যাখ্যা করতে পারেন কেন এই লাইনটি কোনও আউটপুট দিচ্ছে না? `E oxx = $ WshShell-> চালান ('সি: \ ব্যবহারকারীরা শ্রেয়াশ \ ডেস্কটপ \ ফ্যান্টমজস -২.১.১-উইন্ডোজ \ বিন \ ফ্যান্টমজ.সেক্স -f সি: am xampp \ htdocs \ সুরকার \ test_0.js', 0 , মিথ্যা); `
গিকউইথগ্লাস

টেস্টটি.জেজে আপনার একটি ত্রুটি থাকতে পারে, ফ্যান্টম লগ চেক করুন।
পেড্রো লোবিটো

6

পিএইচপি-র popenকমান্ড ব্যবহার করুন , যেমন:

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

এটি একটি শিশু প্রক্রিয়া তৈরি করবে এবং স্ক্রিপ্ট আউটপুটটির জন্য অপেক্ষা না করে পটভূমিতে উত্তেজিত হবে।


4
এটি শিশু প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করে। কমপক্ষে উইন
ম্যাক্স চেরনোপলস্কি

উইন্ডোজ "স্টার্ট" কমান্ডের সাহায্যে এখানে ব্যাকগ্রাউন্ডিং অর্জন করা হয়েছে যা আপনি চালনা করতে চান এমন পূর্ববর্তীটিকে উপস্থাপন করে, আপনি এটি বাদ দিলে এটি কাজ করবে না এবং আমি এটি অন্য ওএসে কাজ করার আশা করব না ... তবে এটি করে আমার জন্য কাজ করে, ধন্যবাদ! :-)
এন্টনি 15

1

যদি এটি কোনও ওয়েব পৃষ্ঠাটি বন্ধ থাকে তবে আমি কোনও ধরণের সিগন্যাল তৈরি করার পরামর্শ দিচ্ছি (সম্ভবত কোনও ডিরেক্টরিতে একটি ফাইল ফেলে দেওয়া) এবং একটি ক্রোন জব করার কাজটি শেষ করতে হবে। অন্যথায়, আমরা সম্ভবত অ্যাপাচি প্রক্রিয়াটি ব্যবহার করে pcntl_fork()এবং এর exec()ভিতরে নিয়ে যেতে পারি এবং এটি কেবল খারাপ মোজো jo


4
আপনি এটি একটি খারাপ মোজো বলেছিলেন। আপনি দয়া করে বিস্তারিত বলতে পারেন?
মায়াঙ্ক

1

এটি কার্যকর হবে তবে আপনার সার্ভারটি ওভারলোড না করার বিষয়ে আপনাকে সতর্ক থাকতে হবে কারণ আপনি যখনই এই ফাংশনটি কল করবেন তখনই এটি একটি নতুন প্রক্রিয়া তৈরি করবে যা পটভূমিতে চলবে। যদি একই সময়ে কেবলমাত্র একটি সহকারী কল হয় তবে এই কর্মটি কাজটি করবে।

যদি তা না হয় তবে আমি উদাহরণস্বরূপ বিনস্টালকডি / গিয়ারম্যান / অ্যামাজন বর্গের মতো একটি বার্তা সারি চালানোর পরামর্শ দেব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.