fwrite(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry IN PHP
fwrite(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry IN PHP
我在 Whosebug 中遇到了同样的问题并尝试了所有答案但没有帮助。我不知道错误是什么。
这是我正在使用的功能:
function sendRegistryNotification($message, $deviceToken, $deviceType, $batchcount)
{
$message=$message;
$batchcount=$batchcount;
$path=ABSPATH.'api'.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR.'Certificates2.pem';
$deviceType = strtolower($deviceType);
switch ($deviceType) {
case 'ios':
$pemPath = $path; // replace with the path to PEM file
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemPath);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',
$err,
$errstr,
60,
STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
$ctx);
// Create the payload body
$body['aps'] = array(
'badge' => +$batchcount,
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
var_dump($result);
if (!$result)
{
fclose($fp);
return false;
}
else
{
fclose($fp);
return true;
}
break;
case 'android':
$message = array("message" => $message,'title'=> 'eyLog','msgcnt'=>$batchcount);
// Set POST variables
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => array($deviceToken),
'data' => $message,
);
$headers = array(
'Authorization: key='.'AIzaSyDud68-R31c9SPq4dXZblt0JBPi4TBaneQ', // Key For eylog App
'Content-Type: application/json'
);
// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Disabling SSL Certificate support temporarly
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
// Execute post
$result = curl_exec($ch);
//var_dump($result);
if ($result === FALSE) {
// die('Curl failed: ' . curl_error($ch));
}
// Close connection
curl_close($ch);
return TRUE;
break;
}
return true;
}
这是我遇到的错误:
{
"status": "failure",
"uniquediary_id": "14407503971",
"message": "fwrite(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry"
}
我不明白为什么会这样。并且代码只在我的本地主机中的服务器中出现错误,它工作正常
当您尝试写入套接字时。如果出现问题,fwrite 将 return false 或 0(取决于 php 版本)作为 return 值。当它发生时,你必须管理它。
对于上述问题,原因很简单:当SSL_Write returns 与SSL_ERROR_WANT_WRITE 或SSL_ERROR_WANT_READ 时,您必须重复调用SSL_write 在满足条件后再次使用相同的参数(read/write 在套接字上可用)。
使用不同的参数调用它,将产生 1409F07F bad write retry 错误。
感谢您的回复,我在 google 中找到了类似的解决方案,您应该再次写入套接字。在 m 情况下,代码抛出异常,所以我正在管理它。所以现在我是这样做的
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
try {
$result = fwrite($fp, $msg, strlen($msg));
}
catch (Exception $ex) {
// try once again for socket busy error (fwrite(): SSL operation failed with code 1.
// OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING)
sleep(5); //sleep for 5 seconds
$result = fwrite($fp, $msg, strlen($msg));
if ($result)
{
return true;
}
else {
return false;
}
}
现在在大多数情况下不会抛出该错误。我发现当套接字忙时会发生这种情况,所以我现在尝试在 5 秒后再次写入。所以我想这应该不会再来了。它尚未上线,但在我们的测试中,我们没有再次发现此问题。你能建议我朝着正确的方向前进吗?当此代码生效时,将会有大量推送通知,那么在这种情况下它是否可以正常工作,或者您是否有其他解决方案?感谢您的帮助:)
我多次收到此错误。
为了解决它,就在 fwrite()
之前,我添加了一个 sleep(5);
.
现在,每个查询都返回成功。
我在 Whosebug 中遇到了同样的问题并尝试了所有答案但没有帮助。我不知道错误是什么。
这是我正在使用的功能:
function sendRegistryNotification($message, $deviceToken, $deviceType, $batchcount)
{
$message=$message;
$batchcount=$batchcount;
$path=ABSPATH.'api'.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR.'Certificates2.pem';
$deviceType = strtolower($deviceType);
switch ($deviceType) {
case 'ios':
$pemPath = $path; // replace with the path to PEM file
$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', $pemPath);
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195',
$err,
$errstr,
60,
STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,
$ctx);
// Create the payload body
$body['aps'] = array(
'badge' => +$batchcount,
'alert' => $message,
'sound' => 'default'
);
$payload = json_encode($body);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
var_dump($result);
if (!$result)
{
fclose($fp);
return false;
}
else
{
fclose($fp);
return true;
}
break;
case 'android':
$message = array("message" => $message,'title'=> 'eyLog','msgcnt'=>$batchcount);
// Set POST variables
$url = 'https://android.googleapis.com/gcm/send';
$fields = array(
'registration_ids' => array($deviceToken),
'data' => $message,
);
$headers = array(
'Authorization: key='.'AIzaSyDud68-R31c9SPq4dXZblt0JBPi4TBaneQ', // Key For eylog App
'Content-Type: application/json'
);
// Open connection
$ch = curl_init();
// Set the url, number of POST vars, POST data
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Disabling SSL Certificate support temporarly
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
// Execute post
$result = curl_exec($ch);
//var_dump($result);
if ($result === FALSE) {
// die('Curl failed: ' . curl_error($ch));
}
// Close connection
curl_close($ch);
return TRUE;
break;
}
return true;
}
这是我遇到的错误:
{
"status": "failure",
"uniquediary_id": "14407503971",
"message": "fwrite(): SSL operation failed with code 1. OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING:bad write retry"
}
我不明白为什么会这样。并且代码只在我的本地主机中的服务器中出现错误,它工作正常
当您尝试写入套接字时。如果出现问题,fwrite 将 return false 或 0(取决于 php 版本)作为 return 值。当它发生时,你必须管理它。
对于上述问题,原因很简单:当SSL_Write returns 与SSL_ERROR_WANT_WRITE 或SSL_ERROR_WANT_READ 时,您必须重复调用SSL_write 在满足条件后再次使用相同的参数(read/write 在套接字上可用)。
使用不同的参数调用它,将产生 1409F07F bad write retry 错误。
感谢您的回复,我在 google 中找到了类似的解决方案,您应该再次写入套接字。在 m 情况下,代码抛出异常,所以我正在管理它。所以现在我是这样做的
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
try {
$result = fwrite($fp, $msg, strlen($msg));
}
catch (Exception $ex) {
// try once again for socket busy error (fwrite(): SSL operation failed with code 1.
// OpenSSL Error messages:\nerror:1409F07F:SSL routines:SSL3_WRITE_PENDING)
sleep(5); //sleep for 5 seconds
$result = fwrite($fp, $msg, strlen($msg));
if ($result)
{
return true;
}
else {
return false;
}
}
现在在大多数情况下不会抛出该错误。我发现当套接字忙时会发生这种情况,所以我现在尝试在 5 秒后再次写入。所以我想这应该不会再来了。它尚未上线,但在我们的测试中,我们没有再次发现此问题。你能建议我朝着正确的方向前进吗?当此代码生效时,将会有大量推送通知,那么在这种情况下它是否可以正常工作,或者您是否有其他解决方案?感谢您的帮助:)
我多次收到此错误。
为了解决它,就在 fwrite()
之前,我添加了一个 sleep(5);
.
现在,每个查询都返回成功。