我刚刚遇到一个问题,我的ISP似乎拒绝让我使用fsockopen
告诉我它存在安全风险,而且我必须找到一个替代方案,建议我使用perl。
有没有人可以使用perl作为fsockopen替代下面的脚本?
<?php
// fetches server information from minequery.
function fetch_server_info($ip, $port){
$socket = fsockopen($ip, $port, $errno, $errstr, 0.5);
if($socket === false){
return false;
}
fwrite($socket, "QUERY_JSON\n");
$responce = stream_get_contents($socket);
return json_decode($responce, true);
}
?>
答案 0 :(得分:1)
听起来您希望在不使用PHP中的任何套接字函数的情况下将服务器的响应发送到$responce
。如果托管服务提供商启用了shell_exec(),则可以运行外部程序来执行此操作。以下是使用perl的示例:
<?php
// fetches server information from minequery.
function fetch_server_info($ip, $port){
$script = <<<'EOF'
use warnings;
use strict;
use IO::Socket;
die if $#ARGV+1 != 2;
my $ip = $ARGV[0];
my $port = $ARGV[1];
my $sock = IO::Socket::INET->new(PeerAddr => "$ip:$port") or die;
print $sock "QUERY_JSON\n" or die;
local $/ = undef;
print <$sock>;
EOF;
$responce = shell_exec("echo '$script' | perl - $ip $port");
if ($responce == NULL)
return false;
return json_decode($responce, true);
}
$>
或者你可以使用netcat:
<?php
// fetches server information from minequery.
function fetch_server_info($ip, $port){
$responce = shell_exec("echo QUERY_JSON| nc $ip $port");
if ($responce == NULL)
return false;
return json_decode($responce, true);
}
$>