2009-08-24 7 views
5

Ich habe mit PHP-Streams gespielt und experimentiert, indem ich angefangen habe, die hier gezeigte Klasse zu schreiben. Die PHP-Dokumente sind etwas mager in diesem Bereich, um es gelinde auszudrücken.PHP Stream Notification Callback nicht aufgerufen

Ich habe eine schwierige Zeit mit meinem Stream-Kontext, um die angegebene Callback-Methode aufzurufen. Wenn ich eine Funktion wie file_get_contents oder fopen verwende, um eine Verbindung zu einem Socket herzustellen, wird der Rückruf aufgerufen, aber wenn ich stream_socket_client verwende, tut es das nicht.

Ich nehme an, es sollte, weil ich den Kontext an stream_socket_client übergeben und wenn ich stream_socket_recvfrom verwenden, bekomme ich die gleiche Zeichenfolge zurück aus dem Socket als fgets zurückgeben würde.

Relevante PHP-Dokumente sind am Ende des Posts verknüpft.

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

fand ich diesen etwas entsprechenden Berichts PHP Fehler auch, aber es sieht aus wie der Bericht sinnlos war:

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

Antwort

5

Sieht aus wie dies wird nicht unterstützt Die Socket-Ströme ab PHP 5.3.0.

Die einzige Funktion, die ich finden konnte, dass die Notifier-Funktion (im C-Code) aufgerufen wird, ist php_stream_notification_notify in main/streams/streams.c. Es gibt auch einige #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 

, die auf einen Anruf einkochen php_stream_notification_notify. Die FTP-Hülle, z.B. Anrufe

php_stream_notify_info(context, PHP_STREAM_NOTIFY_CONNECT, NULL, 0); 

in php_ftp_fopen_connect. Gleiches gilt für Curl und den http-Wrapper. Aber es gibt keinen solchen Aufruf für stream_socket_client() oder verwandte Funktionen. Und die Beispiele unter http://php.net/function.stream-notification-callback funktionieren nicht, wenn Sie den Protokollwrapper durch einen Transport wie tcp ersetzen: (oder sogar Datei :).

+0

Danke für die Info. Glauben Sie, dass es sinnvoll wäre, wenn stream_socket_client() den Callback auslöst? Vielleicht werde ich einen Fehlerbericht einreichen. – macinjosh

+0

Ich weiß nicht genug über die Anmelder, um Ihnen eine definitive Antwort zu geben. Vielleicht sind sie (aus irgendeinem Grund) nur für die Protokoll-Wrapper gedacht. Aber zumindest php_stream_notify_info und php_stream_notify_error wäre nett. – VolkerK

Verwandte Themen