2

専用の CentOS Linux サーバーで、PHP CLI が機能しなくなりました。CLI を必要とする開発者によって作成されたスクリプトがあり、これらのスクリプトは昨日まで機能していました。同時に発生したもう 1 つの奇妙な点は、/usr/local/bin/ 内の php へのシンボリック リンクが失われたことです。私はそれを作り直しましたが、まだ機能していません。

私の開発者は、このスクリプトをコマンドラインから実行すると機能しないと言います。

<?php
echo 'php_sapi_name()='. php_sapi_name() .'<br />';
if(php_sapi_name() == 'cli' && empty($_SERVER['REMOTE_ADDR'])) {
echo "ENVIRONMENT IS CLI";
} ELSE {
echo "ENVIRONMENT IS NOT CLI";
}
//echo phpinfo();

コマンドラインから返されるものは

php_sapi_name()=cgi-fcgi<br />ENVIRONMENT IS NOT CLI

php -v を実行すると、次の出力が得られます

PHP 5.3.8 (cgi-fcgi) (built: Feb  2 2012 14:48:13)
Copyright (c) 1997-2011 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2010, by Zend Technologies

この問題を回避するためにスクリプトを変更することになりましたが、変更された方法はまだ奇妙です

4

1 に答える 1

0

これを試して:

<?php
class CliCheck
{
    /**
     * Advanced PHP-CLI mode check.
     *
     * @return boolean    Returns true if PHP is running from the CLI or else false.
     *
     * @access public
     * @static
     */
    public static function isCli()
    {
        // If STDIN was not defined and PHP is running as CGI module
        // we can test for the environment variable TERM. This
        // should be a right way how to test the circumstance under
        // what mode PHP is running.
        if(!defined('STDIN') && self::isCgi()) {
            // STDIN was not defined, but if the environment variable TERM
            // is set, it is save to say that PHP is running from CLI.
            if(getenv('TERM')) {
                return true;
            }
            // Now return false, because TERM was not set.
            return false;
        }
        return defined('STDIN');
    }   

    /**
     * Simple PHP-CGI mode check.
     *
     * (DSO = Dynamic Shared Object)
     *
     * @link http://httpd.apache.org/docs/current/dso.html DSO
     * @link http://www.php.net/manual/en/function.php-sapi-name.php PHP_SAPI
     *
     * @return boolean    Returns true if PHP is running as CGI module or else false.
     *
     * @access public
     * @static
     */
    public static function isCgi()
    {
        if (substr(PHP_SAPI, 0, 3) == 'cgi') {
            return true;
        } else {
            return false;
        }
        return false;
    }
}
print "PHP is running ".((CliCheck::isCgi()) ? "as CGI modul " : ((!CliCheck::isCli()) ? "as DSO modul " : ""));
print ((CliCheck::isCli()) ? "from the CLI." : ".");
print "\n";
?>

ソース: http://www.php.net/manual/fr/features.commandline.php#105043

于 2012-08-24T11:03:42.700 に答える