2010-11-06 46 views
5

Có thể sử dụng socket_create/socket_connect qua SSL ở chế độ không chặn không?Kết nối ổ cắm không chặn qua SSL?

Tôi hiện đang sử dụng \fsockopen() vốn hỗ trợ tiền tố 'ssl: //'. Tuy nhiên, fsockopen() sẽ chặn cho đến khi kết nối được thực hiện. Điều này là không mong muốn trong một kịch bản có thể có khoảng 50 ổ cắm đồng thời đang chờ để được đọc.

Tôi đã tạo tập lệnh thử nghiệm để sử dụng \socket_create(), có thể chuyển sang chế độ không chặn trước khi gọi \socket_connect(). Tuy nhiên, nó dường như không có bất kỳ hỗ trợ cho kết nối SSL (không giống như các wrapper fsockopen()).

Trả lời

3

Câu trả lời sẽ là sử dụng thay vì stream_socket_client bằng cờ STREAM_CLIENT_ASYNC_CONNECT; Tuy nhiên có vẻ là một số lỗi với SSL:

<?php 
$socket = stream_socket_client(
     'ssl://197.136.197.92:443', $errno, $errstr, 
     3, // timeout should be ignored when ASYNC 
     STREAM_CLIENT_ASYNC_CONNECT 
); 
if (!$socket) { 
    echo "errno = ".$errno."\nerrstr = ".$errstr."\n"; 
    exit; 
} 

Trên Linux có vẻ là một vòng lặp vô hạn với:

write(3, "\26\3\1\0o\1\0\0k\3\1L\325w/\337u\343uV\341\365}H\331\21k\313\341Q\f\356\""..., 116) = -1 EAGAIN (Resource temporarily unavailable) 

Trên một số biến thể BSD trên http://codepad.viper-7.com/:

<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: SSL: connection timeout in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: Failed to enable crypto in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
<br /> 
<b>Warning</b>: stream_socket_client() [<a href='function.stream-socket-client'>function.stream-socket-client</a>]: unable to connect to ssl://197.136.197.92:443 (Unknown error) in <b>/tmp/cpQ8Gv7B</b> on line <b>9</b><br /> 
errno = 115 
errstr = 

Xem cũng bug #49295.

+1

'stream_socket_client' hoạt động tốt, cảm ơn. Một vấn đề là không có khả năng phát hiện thời gian chờ trên kết nối không đồng bộ. Tôi đã đăng giải pháp của mình tại đây: http://stackoverflow.com/questions/3333398/php-get-socket-error-string-when-async-connect-fails/4114499#4114499 – CAMason

+0

@Craig Bạn đang sử dụng phiên bản nào? Có thể đã có một lỗi được giới thiệu ở đây gần đây, bởi vì tôi đang gặp phải các vấn đề tôi đã mô tả. – Artefacto

+0

5.3.3 trên Ubuntu. Tôi không thấy bất kỳ cảnh báo nào trong chế độ SSL. – CAMason

Các vấn đề liên quan