我的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";
}
答案 0 :(得分:3)
首先,请记住,一些跨平台问题不是由于缺乏支持,而是你提到的特性,我想到的最糟糕的是目录斜杠的方向。或问题不在于平台,而在于服务器。例如,Apache具有IIS不具备的环境变量,即使它看起来像HTTP级别和TCP / IP级别的内容也将与操作系统无关。
关于那个说明:
如果是我,我会发疯并编写一个脚本来抓取整个扩展名单页面并系统地检查“Windows”的介绍页面,以了解哪些是特殊的或不可用的。但那就是我,我很滑稽。
哦,这里是PHP正在为Windows开发或永远不会开发的库的快速列表:
答案 1 :(得分:2)
我不知道您所要求的网站是否存在,但您可以使用这些方法来了解PHP安装:
get_defined_functions()
- 所有已定义函数的数组get_loaded_extensions()
- 包含所有已编译和加载模块名称的数组get_extension_funcs()
- 包含模块功能名称的数组有点难以说:这可以在Windows上使用,这不是一般的基础,因为通常的功能取决于PHP版本,这对任何操作系统都有同样的影响。
答案 2 :(得分:0)
对于每个函数,调用function_exists,例如
function check_function(function_name)
{
function_exists(function_name) or die(function_name . " missing");
}
check_function("checkdnserr");