【问题标题】:$_SERVER['_'] equivalent on WindowsWindows 上的 $_SERVER['_'] 等效项
【发布时间】:2011-04-05 10:58:41
【问题描述】:

在 Linux 上,$_SERVER["_"] 包含 PHP 解释器可执行文件的路径(例如,/usr/bin/php -r 'echo $_SERVER["_"];' 将打印 /usr/bin/php)。在带有 PHP 5.3 的 Windows XP 上,$_SERVER["_"]NULL

【问题讨论】:

    标签: php windows environment-variables


    【解决方案1】:

    我抛弃了$_SERVER,得到了很多适合任何口味的选择 :)

    array(100) {
    
      ...
    
      ["PHPBIN"]=>
      string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
      ["PHPDIR"]=>
      string(36) "d:\openserver\modules\php\PHP-7-x64\"
      ["PHPRC"]=>
      string(35) "d:\openserver\modules\php\PHP-7-x64"
      ["PHP_BIN"]=>
      string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
      ["PHP_BINARY"]=>
      string(43) "d:\openserver\modules\php\PHP-7-x64\php.exe"
      ["PHP_BINDIR"]=>
      string(36) "d:\openserver\modules\php\PHP-7-x64\"
      ["PHP_DIR"]=>
      string(36) "d:\openserver\modules\php\PHP-7-x64\"
    
      ...
    
    }
    

    【讨论】:

      【解决方案2】:

      这与 PHP 本身无关。定义该环境变量的是shell。 PHP 只是把它捡起来

      例如,见here

      shell设置了一些默认的shell变量; PS2就是其中之一。在 Korn shell 中设置或使用的其他有用的 shell 变量是:

      • _(下划线) -- 当shell执行外部命令时,在新进程的环境中设置为执行命令的路径。在交互使用中,这个参数也在父shell中设置为上一条命令的最后一个单词。
      • ...

      我认为在 Windows 中最好的方法是编写一个内部函数。例如

      PHP_FUNCTION(get_php_path)
      {
          char path[MAX_PATH];
          int result;
      
          if (zend_parse_parameters_none() == FAILURE)
              return;
          
          result = GetModuleFileNameA(NULL, path, MAX_PATH);
      
          if (result == 0)
              RETURN_FALSE;
      
          if (result == MAX_PATH) {
              php_error_docref(NULL TSRMLS_CC, E_WARNING, "Path is too large");
              RETURN_FALSE;
          }
      
          RETURN_STRINGL(path, result, 1);
      }
      

      例子:

      >php -r "echo get_php_path()"; D:\Users\Cataphract\Documents\php-trunk\Debug_TS\php.exe

      【讨论】:

      • 很好地解释了为什么它在 Windows 中不存在。
      • 谢谢。我不知道它是shell的功能。
      【解决方案3】:

      不是找到 php.exe 的真正解决方案,但您可以使用 include_pathextension_dir 并转到应存储 php.exe 的父目录。举个例子:

      echo str_replace('\ext', '', ini_get('extension_dir'));
      

      【讨论】:

        【解决方案4】:

        虽然不完美,但你可以试试这个:

        $_SERVER['phprc'] . 'php.exe'

        这会给你类似的东西

        C:\Program Files\PHP\php.exe

        【讨论】:

        • 有趣,但我在 CLI 模式下没有得到这个变量(Windows 7 上的 PHP 5.3)你确定这不是服务器软件或其他东西设置的环境变量吗?
        • 奇怪,这是一个全新的 CLI 模式安装,我在其中找到了 PHPRC 变量。:/
        • 它似乎是一个环境变量:php.net/manual/en/configuration.php(在注释中)但需要注意的是,它可能在某些安装中仍然可用(但不在我的 xampp lite 上)
        【解决方案5】:

        我假设您指的是在 CLI 模式下运行 PHP。

        我刚刚在 Windows 7 上的 CLI PHP 5.3 中对此进行了测试,实际上似乎无法找出当前脚本正在运行的 PHP 可执行文件($_SERVER["_"] 索引不可用;也没有包含可执行文件路径的其他变量)。

        另外,PHP 手册中的Command Line PHP on Windows 页面对这个问题也没什么可说的。 argvphp_sapi_name() 也不透露任何信息。

        唯一想到的是在调用脚本之前设置环境变量的笨拙解决方法:

        SET PHPEXE=C:\php\bin\php.exe
        c:\php\bin\php.exe -f scriptname.php
        

        然后在 PHP 脚本中:

        $php_exe_path = $_SERVER["PHPEXE"];
        

        不是很好,但我没有更好的主意....

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-14
          • 1970-01-01
          • 2010-09-11
          • 2015-06-22
          相关资源
          最近更新 更多