bangladesh - php full form



পিএইচপি-কিভাবে বর্তমান আমন্ত্রণটি সিএলআই বা ওয়েব সার্ভার থেকে নির্ধারণ করা যায়? (12)

আমার পছন্দের পদ্ধতি:

if (array_key_exists('SHELL', $_ENV)) {
  echo "Console invocation";
}
else {
  echo "HTTP invocation";
}

https://ffff65535.com

আমি নির্ধারণ করতে হবে যে পিএইচপি বর্তমান আহ্বান কমান্ড লাইন (CLI) থেকে বা ওয়েব সার্ভার থেকে (আমার ক্ষেত্রে, apache এ mod_php দিয়ে)।

কোন সুপারিশ পদ্ধতি?


আমি $_SERVER অ্যারের কিছু এন্ট্রি সেট করা হয়েছে কিনা তা পরীক্ষা করার পরামর্শ দেব।

উদাহরণ:

if (isset($_SERVER['REQUEST_METHOD'])) {
        print "HTTP request\n";
} else {
        print "CLI invocation\n";
}

আমি কয়েক বছর ধরে এই ফাংশন ব্যবহার করা হয়েছে

function is_cli()
{
    if ( defined('STDIN') )
    {
        return true;
    }

    if ( php_sapi_name() === 'cli' )
    {
        return true;
    }

    if ( array_key_exists('SHELL', $_ENV) ) {
        return true;
    }

    if ( empty($_SERVER['REMOTE_ADDR']) and !isset($_SERVER['HTTP_USER_AGENT']) and count($_SERVER['argv']) > 0) 
    {
        return true;
    } 

    if ( !array_key_exists('REQUEST_METHOD', $_SERVER) )
    {
        return true;
    }

    return false;
}

আমি চেষ্টা করবো:

echo exec('whoami');

সাধারণত ওয়েব সার্ভারগুলি একটি পৃথক ব্যবহারকারীর নাম অনুযায়ী চালানো হয়, যাতে বলা হয়।


এই প্রশ্নটির সঠিক উত্তরটি এর পিছনে আসল উদ্দেশ্যের উপর নির্ভর করে:

  • এসএপিআই সিদ্ধান্ত নেওয়ার ফ্যাক্টর (ওয়েব-প্রসঙ্গ বা না)?
  • অথবা তথ্য কি 'একটি tty মধ্যে চলমান' হিসাবে ব্যাখ্যা করা হয়?

যদি উত্তর দেওয়া উত্তর এবং লিখিত মন্তব্য কাজ করে এমন একটি সমাধান খুঁজে পেতে যথেষ্ট।

যদি পরবর্তীতে, এখানে প্রদত্ত রেসিপিগুলি যদি ক্রনজোজ হিসাবে চালানো হয় বা অন্য ডেমন থেকে ব্যাকগ্রাউন্ড-কাজ হিসাবে ব্যর্থ হয় তবে সেই ক্ষেত্রে আমি STDIN যদি পরীক্ষা করে STDIN তবে আরো পরীক্ষা করার পরামর্শ দেওয়া হল:

function at_tty() {
    return defined("\STDIN") && posix_isatty(\STDIN);
}

এই সব ক্ষেত্রে হ্যান্ডেল করা উচিত (পিএইচপি-সিজি সহ)

return (php_sapi_name() === 'cli' OR defined('STDIN'));

কিভাবে, অনেক জটিল সমাধান। কেমন ...

if($_SERVER['REQUEST_SCHEME']=="http" or $_SERVER['REQUEST_SCHEME']=="https"){
    // must be browser :)
}

চেষ্টা

isset($_SERVER['REQUEST_METHOD'])

এটি সেট করা হলে, আপনি একটি ব্রাউজারে আছেন।

অন্যথায়, আপনি যদি চেক করতে পারে

isset($_SERVER['argv'])

কিন্তু উইন্ডোজ সিএলআই, আইডিকে সত্য হতে পারে না।


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

/**
* Linebreak function
* @return "/n" if cli, else return <br>
*/
protected static function lb(){

    return (defined('STDIN') || php_sapi_name() === 'cli' || isset($_ENV['SHELL']) ||
    (empty($_SERVER['REMOTE_ADDR']) && !isset($_SERVER['HTTP_USER_AGENT']) && count($_SERVER['argv']) > 0) ||
    !isset($_SERVER['REQUEST_METHOD'])) ? "\n" : "<br>";

}

http://jp2.php.net/manual/en/features.commandline.php মতে, সিএলআই থেকে চলাকালীন কেবলমাত্র সংখ্যার সংখ্যার সেট আছে। এই স্টেশনগুলি STDIN, STDOUT এবং STDERR। এটি ক্লি মোডে থাকলে সেগুলির মধ্যে একটিের জন্য আপনাকে পরীক্ষা করা হবে


php_sapi_name হল ফাংশন যা আপনি ব্যবহার করতে চান কারণ এটি ইন্টারফেসের একটি ছোট হাতের স্ট্রিং প্রদান করে। উপরন্তু, পিএইচপি ধ্রুবক PHP_SAPI

ডকুমেন্টেশন এখানে পাওয়া যাবে: http://php.net/php_sapi_name

উদাহরণস্বরূপ, সিএলআই থেকে পিএইচপি চালানো হচ্ছে কিনা তা নির্ধারণ করতে, আপনি এই ফাংশন ব্যবহার করতে পারেন:

function isCommandLineInterface()
{
    return (php_sapi_name() === 'cli');
}

// Detect CLI calls
define("IS_CLI_CALL",( strcmp(php_sapi_name(),'cli') == 0 ));

if(IS_CLI_CALL){
   //do you stuff here

}




php