Обратный вызов уведомления о потоке PHP не вызывается - PullRequest
5 голосов
/ 24 августа 2009

Я играл с PHP Streams и экспериментировал, начав писать класс, показанный здесь. Документы PHP немного скудны в этой области, если не сказать больше.

У меня возникают трудности с получением контекста потока для вызова указанного метода обратного вызова. Если я использую функцию типа file_get_contents или fopen для подключения к сокету, вызывается обратный вызов, но если я использую stream_socket_client, это не так.

Полагаю, что так и должно быть, потому что я передаю контекст в stream_socket_client, и если я использую stream_socket_recvfrom, я получаю ту же строку из сокета, что и fgets, возвращаемую.

Соответствующие документы PHP связаны в конце поста.

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

Я также нашел этот несколько связанный отчет об ошибках PHP, но похоже, что отчет был бессмысленным:

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

1 Ответ

5 голосов
/ 24 августа 2009

Похоже, это не поддерживается потоками сокетов с php 5.3.0.

Единственная функция, которую я смог найти, которая вызывает функцию уведомителя (в коде C), это php_stream_notification_notify в main / streams / streams.c. Есть также некоторые # определяет

#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

, которые сводятся к вызову php_stream_notification_notify. Обертка ftp, например звонки

php_stream_notify_info(context, PHP_STREAM_NOTIFY_CONNECT, NULL, 0);

в php_ftp_fopen_connect. То же самое с curl и оболочкой http. Но такого вызова stream_socket_client () или связанных функций нет. И примеры в http://php.net/function.stream-notification-callback не будут работать, если вы замените оболочку протокола на транспорт, такой как tcp: (или даже file:).

...