PHP socket fread 响应需要永远
PHP socket fread response takes forever
我想通过 EPP 协议向注册商发送 XML 请求并获得响应,连接成功,但是当我到达 fread($fp)
时,加载需要很长时间。
有没有办法让它更快并得到注册商的回应?
我在 hostbill 插件中使用下面的代码。
/** open socket* */
$fp = fsockopen("tcp://registrarwebsite.com", 700, $errno, $errstr, 200);
stream_set_blocking($fp, true);
stream_context_set_option($fp, 'ssl', 'verify_host', true);
stream_context_set_option($fp, 'ssl', 'verify_peer', true);
stream_context_set_option($fp, 'ssl', 'allow_self_signed', false);
stream_context_set_option($fp, 'ssl', 'local_cert', __DIR__ . '/ma_cert.pem');
stream_context_set_option($fp, 'ssl', 'local_pk', __DIR__ . '/ma_key.pem');
// $secure = stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
// stream_set_blocking($fp, false);
if (!$fp) {
$this->addError('Il y a une erreur dans la connexion: ' . $errno . ' ' . $errstr);
return false;
} else {
$xml = htmlentities($this->prepareXMLRequest($xml));
fwrite($fp, $xml);
$out = fread($fp, 1024);
fclose($fp);
$out1 = htmlentities($fp);
$this->addError('<span style="color: green !important">Connexion se fait avec succes, le code retourné est : </span> ' . $out1);
你的 EPP 实现是错误的(如果服务器支持标准,当然),参见 RFC5734 我引用:
- Data Unit Format
The EPP data unit contains two fields: a 32-bit header that describes
the total length of the data unit, and the EPP XML instance. The
length of the EPP XML instance is determined by subtracting four
octets from the total length of the data unit. A receiver must
successfully read that many octets to retrieve the complete EPP XML
instance before processing the EPP message.
另请注意第 3 节,当您打开 TCP/TLS 连接时,首先发言的是服务器与 <greeting>
,因此作为客户端,您首先需要阅读它,然后发送您的登录。
我想通过 EPP 协议向注册商发送 XML 请求并获得响应,连接成功,但是当我到达 fread($fp)
时,加载需要很长时间。
有没有办法让它更快并得到注册商的回应?
我在 hostbill 插件中使用下面的代码。
/** open socket* */
$fp = fsockopen("tcp://registrarwebsite.com", 700, $errno, $errstr, 200);
stream_set_blocking($fp, true);
stream_context_set_option($fp, 'ssl', 'verify_host', true);
stream_context_set_option($fp, 'ssl', 'verify_peer', true);
stream_context_set_option($fp, 'ssl', 'allow_self_signed', false);
stream_context_set_option($fp, 'ssl', 'local_cert', __DIR__ . '/ma_cert.pem');
stream_context_set_option($fp, 'ssl', 'local_pk', __DIR__ . '/ma_key.pem');
// $secure = stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
// stream_set_blocking($fp, false);
if (!$fp) {
$this->addError('Il y a une erreur dans la connexion: ' . $errno . ' ' . $errstr);
return false;
} else {
$xml = htmlentities($this->prepareXMLRequest($xml));
fwrite($fp, $xml);
$out = fread($fp, 1024);
fclose($fp);
$out1 = htmlentities($fp);
$this->addError('<span style="color: green !important">Connexion se fait avec succes, le code retourné est : </span> ' . $out1);
你的 EPP 实现是错误的(如果服务器支持标准,当然),参见 RFC5734 我引用:
- Data Unit Format
The EPP data unit contains two fields: a 32-bit header that describes the total length of the data unit, and the EPP XML instance. The length of the EPP XML instance is determined by subtracting four octets from the total length of the data unit. A receiver must successfully read that many octets to retrieve the complete EPP XML instance before processing the EPP message.
另请注意第 3 节,当您打开 TCP/TLS 连接时,首先发言的是服务器与 <greeting>
,因此作为客户端,您首先需要阅读它,然后发送您的登录。