我该在哪里找到Windows不支持哪些PHP函数的信息?

11

我通常使用Linux作为PHP的开发平台。我的网站使用Red Hat服务器,我的公司生产环境中使用Red Hat和Fedora,而我在家用Ubuntu。我非常满意。不幸的是,我现在被要求在Windows上使用WAMP进行PHP开发,需要花费大量时间。

我认为这很不幸,因为我不断发现Linux支持但Windows不支持的东西。去年,实际上我们因为发现WAMP使用较早版本的PHP(这已通过将5.3移植到Windows解决)而延迟了一个项目。今天,我刚刚得知checkdnsrr未能移植到Windows,而整个pcntl库也不可用。

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

我不是在寻找诸如此处的评论中发现的特殊情况(虽然那些内容也很好),而是想知道在Linux下可用但在Windows下不可用的哪些函数。

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

有两条评论/声明说checkdnsrr在Windows的5.3版本下存在。技术上讲,这是正确的。PHP不会说此函数不存在。我不知道是否适用于所有安装程序或仅限于WAMP,但虽然它可能会说它能工作,但该函数在Windows下无法像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";
}

(附注)checkdnsrr 在 PHP5.3 中已经可用于 Windows。 - Gordon
3个回答

3
首先要记住,一些跨平台问题不是由于缺乏支持而是由于你提到的特殊性,我想到最糟糕的是目录斜杠的方向。或者问题不在于平台而在于服务器。例如,Apache有环境变量,而IIS没有,尽管在HTTP级别和TCP/IP级别的事情似乎应该是操作系统中立的。
关于这一点:
- pcntl基于Unix进程模型,因此它不支持Windows。 - checkdnsrr自5.3版本开始支持Windows,并且以前存在添加该扩展的Windows包。 - PHP.net上有一个仅限Windows的扩展列表(COM是我没有检查就能想到的),但我的猜测是,由于PHP最初是为Unix(或至少是POSIX)设计的,而85%的Web使用Apache(我编造了这个数字),因此没有太多的哀号,尽管你说得对,应该有一个。
如果是我,我会疯狂地编写一个脚本,爬取整个扩展列表页面,并系统地检查介绍页面中的“Windows”以了解哪些扩展是特殊的或不可用的。但这只是我的想法,我很疯狂。
另外,以下是 PHP 正在为 Windows 开发或永远不会开发的库的快速列表:

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


我想,如果你看一下上面发布的解决方案,那基本上就是我所做的。我只是将Gordon的回复与那个想法结合起来了。 - cwallenpoole

2

我不知道是否存在像你询问的这样的网站,但是您可以使用以下方法了解PHP安装情况:

很难确定哪些功能在Windows上可用,哪些不可用,因为这些功能通常取决于PHP版本,并且可能同样影响任何操作系统。


get_loaded_extensions返回的内容和phpinfo()一样吗?还是它包含了不需要更改配置文件的核心扩展? - Anthony
虽然这并不是技术上回答了问题,但它尽可能地接近了答案。 - cwallenpoole

0
对于每个函数,请调用function_exists,例如:
function check_function(function_name)
{
    function_exists(function_name) or die(function_name . " missing");
}

check_function("checkdnserr");

对每个函数都这样做?那不是非常优雅。而且,调用die()意味着如果函数不存在(并且它在一系列不存在的函数中),那么所有其他函数都没有反馈。 - cwallenpoole
同意,两点都是如何处理问题的简单示例。另一方面,我怀疑只有一小部分函数存在问题,因此不需要为调用的所有函数都这样做(尽管如果必要,可以轻松创建一个实用程序来解析PHP并自动创建调用function_exist的新脚本。在实践中,我发现上述方法可行,尽管我的PHP脚本通常不是非常苛刻的。 - James McLeod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接