php - পিএইচপি মধ্যে অ্যাসিঙ্ক্রোনাস শেল exec




asynchronous shell (9)

আপনি পিএইচপি স্ক্রিপ্টটিকে ডেমন বা ক্রোজোজ হিসাবে চালাতে পারেন: #!/usr/bin/php -q Usr #!/usr/bin/php -q

আমি একটি পিএইচপি স্ক্রিপ্ট পেয়েছি যা একটি শেল স্ক্রিপ্ট আহ্বান করা প্রয়োজন কিন্তু আউটপুট সম্পর্কে সব যত্ন না। শেল স্ক্রিপ্টটি বেশ কয়েকটি SOAP কল করে এবং এটি সম্পূর্ণ হওয়ার জন্য ধীরে ধীরে, তাই আমি পিএইচপি অনুরোধটি হ্রাস করতে চাই না যখন এটি উত্তর দেওয়ার জন্য অপেক্ষা করে। প্রকৃতপক্ষে, পিএইচপি অনুরোধটি শেল প্রক্রিয়ার সমাপ্তি ছাড়াই প্রস্থান করতে সক্ষম হওয়া উচিত।

আমি বিভিন্ন exec() , shell_exec() , pcntl_fork() , ইত্যাদি ফাংশনগুলিতে pcntl_fork() , তবে তাদের মধ্যে কেউই ঠিক যা আমি চাই তা অফার করে না। (অথবা, যদি তারা করে, এটা আমার কাছে স্পষ্ট নয়) কোন পরামর্শ?


আমি Symfony প্রক্রিয়া কম্পোনেন্ট এই জন্য দরকারী পাওয়া যায়।

use Symfony\Component\Process\Process;

$process = new Process('ls -lsa');
// ... run process in background
$process->start();

// ... do other things

// ... if you need to wait
$process->wait();

// ... do things after the process has finished

এটি তার GitHub repo কিভাবে কাজ করে দেখুন।


আমি এটা ব্যবহার করেছি ...

/** 
 * Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.  
 * Relies on the PHP_PATH config constant.
 *
 * @param string $filename  file to execute
 * @param string $options   (optional) arguments to pass to file via the command line
 */ 
function asyncInclude($filename, $options = '') {
    exec(PHP_PATH . " -f {$filename} {$options} >> /dev/null &");
}

(যেখানে PHP_PATH একটি সংজ্ঞায়িত সংজ্ঞায়িত define('PHP_PATH', '/opt/bin/php5') বা অনুরূপ)

এটা কমান্ড লাইন মাধ্যমে আর্গুমেন্ট মধ্যে পাস। পিএইচপি তাদের পড়তে, argv


একটি নামযুক্ত ফিরো ব্যবহার করুন।

#!/bin/sh
mkfifo trigger
while true; do
    read < trigger
    long_running_task
done

তারপর যখনই আপনি দীর্ঘ চলমান কাজটি শুরু করতে চান, কেবল একটি নতুন লাইন লিখুন (ট্রিগার ফাইলটিতে অবরোধ মুক্ত নয়।

যতক্ষণ আপনার ইনপুট PIPE_BUF ছোট এবং এটি একটি একক write() ক্রিয়াকলাপ, ততক্ষণ আপনি পিনোতে আর্গুমেন্টগুলি লিখতে পারেন এবং স্ক্রিপ্টে তাদের $REPLY হিসাবে দেখান।


যদি এটি "আউটপুট সম্পর্কে উদ্বিগ্ন না হয়", স্ক্রিপ্টে অ্যাক্সেসটিকে পটভূমিতে এবং ব্যাকগ্রাউন্ডে বলা যাবে না?

- এই পোস্টে @ মন্তব্য করেছেন, আপনি এটি কার্যকর করতে একটি কল যুক্ত করতে পারেন:

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

এটি stdio (first > ) এবং stderr ( 2> ) উভয়কে /dev/null এবং পটভূমিতে চালিত করবে।

একই জিনিস করতে অন্যান্য উপায় আছে, কিন্তু এটি পড়ার সহজতম।

উপরে ডবল পুনঃনির্দেশ একটি বিকল্প:

" &> /dev/null &"

লিনাক্সে আপনি নিম্নলিখিতগুলি করতে পারেন:

$cmd = 'nohup nice -n 10 php -f php/file.php > log/file.log & printf "%u" $!';
$pid = shell_exec($cmd);

এটি কমান্ড প্রম্পট এ কমান্ডটি চালাবে এবং তারপরে পিআইডিটি ফেরত পাঠান যা আপনি এটি নিশ্চিত করতে>> 0 টি চেক করতে পারেন।

এই প্রশ্নটি একই রকম: পিএইচপি কি থ্রেডিং আছে?


সঠিক উপায় (!) এটা করতে হয়

  1. কাঁটাচামচ ()
  2. setsid ()
  3. execve ()

ফর্ক ফর্ক, setid একটি মাস্টার এক হয়ে (বর্তমান কোন পিতা বা মাতা), বর্তমান কলিং কলিং প্রক্রিয়া বলা কল দ্বারা প্রতিস্থাপিত বলুন। যাতে পিতামাতা সন্তানের প্রভাবিত ছাড়া প্রস্থান করতে পারেন।

 $pid=pcntl_fork();
 if($pid==0)
 {
   posix_setsid();
   pcntl_exec($cmd,$args,$_ENV);
   // child becomes the standalone detached process
 }

 // parent's stuff
 exit();

সত্যিই আমার জন্য কাজ যে একমাত্র উপায় ছিল:

shell_exec('./myscript.php | at now & disown')

php-execute-a-background-process কিছু ভাল পরামর্শ আছে। আমি খনি বেশ ভাল মনে হয়, কিন্তু আমি পক্ষপাতী :)







shell