2009-08-24 12 views
5

Bawiłem się strumieniami PHP i eksperymentowałem, pisząc tutaj pokazaną klasę. Dokumenty PHP są nieco szczupłe w tym obszarze.Odwołanie zwrotne powiadomień o strumieniu PHP nie jest wywoływane

Mam trudny czas na uzyskanie mojego kontekstu strumienia, aby wywołać określoną metodę zwrotną. Jeśli używam funkcji takiej jak file_get_contents lub do połączenia z gniazdem, wywołanie zwrotne jest wywoływane, ale jeśli używam stream_socket_client, to nie.

Zakładam, że powinien, ponieważ przekazuję kontekst do stream_socket_client i jeśli używam stream_socket_recvfrom, otrzymuję ten sam ciąg z powrotem z gniazda, ponieważ fgets powróci.

Odpowiednie dokumenty PHP są połączone na końcu postu.

class IMAP { 

    // Connection Parameters 
    private $host; 
    private $port; 
    private $timeout; 

    // Credentials 
    private $email; 
    private $password; 

    private $client; 
    private $transcript; 

    function __construct($connection, $credentials) { 

     // Set Connection Settings 
     $this->host = $connection['host']; 
     $this->port = $connection['port']; 
     $this->timeout = $connection['timeout']; 

     // Set Credentials 
     $this->email = $credentials['email']; 
     $this->password = $credentials['password']; 

     // Connect to the IMAP server 
     $params = array('notification'=>array($this, 'getLine')); 
     $ctx = stream_context_create(); 
     stream_context_set_params($ctx, $params); 
     $this->client = stream_socket_client("tcp://$this->host:$this->port",$errno, $errstr, $this->timeout, STREAM_CLIENT_CONNECT, $ctx); 
     stream_socket_sendto($this->client, "a001 NOOP\r\n"); 

    } 

    function getLine($notification_code, $severity, $message, $message_code, $bytes_transferred, $bytes_max) { 
     $args = func_get_args(); 
     var_dump($args); 
    } 
} 

$connection = array(
    'host' => 'somehost', 
    'port' => 143, 
    'timeout' => 10 
); 

$credentails = array(
    'email' => 'someemail', 
    'password' => 'somepassword' 
); 

$imap = new IMAP($connection, $credentails); 

?> 

http://us3.php.net/manual/en/function.stream-context-set-params.php http://us3.php.net/manual/en/context.params.php

znalazłem ten nieco powiązany raport PHP bug też, ale wygląda na to sprawozdanie było bezcelowe:

http://bugs.php.net/bug.php?id=42387&edit=1

Odpowiedz

5

Wygląda to nie jest obsługiwany przez strumienie gniazd od wersji 5.3.0.

Jedyną funkcją, jaką mogę znaleźć, która wywołuje funkcję powiadamiającą (w kodzie C) jest php_stream_notification_notify w main/stream/streams.c. Istnieją również pewne #defines , które sprowadzają się do wywołania php_stream_notification_notify. Opakowanie ftp np. dzwoni

php_stream_notify_info(context, PHP_STREAM_NOTIFY_CONNECT, NULL, 0); 

w php_ftp_fopen_connect. To samo dotyczy zwijania i otoki http. Ale nie ma takiego wywołania funkcji stream_socket_client() lub pokrewnych. A przykłady na http://php.net/function.stream-notification-callback nie działają, jeśli zastąpisz opakowanie protokołu transportem takim jak tcp: (lub nawet plikiem :).

+0

Dzięki za informacje. Czy uważasz, że sensowne byłoby wywoływanie zwrotne przez funkcję stream_socket_client()? Może zagram raport o błędzie. – macinjosh

+0

Nie wiem wystarczająco dużo na temat powiadamiających, aby dać ostateczną odpowiedź. Być może są one przeznaczone (z jakiegoś powodu) tylko do pakowania protokołów. Ale przynajmniej php_stream_notify_info i php_stream_notify_error byłyby miłe. – VolkerK

Powiązane problemy