関数・クラス解説

EventBufferEvent::sslFilter

version:PECL event >= 1.2.6-beta (公式)

Create a new SSL buffer event to send its data over another buffer event

公式リファレンス

書式

public static EventBufferEvent::sslFilter ( EventBase $base , EventBufferEvent $underlying , EventSslContext $ctx , int $state [, int $options = 0 ] ) : EventBufferEvent

説明

Create a new SSL buffer event to send its data over another buffer event

注意:

This function is available only if Event is compiled with OpenSSL support.

パラメータ

base
Associated event base.
underlying
A socket buffer event to use for this SSL.
ctx
Object of EventSslContext class.
state
The current state of SSL connection: EventBufferEvent::SSL_OPEN , EventBufferEvent::SSL_ACCEPTING or EventBufferEvent::SSL_CONNECTING .
options
One or more buffer event options.

返値

Returns a new SSL EventBufferEvent object.

サンプル

例1 Simple SMTP server

<?php /* * Author: Andrew Rose <hello at andrewrose dot co dot uk> * * Usage: * 1) Prepare cert.pem certificate and privkey.pem private key files. * 2) Launch the server script * 3) Open TLS connection, e.g.: *      $ openssl s_client -connect localhost:25 -starttls smtp -crlf * 4) Start testing the commands listed in `cmd` method below. */class Handler {    public $domainName = FALSE;    public $connections = [];    public $buffers = [];    public $maxRead = 256000;    public function __construct() {        $this->ctx = new EventSslContext(EventSslContext::SSLv3_SERVER_METHOD, [            EventSslContext::OPT_LOCAL_CERT  => 'cert.pem',            EventSslContext::OPT_LOCAL_PK    => 'privkey.pem',            //EventSslContext::OPT_PASSPHRASE  => '',            EventSslContext::OPT_VERIFY_PEER => false, // change to true with authentic cert            EventSslContext::OPT_ALLOW_SELF_SIGNED => true // change to false with authentic cert        ]);        $this->base = new EventBase();        if (!$this->base) {            exit("Couldn't open event base\n");        }        if (!$this->listener = new EventListener($this->base,            [$this, 'ev_accept'],            $this->ctx,            EventListener::OPT_CLOSE_ON_FREE | EventListener::OPT_REUSEABLE,            -1,            '0.0.0.0:25'))        {            exit("Couldn't create listener\n");        }        $this->listener->setErrorCallback([$this, 'ev_error']);        $this->base->dispatch();    }    public function ev_accept($listener, $fd, $address, $ctx) {        static $id = 0;        $id += 1;        $this->connections[$id]['clientData'] = '';        $this->connections[$id]['cnx'] = new EventBufferEvent($this->base, $fd,            EventBufferEvent::OPT_CLOSE_ON_FREE);        if (!$this->connections[$id]['cnx']) {            echo "Failed creating buffer\n";            $this->base->exit(NULL);            exit(1);        }        $this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL,            [$this, 'ev_error'], $id);        $this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);        $this->ev_write($id, '220 '.$this->domainName." wazzzap?\r\n");    }    function ev_error($listener, $ctx) {        $errno = EventUtil::getLastSocketErrno();        fprintf(STDERR, "Got an error %d (%s) on the listener. Shutting down.\n",            $errno, EventUtil::getLastSocketError());        if ($errno != 0) {            $this->base->exit(NULL);            exit();        }    }    public function ev_close($id) {        $this->connections[$id]['cnx']->disable(Event::READ | Event::WRITE);        unset($this->connections[$id]);    }    protected function ev_write($id, $string) {        echo 'S('.$id.'): '.$string;        $this->connections[$id]['cnx']->write($string);    }    public function ev_read($buffer, $id) {        while($buffer->input->length > 0) {            $this->connections[$id]['clientData'] .= $buffer->input->read($this->maxRead);            $clientDataLen = strlen($this->connections[$id]['clientData']);            if($this->connections[$id]['clientData'][$clientDataLen-1] == "\n"                && $this->connections[$id]['clientData'][$clientDataLen-2] == "\r")            {                // remove the trailing \r\n                $line = substr($this->connections[$id]['clientData'], 0,                    strlen($this->connections[$id]['clientData']) - 2);                $this->connections[$id]['clientData'] = '';                $this->cmd($buffer, $id, $line);            }        }    }    protected function cmd($buffer, $id, $line) {        switch ($line) {            case strncmp('EHLO ', $line, 4):                $this->ev_write($id, "250-STARTTLS\r\n");                $this->ev_write($id, "250 OK ehlo\r\n");                break;            case strncmp('HELO ', $line, 4):                $this->ev_write($id, "250-STARTTLS\r\n");                $this->ev_write($id, "250 OK helo\r\n");                break;            case strncmp('QUIT', $line, 3):                $this->ev_write($id, "250 OK quit\r\n");                $this->ev_close($id);                break;            case strncmp('STARTTLS', $line, 3):                $this->ev_write($id, "220 Ready to start TLS\r\n");                $this->connections[$id]['cnx'] = EventBufferEvent::sslFilter($this->base,                    $this->connections[$id]['cnx'], $this->ctx,                    EventBufferEvent::SSL_ACCEPTING,                    EventBufferEvent::OPT_CLOSE_ON_FREE);                $this->connections[$id]['cnx']->setCallbacks([$this, "ev_read"], NULL, [$this, 'ev_error'], $id);                $this->connections[$id]['cnx']->enable(Event::READ | Event::WRITE);                break;            default:                echo 'unknown command: '.$line."\n";                break;        }    }}new Handler();

参考

  • EventBufferEvent::sslSocket() - Creates a new SSL buffer event to send its data over an SSL on a socket
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール