我有一些Apache Thrift(v.0.6.1)测试应用程序与perl-server和php-client.
我无法解释的行为:如果我们使用无效参数调用server-method,我们会在服务器输出中看到错误,但php-client会无限期地等待响应.
以下是服务器的来源:
sub new {
my $classname = shift;
my $self = {};
return bless($self,$classname);
}
sub DateToTimestamp
{
my ($self, $date) = @_;
my $result = CommonAPI::DateToTimestamp($date);
return $result;
}
eval {
my $handler = new RPCHandler;
my $processor = new RPCPerformanceTest::RPCPerformanceTestProcessor($handler);
my $serversocket = new Thrift::ServerSocket(9091);
my $forkingserver = new Thrift::ForkingServer($processor, $serversocket);
print "Starting the server...\n";
$forkingserver->serve();
print "done.\n";
}; if ($@) {
if ($@ =~ m/TException/ and exists $@->{message}) {
my $message = $@->{message};
my $code = $@->{code};
my $out = $code . ':' . $message;
die $out;
} else {
die $@;
}
}
Run Code Online (Sandbox Code Playgroud)
和客户:
try {
$socket = new TSocket($server_host, $server_port);
$transport = new TBufferedTransport($socket, 1024, 1024);
$protocol = new TBinaryProtocol($transport);
$client = new RPCPerformanceTestClient($protocol);
$transport->open();
$start = microtime(true);
$result = $client->DateToTimestamp('071/26/2011 01:23:45');
var_dump($result);
} catch (Exception $e) {
echo 'Exception: <b>' . $e->getMessage() . '</b>';
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?这是我的错吗?这是预期的行为吗?
Thrift PHP库有点破碎.您需要手动设置超时例如
$socket = new TSocket('host', 9095);
$socket->setSendTimeout(60000);
$socket->setRecvTimeout(60000)
Run Code Online (Sandbox Code Playgroud)
对于不提供消息长度的协议,这种情况经常发生:客户端发送的数据多于服务器期望的数据,并等待服务器接收数据。服务器接收一些数据,尝试解析它但失败。现在协议的服务器端处于错误状态。如果继续读取数据,可能会阻塞。最有可能的是,服务器端向您发送了一些错误响应,并同时等待客户端接收响应,但这也永远不会发生。
这是我的猜测。恕我直言,最好的策略是为客户端和服务器套接字设置超时。
| 归档时间: |
|
| 查看次数: |
8027 次 |
| 最近记录: |