<?php
require_once('PEAR.php');
$GLOBALS['Net_EPP_Client_Version'] = '0.0.3';
class Net_EPP_Client {
var $socket;
function connect($host, $port=700, $timeout=1, $ssl=true, $sslcertpath, $sslpassphrase) {
$context = @stream_context_create();
$result = stream_context_set_option($context, 'ssl', 'allow_self_signed', 'true');
$result = stream_context_set_option($context, 'ssl', 'local_cert', $sslcertpath);
$result = stream_context_set_option($context, 'ssl', 'passphrase', $sslpassphrase);
$target = sprintf('%s://%s:%d', ($ssl === true ? 'ssl' : 'tcp'), $host, $port);
if (!$this->socket = @stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context)) {
return new PEAR_Error("Error connecting to $target - $errstr (code $errno)");
} else {
return $this->getFrame();
}
}
function getFrame() {
//stream_set_blocking($this->socket, 1);
//stream_set_timeout($this->socket, 30);
if (@feof($this->socket)) return new PEAR_Error('connection closed by remote server');
//$hdr = @fread($this->socket, 4);
$hdr = @fgets($this->socket, 5);
//print_r($hdr);
//return new PEAR_Error($hdr);
if (empty($hdr) && feof($this->socket)) {
return new PEAR_Error('connection closed by remote server');
} elseif (empty($hdr)) {
//return new PEAR_Error('Error reading from server: '.$php_errormsg);
$php_errormsg = isset($php_errormsg) ? $php_errormsg : "";
return new PEAR_Error('Error reading from server: '. $php_errormsg);
} else {
/*
$unpacked = unpack('N', $hdr);
$answer = fread($this->socket, ($unpacked[1] - 4));
return $answer;
*/
$unpacked = unpack('N', $hdr);
$length = $unpacked[1];
if ($length < 5) {
return new PEAR_Error(sprintf('Got a bad frame header length of %d bytes from server', $length));
} else {
//'|'.fread($this->socket, ($length - 4)).'|'; //not sure why, but this fixed some part here..
//return '<'.fread($this->socket, ($length));
return fread($this->socket, ($length));
}
}
}
function sendFrame($xml) {
fwrite($this->socket, pack('N', (strlen($xml)+4)).$xml);
}
function request($xml) {
$this->sendFrame($xml);
return $this->getFrame();
}
function disconnect() {
return @fclose($this->socket);
}
}
?>
この行からメモリリークが発生するという問題に遭遇しました
return fread($this->socket, ($length));
この行の何が問題なのか教えてください
if(!$this->socket = @stream_socket_client($target, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context))
によって開かれた接続がサーバーによって閉じられなかったという問題を検索しましstream_socket_client()
た。ソケットはサーバーからのデータを保持します。解決策はありますか?別のソフトウェア エンジニアがこの行を置き換えました
return fread($this->socket, ($length));
以下のコードに。彼らは、なぜこのエラーが発生するのか分からないと言いました。
'|'.fread($this->socket, ($length - 4)).'|';
return '<'.fread($this->socket, ($length));
代替ソリューションはありますか?