2009-08-24 11 views
5

He estado jugando con PHP Streams y he estado experimentando al comenzar a escribir la clase que se muestra aquí. Los documentos PHP son escasos en esta área, por decir lo menos.Notificación de flujo de PHP Retrollamada no invocada

Me está resultando difícil obtener el contexto de mi secuencia para invocar el método de devolución de llamada especificado. Si utilizo una función como file_get_contents o fopen para conectarme a un socket, se invoca la devolución de llamada, pero si uso stream_socket_client, no.

Supongo que debería hacerlo porque estoy pasando el contexto a stream_socket_client y si uso stream_socket_recvfrom obtengo la misma cadena del socket ya que los fgets volverían.

Los documentos relevantes de PHP están vinculados al final de la publicación.

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

Me encontraron esta de alguna manera relacionado informe de error PHP también, pero parece que el informe era inútil:

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

Respuesta

5

Parece que esto no es apoyado por el socket fluye a partir de php 5.3.0.

La única función que pude encontrar que llama a la función notificador (en el código C) es php_stream_notification_notify en main/streams/streams.c. También hay algunos #defines

#define php_stream_notify_info 
#define php_stream_notify_progress 
#define php_stream_notify_progress_init 
#define php_stream_notify_progress_increment 
#define php_stream_notify_file_size 
#define php_stream_notify_error 

cuales se reducen a una llamada a php_stream_notification_notify. El contenedor ftp, p. llama a

php_stream_notify_info(context, PHP_STREAM_NOTIFY_CONNECT, NULL, 0); 

en php_ftp_fopen_connect. Lo mismo con curl y la envoltura http. Pero no hay tal llamada para stream_socket_client() o funciones relacionadas. Y los ejemplos en http://php.net/function.stream-notification-callback no funcionan si reemplaza el contenedor de protocolo por un transporte como tcp: (o incluso archivo :).

+0

Gracias por la información. ¿Crees que tendría sentido que stream_socket_client() active la devolución de llamada? Tal vez presente un informe de error. – macinjosh

+0

No sé lo suficiente sobre los notificadores para darle una respuesta definitiva. Tal vez están destinados (por alguna razón) solo para las envolturas de protocolo. Pero al menos php_stream_notify_info y php_stream_notify_error serían agradables. – VolkerK

Cuestiones relacionadas