2016-06-17 41 views
25

Tôi gặp sự cố với ổ cắm luồng và SSL trong PHP 5.6. Dường như SSL đang lưu vào bộ đệm. Trong ví dụ dưới đây, lệnh "ehlo" bị bỏ qua (máy chủ không phản hồi). Nhưng khi một thứ khác được gửi sau "ehlo", ví dụ: một dòng mới trong một cuộc gọi khác đến fwrite, máy chủ sẽ gửi phản hồi.Ổ cắm luồng với SSL

$errno = ''; 
$errstr = ''; 
$timeout = 5; 
$streamContext = stream_context_create(); 
$host = 'ssl://smtp.some.server.com:465'; 
$stream = stream_socket_client($host, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $streamContext); 
stream_set_blocking($stream, 1); 
stream_set_timeout($stream, $timeout); 
stream_set_write_buffer($stream, 0); 

$fgets = fgets($stream); 
print_r($fgets); 

fwrite($stream, "ehlo [127.0.0.1]\r\n"); 

$response = ''; 
do { 
    $line = fgets($stream); 
    $response .= $line; 
} while (null !== $line && false !== $line && ' ' != $line{3}); 

print_r($response); 

fclose($stream); 

Tôi đã có một câu trả lời:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready.

(đó là từ print_r đầu tiên).

Nhưng khi sau dòng: fwrite($stream, "ehlo [127.0.0.1]\r\n"); tôi bổ sung thêm ổ cắm viết: fwrite($stream, "\n"); đầu ra là ok:

220 epicserver.net.pl ESMTP IdeaSmtpServer v0.80.2 ready. 
250-epicserver.net.pl Hello ip-166-242.pl [94.183.162.232], pleased to meet you 
250-PIPELINING 
250-ENHANCEDSTATUSCODES 
250-SIZE 
250-8BITMIME 
250-AUTH PLAIN LOGIN 
250-AUTH=PLAIN LOGIN 
250 HELP 

Tôi đã cố gắng sử dụng stunnel để kiểm tra xem nó là một vấn đề wrapper PHP SSL và khi tôi thay đổi $host-$host = 'localhost:110;' (cấu hình stunnel của tôi) mọi thứ hoạt động hoàn hảo (không thêm phương thức đặc biệt fwrite).

Có ai phải đối mặt với vấn đề đó không?

+0

Liệu ví dụ http://swiftmailer.org có cùng một vấn đề? Nếu không, bạn _could_ so sánh việc triển khai đó với máy của bạn. – VolkerK

+0

Có, mã kiểm tra đó được lấy từ việc thực hiện swiftmailer. –

+0

Vì vậy, nếu bạn sử dụng swiftmailer với ssl: //smtp.some.server.com: 465 nó không hoạt động vì nó không hoàn thành việc bắt tay? – VolkerK

Trả lời

1

Thay fgets 1 với mã này, để chắc chắn fgets hiểu chấm dứt dòng một cách chính xác:

$fgets = ''; 
while (is_resource($stream) && !feof($stream)) { 
    $fgets .= fgets($stream); 
} 
Các vấn đề liên quan