哪里可以找到Windows不支持的PHP功能?

时间:2010-01-28 23:08:31

标签: php windows

我的PHP常规开发平台是Linux。我的网站使用红帽服务器,我公司使用红帽和Fedora进行制作,我家里有Ubuntu。我不能幸福。不幸的是,我现在需要花费大量时间在Windows中使用WAMP在PHP中工作。

我说这很不幸,因为我不断发现Linux支持Windows不支持的东西。去年,当我们意识到WAMP使用早期版本的PHP(这已经通过5.3到Windows的端口修复)时,它实际上推迟了一个项目。今天,我刚刚得知checkdnsrr没有移植到Windows,整个pcntl库都不可用。

所以,我的问题是:是否有任何地方告诉我Windows和Linux之间关于PHP的当前差异?

我不是在寻找特性,例如在评论here中找到的特性(虽然这些特别好),而是在Linux下可用的哪些功能不可用。

-----------------------编辑----------------------- -

有两条评论/声明说明在Windows下5.3中存在checkdnsrr。从技术上讲,这是正确的。 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 个答案:

答案 0 :(得分:3)

首先,请记住,一些跨平台问题不是由于缺乏支持,而是你提到的特性,我想到的最糟糕的是目录斜杠的方向。或问题不在于平台,而在于服务器。例如,Apache具有IIS不具备的环境变量,即使它看起来像HTTP级别和TCP / IP级别的内容也将与操作系统无关。

关于那个说明:

  • pcntl基于Unix进程模型,因此它不支持Windows。
  • 从5.3开始,Windows支持checkdnsrr,并且之前存在一个用于在Windows中添加该扩展的程序包。
  • 在PHP.net上有一个Windows-only extensions的列表(COM是那个在没有检查的情况下跳起来的那个),但我的猜测是因为PHP最初是为Unix(或至少POSIX)而设计的85%的网络都在Apache上(我把它编号了),它们并没有那么强烈,但是你应该有一个。

如果是我,我会发疯并编写一个脚本来抓取整个扩展名单页面并系统地检查“Windows”的介绍页面,以了解哪些是特殊的或不可用的。但那就是我,我很滑稽。

哦,这里是PHP正在为Windows开发或永远不会开发的库的快速列表:

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

答案 1 :(得分:2)

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

有点难以说:这可以在Windows上使用,这不是一般的基础,因为通常的功能取决于PHP版本,这对任何操作系统都有同样的影响。

答案 2 :(得分:0)

对于每个函数,调用function_exists,例如

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

check_function("checkdnserr");