関数・クラス解説
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();
参考
ワード検索
※入力キーワードが、関数名・説明文・タグに含まれるものを検索関数名アルファベット別
最終更新一覧
●stristr
大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却
●stripslashes
バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く
●stripos
大文字小文字を区別せずに文字列が最初に現れる位置を取得する
●stripcslashes
addcslashes() でクォートされた文字列をアンクォートする
●strip_tags
文字列から HTML と PHP のタグを除去して返却
●strcspn
指定した文字が最初に現れる位置を調べる
●strcoll
ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する
●strcmp
2つの文字列を比較し同じか(あるいは大小)を判定する
●strchr
strstr() のエイリアス
●strcasecmp
2つの文字列を比較(大文字小文字を区別せず同じとみなす)
カテゴリー一覧
PHP の振る舞いの変更
音声フォーマットの操作
認証サービス
コマンドライン関連
圧縮およびアーカイブ
暗号
データベース関連
日付および時刻関連
ファイルシステム
自然言語および文字エンコーディング
画像処理および作成
メール関連
数学
テキスト以外の MIME 型
プロセス制御
その他の基本モジュール
その他のサービス
検索エンジン用の拡張モジュール
サーバー固有のモジュール
セッション関連
テキスト処理
変数・データ型関連
ウェブサービス
Windows 用のモジュール
XML 操作
GUI用の拡張モジュール