代码之家  ›  专栏  ›  技术社区  ›  cwallenpoole

在哪里可以找到Windows不支持的PHP函数?

  •  11
  • cwallenpoole  · 技术社区  · 15 年前

    我的PHP常规开发平台是Linux。我在我的网站上使用红帽服务器,我的公司使用红帽和软呢帽生产,我在家里有Ubuntu。我真高兴。不幸的是,我现在需要花大量的时间在Windows中使用wamp在PHP中工作。

    我说这很不幸,因为我一直在寻找Linux支持的东西,而Windows不支持。去年,当我们意识到wamp使用了一个早期版本的php时,它实际上延迟了一个项目(这个版本已经被5.3到Windows的端口修复)。今天我才知道 checkdnsrr 没有移植到窗口,整个 pcntl 库不可用。

    所以,我的问题是: 有没有什么地方可以告诉我Windows和Linux在PHP方面的区别?

    我不想找一些特别的东西,比如评论里的那些。 here (虽然这些功能很好),但在Linux下可用的Windows下,哪些功能将不可用。

    ————————————————————编辑————————————————————————————————————————————————————————————————————————————————————————————--

    有两条评论/声明说 校验DNSR 存在于5.3的Windows下。从技术上讲,这是正确的。PHP不会说函数不存在。我不知道这是否适用于所有的安装,或者只是wamp,但是尽管是的,它可能会说它可以工作,但是这个功能并不像Linux那样工作。

    ----------------更新----------------

    看起来这个问题没有一个好的答案,但是我已经找到了一个解决方法,这要归功于下面的一个建议:

    把它放在生产环境中。记住在这上面强制某种形式的安全措施。

     <?php print_r( get_defined_functions() ); ?>
    

    然后在开发环境中运行这个。它将输出所有仅限于本地环境的功能。

    $root = file_get_contents( "<path to server>/available.php" );
    $root = preg_replace( "/\[[0-9]{1,4}\]\s=>\s/", ( '' ), $root );
    $tmp  = '"internal" => array';
    $root = explode( "\n", substr( $root, strpos( $root, $tmp ) + strlen( $tmp ) + 1 ) );
    array_shift( $root );
    array_shift( $root );
    $internal = get_defined_functions();
    $internal = $internal[ "internal" ];
    
    function trim_array( array $root )
    {
        $nroot = array();
        foreach( $root as $key=>$value )
        {
              $value = trim( $value );
              if( !preg_match( "/^[a-zA-Z_]*[aeiouy]+[a-zA-Z0-9_]*$/", $value ) && 
                  !preg_match( "/^[a-zA-Z_]*(md5|crc|n12|str|sqrt|ch[a-z]?r|dl|tnt|ftp|png)[a-zA-Z_]*$/", $value ) )
              {
                    //echo "\n $key ";
              }
              else
              {
                 $nroot[] = $value;
              }
        }
    
        return $nroot;
    }
    
    $root     = trim_array( $root );
    $internal = trim_array( $internal );
    
    $diff = array_values( array_diff( $root, $internal ) );
    foreach( $diff as $key => $fname )
    {
          if( in_array( $fname, $root ) )
          {
                echo "[$key] => $fname <= foreign server only";
          }
          else
          {
                echo "[$key] => $fname <= local";      
          }
          echo "\n";
    }
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Gordon Haim Evgi    15 年前

    我不知道您所要求的站点是否存在,但是您可以使用这些方法来了解有关PHP安装的信息:

    很难说: 这在Windows上可用,但不是一般情况 因为函数通常依赖于PHP版本,这对任何操作系统都有同样的影响。

        2
  •  3
  •   Anthony    15 年前

    首先,请记住,一些跨平台问题不是由于缺乏支持,而是由于您提到的特性,我想到的最糟糕的是目录斜杠的方向。或者问题不在平台上,而在服务器上。例如,Apache有一些环境变量,而IIS却没有,即使它看起来像是HTTP级别的东西,而TCP/IP级别则是操作系统中立的。

    注:

    • PCNTL基于Unix进程模型,因此不支持Windows。
    • 从5.3开始,Windows支持checkdnsrr,并且以前在Windows中存在用于添加该扩展的包。
    • php.net上有一个列表 Windows-only extensions (COM是一个让我头脑发热的东西,但我的猜测是,由于PHP最初是为Unix(或者至少是posix)而设计的,而且85%的Web都在Apache上(我编了这个数字),所以他们并没有那么强烈的抗议,尽管你说应该有一个。

    如果是我,我会发疯,做一个脚本,刮去整个扩展列表页面,系统地让它检查“windows”的介绍页面,了解哪些是特殊的或不可用的。但那是我,我很滑稽。

    哦,下面是一个PHP正在为Windows开发或永远不会开发的库的快速列表:

    http://wiki.php.net/internals/windows/libs

        3
  •  0
  •   James McLeod    15 年前

    对于每个函数,调用函数存在,例如

    function check_function(function_name)
    {
        function_exists(function_name) or die(function_name . " missing");
    }
    
    check_function("checkdnserr");