Swoole人性化组件库
の PHP 高性能 HTTP クライアントである HTTP Sabre (Da Mao Wang) は、Swoole のネイティブ コルーチンに基づいており、複数のスタイルの操作をサポートし、下部に高性能ソリューションを提供するため、開発者は機能に集中できます。 Curl の同期ブロックや面倒な設定から解放されます。
英語文書
インストールする最良の方法は、Composer パッケージ マネージャーを使用することです。
composer require swlib/saber
Swoole の最下位層はコルーチン スケジューリングを実装しており、開発者は同期コード記述を使用して、意識せずに非同期 IO と超高性能の効果を実現し、個別のコード ロジックを回避できます。従来の非同期コールバックによって過剰なトラップが発生すると、コードが保守不能になります。
onRequet
、 onReceive
、 onConnect
およびその他のイベント コールバック関数で使用するか、 go キーワードでラップする必要があります ( swoole.use_shortname
はデフォルトで有効です)。
go ( function () {
echo SaberGM:: get ( ' http://httpbin.org/get ' );
})
自動データ パッケージ化: 受信データは、content-type で指定されたタイプ形式に自動的に変換されます。
デフォルトは
x-www-form-urlencoded
、json
などの他の形式もサポートされています。
SaberGM
:= Saber Global Manager
クラス名が少し長いと思われる場合は、 class_alias
使用して独自のエイリアスを付けることができ、サービス内でインスタンスを生成するメソッドを使用し、 SaberGM
ショートカットとして使用することをお勧めします。
SaberGM:: get ( ' http://httpbin.org/get ' );
SaberGM:: delete ( ' http://httpbin.org/delete ' );
SaberGM:: post ( ' http://httpbin.org/post ' , [ ' foo ' => ' bar ' ]);
SaberGM:: put ( ' http://httpbin.org/put ' , [ ' foo ' => ' bar ' ]);
SaberGM:: patch ( ' http://httpbin.org/patch ' , [ ' foo ' => ' bar ' ]);
対象となるAPIプロキシサービス
$ saber = Saber:: create ([
' base_uri ' => ' http://httpbin.org ' ,
' headers ' => [
' Accept-Language ' => ' en,zh-CN;q=0.9,zh;q=0.8 ' ,
' Content-Type ' => ContentType:: JSON ,
' DNT ' => ' 1 ' ,
' User-Agent ' => null
]
]);
echo $ saber -> get ( ' /get ' );
echo $ saber -> delete ( ' /delete ' );
echo $ saber -> post ( ' /post ' , [ ' foo ' => ' bar ' ]);
echo $ saber -> patch ( ' /patch ' , [ ' foo ' => ' bar ' ]);
echo $ saber -> put ( ' /put ' , [ ' foo ' => ' bar ' ]);
セッションは Cookie 情報を自動的に保存し、その実装はブラウザー レベルで完了します。
$ session = Saber:: session ([
' base_uri ' => ' http://httpbin.org ' ,
' redirect ' => 0
]);
$ session -> get ( ' /cookies/set?foo=bar&k=v&apple=banana ' );
$ session -> get ( ' /cookies/delete?k ' );
echo $ session -> get ( ' /cookies ' )-> body ;
注: ここでは、同時リダイレクト最適化ソリューションが使用されています。複数のリダイレクトは常に同時実行され、キュー内の単一のリクエストに縮退することはありません。
$ responses = SaberGM:: requests ([
[ ' uri ' => ' http://github.com/ ' ],
[ ' uri ' => ' http://github.com/ ' ],
[ ' uri ' => ' https://github.com/ ' ]
]);
echo " multi-requests [ { $ responses -> success_num } ok, { $ responses -> error_num } error ]: n" . " consuming-time: { $ responses -> time } s n" ;
// multi - requests [ 3 ok , 0 error ] :
// consuming - time : 0 . 79090881347656s
// 别名机制可以省略参数书写参数名
$ saber = Saber:: create ([ ' base_uri ' => ' http://httpbin.org ' ]);
echo $ saber -> requests ([
[ ' get ' , ' /get ' ],
[ ' post ' , ' /post ' ],
[ ' patch ' , ' /patch ' ],
[ ' put ' , ' /put ' ],
[ ' delete ' , ' /delete ' ]
]);
現在、 json
、 xml
、 html
、およびurl-query
[ $ json , $ xml , $ html ] = SaberGM:: list ([
' uri ' => [
' http://httpbin.org/get ' ,
' http://www.w3school.com.cn/example/xmle/note.xml ' ,
' http://httpbin.org/html '
]
]);
var_dump ( $ json -> getParsedJsonArray ());
var_dump ( $ json -> getParsedJsonObject ());
var_dump ( $ xml -> getParsedXmlArray ());
var_dump ( $ xml -> getParsedXmlObject ( true ));
var_dump ( $ html -> getParsedDomObject ()-> getElementsByTagName ( ' h1 ' )-> item ( 0 )-> textContent );
HTTP および SOCKS5 プロキシをサポート
$ uri = ' http://myip.ipip.net/ ' ;
echo SaberGM:: get ( $ uri , [ ' proxy ' => ' http://127.0.0.1:1087 ' ])-> body ;
echo SaberGM:: get ( $ uri , [ ' proxy ' => ' socks5://127.0.0.1:1086 ' ])-> body ;
基礎となる自動コルーチン スケジューリングは、非常に大きなファイルの非同期送信をサポートし、ブレークポイントでアップロードを再開できます。
3 つのファイルを同時にアップロードします (3 つのパラメーター スタイル
string
|array
|object
)
$ file1 = __DIR__ . ' /black.png ' ;
$ file2 = [
' path ' => __DIR__ . ' /black.png ' ,
' name ' => ' white.png ' ,
' type ' => ContentType:: MAP [ ' png ' ],
' offset ' => null , // re - upload from break
' size ' => null //upload a part of the file
];
$ file3 = new SwUploadFile (
__DIR__ . ' /black.png ' ,
' white.png ' ,
ContentType:: MAP [ ' png ' ]
);
echo SaberGM:: post ( ' http://httpbin.org/post ' , null , [
' files ' => [
' image1 ' => $ file1 ,
' image2 ' => $ file2 ,
' image3 ' => $ file3
]
]
);
ダウンロードは、データを受信した後、メモリ内で HttpBody を結合するのではなく、非同期でディスクに直接書き込みます。そのため、ダウンロードは、非常に大きなファイルのダウンロードを完了するために少量のメモリのみを使用します。また、ブレークポイントによるダウンロードの再開もサポートしています。ブレークポイントのダウンロードを実行するためのオフセット パラメーターの設定。
セイバー壁紙の非同期ダウンロード
$ download_dir = ' /tmp/saber.jpg ' ;
$ response = SaberGM:: download (
' https://ws1.sinaimg.cn/large/006DQdzWly1fsr8jt2botj31hc0wxqfs.jpg ' ,
$ download_dir
);
if ( $ response -> success ) {
exec ( ' open ' . $ download_dir );
}
クローラー プロジェクトでは、セッションの有効期限が切れた後に再度ログインするなど、失敗したリクエストを自動的に再試行することが非常に一般的な要件です。
Saber
はこの機能が組み込まれており、拦截器
使用してそれを強化できます。
retry_time
が設定されていないが、 retry
インターセプタが設定されている場合、 retry_time
1 に設定されます。 retry
インターセプタのコールバック メソッドがfalse
を返す場合、 retry_time
がどのような値であっても、 false
が返された時点で再試行は終了します。
$ uri = ' http://eu.httpbin.org/basic-auth/foo/bar ' ;
$ res = SaberGM:: get (
$ uri , [
' exception_report ' => 0 ,
' retry_time ' => 3 ,
' retry ' => function ( Saber Request $ request ) {
echo " retry... n" ;
$ request -> withBasicAuth ( ' foo ' , ' bar ' ); //发现失败后添加验证信息
if ( ' i don not want to retry again ' ) {
return false ; // shutdown
}
}
]
);
echo $ res ;
HTTP リソースは常に変更されるわけではありません。Sabre Saber
キャッシュ ロジック (CURD またはファイルの読み取りと書き込み) を独自に維持することなく、変更されないリソースをキャッシュする方法を学習できます。 Saber
は Swoole と強く関連しているため、いずれにせよサーバーをブロックしませんが、キャッシュには内存/文件/数据库
などのメソッドを使用できるため、まだ実装されていませんが、 Saber
に含まれる予定です。のその後のロードマップ。
$ bufferStream = new BufferStream ();
$ bufferStream -> write ( json_encode ([ ' foo ' => ' bar ' ]));
$ response = SaberGM:: psr ()
-> withMethod ( ' POST ' )
-> withUri ( new Uri ( ' http://httpbin.org/post?foo=bar ' ))
-> withQueryParams ([ ' foo ' => ' option is higher-level than uri ' ])
-> withHeader ( ' content-type ' , ContentType:: JSON )
-> withBody ( $ bufferStream )
-> exec ()-> recv ();
echo $ response -> getBody ();
websocketFrame データ フレームの __toString メソッドを通じて、返されたデータ文字列を直接出力できます。
$ websocket = SaberGM:: websocket ( ' ws://127.0.0.1:9999 ' );
while ( true ) {
echo $ websocket -> recv ( 1 ) . "n" ;
$ websocket -> push ( " hello " );
co:: sleep ( 1 );
}
テスト マシンは最も低い構成の MacBook Pro で、リクエスト サーバーはローカルのエコー サーバーです。
0.9 秒で 6666 件のリクエストを完了し、成功率は 100% でした。
co:: set ([ ' max_coroutine ' => 8191 ]);
go ( function () {
$ requests = [];
for ( $ i = 6666 ; $ i --;) {
$ requests [] = [ ' uri ' => ' http://127.0.0.1 ' ];
}
$ res = SaberGM:: requests ( $ requests );
echo " use { $ res -> time } s n" ;
echo " success: $ res -> success_num , error: $ res -> error_num " ;
});
// on MacOS
// use 0 . 91531705856323s
// success : 6666 , error : 0
実際のプロジェクトでは、リクエストの構成に URL リストがよく使用されるため、便宜上 list メソッドが提供されています。
echo SaberGM:: list ([
' uri ' => [
' https://www.qq.com/ ' ,
' https://www.baidu.com/ ' ,
' https://www.swoole.com/ ' ,
' http://httpbin.org/ '
]
]);
実際のクローラー プロジェクトでは、サーバーのファイアウォールによってブロックされないように単一の同時リクエストの数を制限する必要があることがよくありますが、 max_co
パラメーターを使用するとmax_co
上限に従ってリクエストをバッチでキューにプッシュすることでこの問題を簡単に解決できます。パッケージを受信して実行します。
// max_co is the max number of concurrency request once , it ' s very useful to prevent server - waf limit .
$ requests = array_fill ( 0 , 10 , [ ' uri ' => ' https://www.qq.com/ ' ]);
echo SaberGM:: requests ( $ requests , [ ' max_co ' => 5 ])-> time . "n" ;
echo SaberGM:: requests ( $ requests , [ ' max_co ' => 1 ])-> time . "n" ;
メモリ常駐サーバーで使用する場合は、必ず接続プール オプションを手動で有効にしてください。
$ swoole = Saber:: create ([
' base_uri ' => ' https://www.swoole.com/ ' ,
' use_pool ' => true
]);
このインスタンスを通じて使用すると、接続プール機能が有効になります。つまり、 www.swoole.com
Web サイトとの基盤となる接続クライアントは、グローバル接続プールを使用してアクセスし、使用するたびに作成/接続するオーバーヘッドを回避します。 。
パラメータがtrue
の場合、Web サイトの接続プール容量は無制限ですが、通常は問題なく、容量が無制限の接続プールの方がパフォーマンスが高くなります。
ただし、クローラー プロキシ サービスとして使用し、大量のリクエストが発生すると、接続プール内のクライアントの数が制御不能かつ急速に増加し、その時点でリクエストしたソース Web サイトで許可されている最大接続数を超えることもあります。このとき、接続プールで作成されたクライアントの数がそれをuse_pool
て足りない場合、最下位層はChannelを接続プールとして使用します。クライアントにアクセスする必要があるものは一時停止されます。そして、クライアントを使用しているコルーチンがクライアントを返すのを待ちます。コルーチンの待機と切り替えによるパフォーマンスの消費はほとんどなく、非常に高度なソリューションです。
接続プールは服务器IP+端口
にバインドされていることに注意してください。つまり、同じ服务器IP+端口
に面する複数のインスタンスがある場合、それらの間で使用される接続プールも同じになります。
したがって、服务器IP+端口
のインスタンスを繰り返し作成すると、新しく作成されたインスタンスによって指定されたuse_pool
以前の値を上書きできます。つまり、接続プールの最下層の容量が増加すると、その容量が自動的に変更されます。最下位層は新しい接続プールを再作成し、顧客を転送します。容量が減少すると、接続プール内の余分なクライアントも破棄されます。
接続プールを忘れずに構成することに加えて、例外処理の方法もプログラミングの習慣に合わせる必要があります。Sabre のSaber
の例外処理は最も主流で厳密な抛出异常
ですが、 Saber
错误码
のサイレント使用もサポートしています。错误码
と状态位
、多くの人の好みに合うかもしれません。
SaberGM:: exceptionReport ( 0 ); // 关闭抛出异常报告, 在业务代码之前注册即可全局生效
$ saber -> exceptionReport ( 0 ); //也可以单独设置某个实例
同様に、 onWorkerStart
などのビジネス コードの前、またはswoole_server
が開始される前でも、必要な構成を事前に構成できます。
SaberGM:: default ([
' exception_report ' => 0
' use_pool ' => true
]);
このように希望のオプションを構成すると、エクスペリエンスが向上します。
go ( function (){
// your code with pool ...
saber_pool_release (); // and this script will exit
});
ワンタイムスクリプトで接続プールを使用する場合、コルーチンクライアントがプール内に存在するため、参照カウントが 1 となり解放できなくなり、swoole が常にイベントループ内に存在し、スクリプトが終了できなくなります。通常終了するにはsaber_pool_release
またはsaber_exit
またはswoole_event_exit
を手動で呼び出す必要があります。または、exit を使用して現在のスクリプトを強制終了することもできます (サーバーで exit は使用しないでください)。
|
記号は複数のオプションの値を区切ります
鍵 | タイプ | 導入 | 例 | 述べる |
---|---|---|---|---|
プロトコルのバージョン | 弦 | HTTPプロトコルのバージョン | 1.1 | HTTP2 はまだ計画中です |
Base_uri | 弦 | ベースパス | http://httpbin.org | rfc3986に従ってuriとマージされます |
ウリ | 弦 | リソース識別子 | http://httpbin.org/get get /get | 絶対パスと相対パスの両方を使用できます |
uri_query | 文字列|配列 | 情報を要求する | ['foo' => 'bar'] | 文字列以外は自動的に変換されます |
方法 | 弦 | リクエスト方法 | get delete head patch put post | 最下層は自動的に大文字に変換されます |
ヘッダー | 配列 | リクエストヘッダー | ['DNT' => '1'] | ['accept' => ['text/html'], ['application/xml']] | フィールド名は大文字と小文字を区別しませんが、設定時の元の大文字と小文字の規則は保持され、基になる各フィールド値は PSR-7 に従って自動的に配列に分割されます。 |
クッキー | array | string | ['foo '=> 'bar'] | 'foo=bar; foz=baz' | 最下層は自動的に Cookie オブジェクトに変換され、そのドメインはブラウザ レベルの完全な属性を備えた現在の URI に設定されます。 | |
ユーザーエージェント | 弦 | ユーザーエージェント | curl-1.0 | デフォルトは macos プラットフォームの chrome です |
リファラー | 弦 | 送信元アドレス | https://www.google.com | デフォルトは空です |
リダイレクト | 整数 | リダイレクトの最大数 | 5 | デフォルトは 3 で、0 の場合はリダイレクトは行われません。 |
キープアライブ | ブール | 接続を維持するかどうか | true | false | デフォルトは true で、接続はリダイレクト中に自動的に再利用されます。 |
コンテンツタイプ | 弦 | 送信されたコンテンツのエンコーディング タイプ | text/plain | SwlibHttpContentType::JSON | デフォルトは application/x-www-form-urlencoded です |
データ | array | string | 送信されたデータ | 'foo=bar&dog=cat' | ['foo' => 'bar'] | データは content_type に基づいて自動的にエンコードされます |
前に | callable array | | 事前リクエストインターセプター | function(Request $request){} | 詳細については、「インターセプター」セクションを参照してください。 |
後 | callable array | | 応答後のインターセプター | function(Response $response){} | 詳細については、「インターセプター」セクションを参照してください。 |
before_redirect | callable array | | リダイレクト後のインターセプター | function(Request $request, Response $response){} | 詳細については、「インターセプター」セクションを参照してください。 |
タイムアウト | フロート | タイムアウト | 0.5 | デフォルトは 5 秒で、ミリ秒のタイムアウトをサポートします |
バインドアドレス | 弦 | バインドアドレス | 192.168.1.1 または eth0 | デフォルトでは設定されていません |
バインドポート | 整数 | バインドポート | 80 | デフォルトでは設定されていません |
プロキシ | 弦 | 演技 | http://127.0.0.1:1087 | socks5://127.0.0.1:1087 | http と Socks5 をサポート |
SSL | 整数 | ssl接続を有効にするかどうか | 0=关闭 1=开启 2=自动 | デフォルトの自動 |
カフィレ | 弦 | caファイル | __DIR__ . '/cacert.pem' | デフォルトで付属 |
ssl_verify_peer | ブール | サーバー側の証明書を検証する | false true | デフォルトではオフ |
ssl_allow_self_signed | ブール | 自己署名証明書を許可する | true | false | デフォルトで許可されています |
ssl_cert_file | 弦 | 証明書 | __DIR__ . '/ssl.cert' | デフォルトでは設定されていません |
ssl_key_file | 弦 | 鍵の秘密鍵 | __DIR__ . '/ssl.key' | デフォルトでは設定されていません |
アイコンv | 配列 | エンコード変換を指定する | ['gbk', 'utf-8'] | from,to,use_mb 合計 3 つのパラメーターがあり、これらはデフォルトで自動的に認識されます。 |
例外レポート | 整数 | 例外レポートレベル | HttpExceptionMask::E_ALL | デフォルトですべての例外を報告する |
例外ハンドル | 呼び出し可能|配列 | 例外カスタムハンドリング機能 | function(Exception $e){} | 関数が true を返す場合、エラーは無視できます。 |
リトライ | 呼び出し可能 | 自動再試行インターセプター | function(Request $request, Response $response){} | エラー発生後、再試行前 |
再試行時間 | 整数 | 自動再試行回数 | デフォルトでは再試行しません | |
use_pool | ブール|int | 接続プール | true | false |
プールキー | 呼び出し可能|配列 | 接続プールキー | function(Request $request):string { return $key; } | デフォルトは、要求されたアドレスのhost:port です。 |
使いやすさと耐障害性のために、構成アイテムのキー値にはエイリアス メカニズムがあり、できるだけ元の名前を使用することをお勧めします。
鍵 | エイリアス |
---|---|
方法 | 0 |
ウリ | 1 | url |
データ | 2 | body |
Base_uri | ベースURL |
後 | 折り返し電話 |
コンテンツタイプ | content-type | contentType |
クッキー | クッキー |
ヘッダー | ヘッダ |
リダイレクト | フォローする |
ユーザーエージェント | ua user-agent |
例外レポート | error_report report | |
before_retry | リトライ |
リファラー | referrer ref |
インターセプターは Saber の非常に強力な機能で、開発ログの出力など、さまざまな処理を非常に便利に行うことができます。
SaberGM:: get ( ' http://twosee.cn/ ' , [
' before ' => function ( Saber Request $ request ) {
$ uri = $ request -> getUri ();
echo " log: request $ uri now... n" ;
},
' after ' => function ( Saber Response $ response ) {
if ( $ response -> success ) {
echo " log: success! n" ;
} else {
echo " log: failed n" ;
}
echo " use { $ response -> time } s " ;
}
]);
// log : request http : // twosee . cn / now...
// log : success !
// use 0 . 52036285400391s
异常自定义处理函数
や会话
もインターセプターを通じて実装されます。
登録された順序で実行されるインターセプターは複数存在することができ、インターセプターに という名前を付けることができます。このインターセプターを削除したい場合は、それを配列でラップしてキー値を指定するだけです。ヌル値。
[
' after ' => [
' interceptor_new ' => function (){},
' interceptor_old ' => null
]
]
インターセプターは 4 つの方法 (4 つの PHP コールバック関数) で登録できます。
callable: function (){}
string: ' function_name '
string: ' ClassName::method_name '
array: [ $ object , ' method_name ' ]
Cookie の実装はブラウザ レベルで完了します。これは特に Chrome ブラウザの実装を指し、その関連ルールに従います。
Cookie は Cookie のコレクションであり、各 Cookie には次のプロパティがあります。
name
、 value
、 expires
、 path
、 session
、 secure
、 httponly
、 hostonly
また、Cookies クラスは、次のような複数の形式の変換をサポートしています。
foo=bar; foz=baz; apple=banana
Set-Cookie: logged_in=no; domain=.github.com; path=/; expires=Tue, 06 Apr 2038 00:00:00 -0000; secure; HttpOnly
['foo'=>'bar', 'foz'=>'baz']
形式が Cookie クラスに転送されるか、Cookie クラスがこれらの形式にシリアル化されるまで待ちます。
Cookie は、情報を失うことなくドメイン名と期限の検証もサポートします。たとえば、ドメインがgithub.com
の場合、ドメインが hostonly ( .github.com
ワイルドカード) でない限り、Cookie はhelp.github.com
に表示されません。
セッション Cookie (有効期限がなく、ブラウザを閉じると期限切れになる) の場合、expires 属性は現在時刻に設定され、 interceptorを通じて特定の時刻を設定できます。
Cookie の生の属性を読み取ることで、それをデータベースに簡単に保存でき、ログイン クローラー アプリケーションに非常に適しています。
詳細については、Swlib/Http ライブラリのドキュメントと例を参照してください。
Sabre は、ビジネスとエラーを分離するルールに従います。リクエストの一部が失敗すると、デフォルトで例外がスローされます。
強力なのは、Sabre の例外処理も多様であり、PHP のネイティブ例外処理と同じくらい完全であることです。
例外の名前空間はSwlibHttpException
にあります。
例外 | イントロ | シーン |
---|---|---|
リクエスト例外 | リクエストが失敗しました | リクエスト構成エラー |
接続例外 | 接続に失敗しました | ネットワーク接続がない、DNS クエリが失敗する、タイムアウトなどが発生した場合、errno の値は Linux errno と同じになります。 swoole_strerror を使用して、エラー コードをエラー メッセージに変換できます。 |
TooManyRedirectsException | リダイレクト数を超えました | リダイレクトの数が設定された制限を超えているため、スローされた例外によってリダイレクト追跡情報が出力されます。 |
クライアント例外 | クライアント例外 | サーバーが 4xx エラー コードを返しました |
サーバー例外 | サーバー例外 | サーバーが 5xx エラー コードを返しました |
BadResponseException | 不明な応答の取得に失敗しました | サーバーが応答しなかったか、認識できないエラー コードを返しました。 |
一般的な例外メソッドに加えて、すべての HTTP 例外クラスには次のメソッドもあります。
方法 | イントロ |
---|---|
getRequest | リクエストインスタンスの取得 |
応答あり | 応答が得られるかどうか |
getResponse | 応答インスタンスの取得 |
getResponseBody概要 | 応答本文の概要コンテンツを取得する |
try {
echo SaberGM:: get ( ' http://httpbin.org/redirect/10 ' );
} catch ( TooManyRedirectsException $ e ) {
var_dump ( $ e -> getCode ());
var_dump ( $ e -> getMessage ());
var_dump ( $ e -> hasResponse ());
echo $ e -> getRedirectsTrace ();
}
// int ( 302)
// string ( 28) "Too many redirects occurred ! "
// bool ( true )
#0 http : // httpbin . org / redirect/10
#1 http : // httpbin . org / relative - redirect/9
#2 http : // httpbin . org / relative - redirect/8
同時に、Sabre は、不安定なネットワーク環境でユーザーがパニックに陥り、すべてのステップで try でコードをラップする必要がないように、穏やかな方法で例外を処理することもサポートしています。
errorReport レベルを設定します。これはグローバルに有効であり、作成されたインスタンスには影響しません。
// 启用所有异常但忽略重定向次数过多异常
SaberGM:: exceptionReport (
HttpExceptionMask:: E_ALL ^ HttpExceptionMask:: E_REDIRECT
);
次の値 (数値または記号) は、報告されるエラー メッセージを指定するビットマスクを作成するために使用されます。ビット単位の演算子を使用して、これらの値を組み合わせたり、特定の種類のエラーをマスクしたりできます。旗とマスク
マスク | 価値 | イントロ |
---|---|---|
E_NONE | 0 | すべての例外を無視する |
E_リクエスト | 1 | RequestExceptionに対応 |
E_CONNECT | 2 | RequestExceptionに対応 |
E_REDIRECT | 4 | RequestExceptionに対応 |
E_BAD_RESPONSE | 8 | BadRExceptionに相当する |
E_クライアント | 16 | ClientExceptionに相当します |
E_サーバー | 32 | ServerExceptionに相当する |
E_ALL | 63 | すべての例外 |
この関数は、HTTP リクエストで生成されたエラーを独自の方法で処理することができ、キャッチ/無視したい例外をより自由に定義できます。
注: 関数がTRUE (または他の true 値) を返さない限り、例外はカスタム関数によってキャッチされずにスローされ続けます。
SaberGM:: exceptionHandle ( function ( Exception $ e ) {
echo get_class ( $ e ) . " is caught! " ;
return true ;
});
SaberGM:: get ( ' http://httpbin.org/redirect/10 ' );
//output : Swlib Http E xceptionTooManyRedirectsException is caught !
ファイルのアップロード | Webソケット | オートパーサー | 自動再試行 | ビッグファイルのダウンロード | キャッシュ | クライアントプール | ランダムUA |
---|---|---|---|---|---|---|---|
4 (高優先度) | 3 | 2 | 1 | .5 | .5 | .5 | .175 |
HTTP/2 の主な利点は、単一の接続内で多くのリクエストを多重化できるため、同時リクエスト数の制限が [ほぼ] 解除されることです。さらに、独自のバックエンドと通信する場合にはそのような制限はありません。バックエンドに HTTP/2 を使用すると、複数の TCP 接続ではなく単一の TCP 接続が使用されるため、状況が悪化するため、HTTP2 は優先されません (#ref)。
このプロジェクトのソース ファイルを IDE のInclude Path
に追加します。
(composer を使用してインストールした場合は、ベンダー フォルダー全体を含めることができ、PHPStorm が自動的にそれを含めます)
適切なコメントの記述により、Sabre は IDE の自動プロンプトを完全にサポートします。オブジェクトの後に矢印記号を書き込むだけで、すべてのオブジェクトのメソッド名が表示されます。これらの名前は、 PSR仕様に従っているか、または を参照して実装されています。 Guzzle プロジェクト (感謝) 。
基礎となる Swoole 関連クラスの IDE プロンプトについては、eaglewu の swoole-ide-helper を導入する必要があります (Composer は開発環境にデフォルトでインストールされます)。ただし、このプロジェクトは手動で保守されており、完全ではありません。 -ide-helper または:
スウールの公式アイデアヘルパー。
問題や PR の送信を歓迎します。
マジック メソッドではコルーチン (__call、__callStatic) を使用できないため、ソース コード内のメソッドは手動で定義されます。
使いやすさを考慮して、サポートされているすべてのリクエスト メソッドにエイリアスが提供されています。
public static function psr( array $ options = []): Swlib Saber Request
public static function wait(): Swlib Saber
public static function request( array $ options = [])
public static function get (string $ uri , array $ options = [])
public static function delete (string $ uri , array $ options = [])
public static function head (string $ uri , array $ options = [])
public static function options (string $ uri , array $ options = [])
public static function post (string $ uri , $ data = null , array $ options = [])
public static function put (string $ uri , $ data = null , array $ options = [])
public static function patch (string $ uri , $ data = null , array $ options = [])
public static function download (string $ uri , string $ dir , int $ offset , array $ options = [])
public static function requests (array $ requests , array $ default_options = []): Swlib Saber ResponseMap
public static function list(array $ options , array $ default_options = []): Swlib Saber ResponseMap
public static function websocket (string $ uri )
public static function default (?array $ options = null ): array
public static function exceptionReport (?int $ level = null ): int
public static function exceptionHandle (callable $ handle ): void
public static function create( array $ options = []): self
public static function session( array $ options = []): self
public static function websocket( string $ uri ): WebSocket
public function request( array $ options )
public function get( string $ uri , array $ options = [])
public function delete( string $ uri , array $ options = [])
public function head( string $ uri , array $ options = [])
public function options( string $ uri , array $ options = [])
public function post( string $ uri , $ data = null , array $ options = [])
public function put( string $ uri , $ data = null , array $ options = [])
public function patch( string $ uri , $ data = null , array $ options = [])
public function download( string $ uri , string $ dir , int $ offset , array $ options = [])
public function requests( array $ requests , array $ default_options = []): ResponseMap
public function list( array $ options , array $ default_options = []): ResponseMap
public function upgrade(? string $ path = null ): WebSocket
public function psr( array $ options = []): Request
public function wait(): self
public function exceptionReport(? int $ level = null ): int
public function exceptionHandle( callable $ handle ): void
public static function getAliasMap(): array
public function setOptions( array $ options = [], ? Swlib Saber Request $ request = null ): self
public static function getDefaultOptions(): array
public static function setDefaultOptions( array $ options = [])
public function getExceptionReport(): int
public function setExceptionReport( int $ level ): self
public function isWaiting(): bool
public function getPool()
public function withPool( $ bool_or_max_size ): self
public function tryToRevertClientToPool( bool $ connect_failed = false )
public function getSSL(): int
public function withSSL( int $ mode = 2 ): self
public function getCAFile(): string
public function withCAFile( string $ ca_file = __DIR__ . ' /cacert.pem ' ): self
public function getSSLCertFile(): string
public function withSSLCertFile( string $ cert_file ): self
public function getSSLKeyFile(): string
public function withSSLKeyFile( string $ key_file ): self
public function withSSLVerifyPeer( bool $ verify_peer = false , ? string $ ssl_host_name = '' ): self
public function withSSLAllowSelfSigned( bool $ allow = true ): self
public function getSSLConf()
public function getKeepAlive()
public function withKeepAlive( bool $ enable ): self
public function withBasicAuth(? string $ username = null , ? string $ password = null ): self
public function withXHR( bool $ enable = true )
public function getProxy(): array
public function withProxy( string $ host , int $ port ): self
public function withSocks5( string $ host , int $ port , ? string $ username , ? string $ password ): self
public function withoutProxy(): self
public function getBindAddress(): ? string
public function withBindAddress( string $ address ): self
public function getBindPort(): ? int
public function withBindPort( int $ port ): self
public function getTimeout(): float
public function withTimeout( float $ timeout ): self
public function getRedirect(): int
public function getName()
public function withName( $ name ): self
public function withRedirect( int $ time ): self
public function isInQueue(): bool
public function withInQueue( bool $ enable ): self
public function getRetryTime(): int
public function withRetryTime( int $ time ): self
public function withAutoIconv( bool $ enable ): self
public function withExpectCharset( string $ source = ' auto ' , string $ target = ' utf-8 ' , bool $ use_mb = false ): self
public function withDownloadDir( string $ dir ): self
public function withDownloadOffset( int $ offset ): self
public function resetClient( $ client )
public function exec()
public function recv()
public function getRequestTarget(): string
public function withRequestTarget( $ requestTarget ): self
public function getMethod(): string
public function withMethod( $ method ): self
public function getUri(): Psr Http Message UriInterface
public function withUri(? Psr Http Message UriInterface $ uri , $ preserveHost = false ): self
public function getCookieParams(): array
public function getCookieParam( string $ name ): string
public function withCookieParam( string $ name , ? string $ value ): self
public function withCookieParams( array $ cookies ): self
public function getQueryParam( string $ name ): string
public function getQueryParams(): array
public function withQueryParam( string $ name , ? string $ value ): self
public function withQueryParams( array $ query ): self
public function getParsedBody(? string $ name = null )
public function withParsedBody( $ data ): self
public function getUploadedFile( string $ name ): Psr Http Message UploadedFileInterface
public function getUploadedFiles(): array
public function withUploadedFile( string $ name , ? Psr Http Message UploadedFileInterface $ uploadedFile ): self
public function withoutUploadedFile( string $ name ): self
public function withUploadedFiles( array $ uploadedFiles ): self
public function __toString()
public function getProtocolVersion(): string
public function withProtocolVersion( $ version ): self
public function hasHeader( $ name ): bool
public function getHeader( $ name ): array
public function getHeaderLine( $ name ): string
public function getHeaders( bool $ implode = false , bool $ ucwords = false ): array
public function getHeadersString( bool $ ucwords = true ): string
public function withHeader( $ raw_name , $ value ): self
public function withHeaders( array $ headers ): self
public function withAddedHeaders( array $ headers ): self
public function withAddedHeader( $ raw_name , $ value ): self
public function withoutHeader( $ name ): self
public function getBody(): Psr Http Message StreamInterface
public function withBody(? Psr Http Message StreamInterface $ body ): self
public function getCookies()
public function setCookie( array $ options ): self
public function unsetCookie( string $ name , string $ path = '' , string $ domain = '' ): self
public function withInterceptor( string $ name , array $ interceptor )
public function withAddedInterceptor( string $ name , array $ functions ): self
public function withoutInterceptor( string $ name ): self
public function callInterceptor( string $ name , $ arguments )
public function getSpecialMark( string $ name = ' default ' )
public function withSpecialMark( $ mark , string $ name = ' default ' ): self
public function isSuccess(): bool
public function getUri(): Psr Http Message UriInterface
public function getTime(): float
public function getRedirectHeaders(): array
public function getStatusCode()
public function withStatus( $ code , $ reasonPhrase = '' )
public function getReasonPhrase()
public function __toString()
public function getProtocolVersion(): string
public function withProtocolVersion( $ version ): self
public function hasHeader( $ name ): bool
public function getHeader( $ name ): array
public function getHeaderLine( $ name ): string
public function getHeaders( bool $ implode = false , bool $ ucwords = false ): array
public function getHeadersString( bool $ ucwords = true ): string
public function withHeader( $ raw_name , $ value ): self
public function withHeaders( array $ headers ): self
public function withAddedHeaders( array $ headers ): self
public function withAddedHeader( $ raw_name , $ value ): self
public function withoutHeader( $ name ): self
public function getBody(): Psr Http Message StreamInterface
public function withBody(? Psr Http Message StreamInterface $ body ): self
public function getCookies()
public function setCookie( array $ options ): self
public function unsetCookie( string $ name , string $ path = '' , string $ domain = '' ): self
public function getSpecialMark( string $ name = ' default ' )
public function withSpecialMark( $ mark , string $ name = ' default ' ): self
public function getParsedJsonArray( bool $ reParse = false ): array
public function getParsedJsonObject( bool $ reParse = false ): object
public function getParsedQueryArray( bool $ reParse = false ): array
public function getParsedXmlArray( bool $ reParse = false ): array
public function getParsedXmlObject( bool $ reParse = false ): SimpleXMLElement
public function getParsedDomObject( bool $ reParse = false ): DOMDocument
public function getDataRegexMatch( string $ regex , $ group = null , int $ fill_size )
public function getDataRegexMatches( string $ regex , int $ flag ): array
public function isExistInData( string $ needle , int $ offset )
public function enqueue( $ request )
public function getMaxConcurrency(): int
public function withMaxConcurrency( int $ num = - 1 ): self
public function recv(): Swlib Saber ResponseMap
public function withInterceptor( string $ name , array $ interceptor )
public function withAddedInterceptor( string $ name , array $ functions ): self
public function withoutInterceptor( string $ name ): self
public function callInterceptor( string $ name , $ arguments )
public $ time = 0.0 ;
public $ status_map = [];
public $ success_map = [];
public $ success_num = 0 ;
public $ error_num = 0 ;
public function offsetSet( $ index , $ response )
public function __toString()
public function withMock( bool $ ssl ): self
public function recv( float $ timeout = - 1 )
public function push( string $ data , int $ opcode = 1 , bool $ finish = true ): bool
public function close(): bool
public $ finish = true ;
public $ opcode = null ;
public $ data = null ;
public function getOpcodeDefinition()
public function getOpcode()
public function getData()
public function __toString()