HttpClient 增强版
更新提示: 1.增加301、302HTTP重定向 2.增加自定义发送头部 3.修复超时时间 4.增加HTTP_STATUS_CODE属性 5.支持HTTPS 来源地址:http://www.haowei.me/archives/1154.html 无 ?php class HttpClient { private static $context = null; // (resource) Socket
更新提示:
1. 增加 301、302 HTTP 重定向
2. 增加 自定义 发送头部
3. 修复 超时时间
4. 增加 HTTP_STATUS_CODE 属性
5. 支持 HTTPS
来源地址: http://www.haowei.me/archives/1154.html
<?php class HttpClient { private static $context = null; // (resource) Socket stream private $header = null; // (array) Request headers private $headerList = null; // (array) User custom request headers public $buffer = null; // (string) Call buffer public $response = null; // (array) Remote response headers public $request = null; // (string) Request headers private $args = null; // (array) User configure private $attachRedirect = null; // (bool) Tigger HTTP redirect public function __construct($args = null) { if(!is_array($args)) $args = array(); $this->args = $args; $charset = isset($this->args['charset']) ? $this->args['charset'] : 'UTF-8'; if(!empty($this->args['debugging'])) { set_time_limit(0); header('Content-Type: text/plain;charset='. $charset); }else{ header('Content-Type: text/html;charset='. $charset); } if(!isset($this->args['timeout'])) $this->args['timeout'] = 5; $this->args['timeout'] = intval($this->args['timeout']); if(!empty($this->args['redirect'])) $this->attachRedirect = true; $this->headerList = array(); } public static function init(& $instanceof, $args = null) { static $instance; if(!$instance) $instanceof = new self($args); return $instance = $instanceof; } public function setHeader($name, $value) { $this->headerList[$name] = $value; } private function build($args) { list($method, $url, $data, $cookie) = $args; $this->buffer = ''; $this->request = ''; $this->header = array(); $this->response = array(); $userAgent = isset($this->args['userAgent']) ? $this->args['userAgent'] : ( isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : __CLASS__ ); extract($parse = parse_url($url)); $path = isset($query) ? $path .'?'. $query : ( isset($path) ? $path : '/' ); $port = isset($port) ? $port : ( $scheme == 'https' ? 443 : 80 ); $protocol = $scheme == 'https' ? 'ssl://' : 'tcp://'; self::$context = fsockopen($protocol . $host, $port, $errno, $errstr, $this->args['timeout']); if($errno) trigger_error(iconv('GBK//IGNORE', 'UTF-8', $errstr), E_USER_ERROR); stream_set_blocking(self::$context, 1); stream_set_timeout(self::$context, $this->args['timeout']); $query = $data; if($data && is_array($data)) { $query = array(); foreach($data as $k => $value) array_push($query, $k .'='. $value); $query = implode('&', $query); } array_push($this->header, $method .' '. $path .' HTTP/1.1'); array_push($this->header, 'Host: '. $host); array_push($this->header, 'Accept: */*'); array_push($this->header, 'Content-type: application/x-www-form-urlencoded'); array_push($this->header, 'Connection: close'); array_push($this->header, 'User-Agent: '. $userAgent); if($this->headerList) foreach($this->headerList as $name => $value) array_push($this->header, $name .': '. $value); if($cookie) array_push($this->header, 'Cookie: '. $cookie ); if($data) array_push($this->header, 'Content-Length: '. strlen($query)); if($data) array_push($this->header, ''); if($data) array_push($this->header, $query); array_push($this->header, "\r\n"); $this->request = implode("\r\n", $this->header); fputs(self::$context, $this->request); $skipped = false; $this->HTTP_STATUS_CODE = 0; $this->HTTP_TRANSFER_CHUNKED = false; while(!feof(self::$context)) { if(($line = fgets(self::$context))) { if(preg_match('/HTTP\/\d\.\d\s*(\d+)/i', $line, $match)) $this->HTTP_STATUS_CODE = (int) array_pop($match); if(preg_match('/Location:\s*(.+)\s*?/i', $line, $match)) ( ($this->HTTP_REDIRECT_URL = trim(array_pop($match))) && $skipped = !$skipped ); if(preg_match('/Transfer\-Encoding:\s*chunked/i', $line, $match)) $this->HTTP_TRANSFER_CHUNKED = true; if(array_push($this->response, $line) && in_array($line, array("\n", "\r\n"))) break; } } if($this->attachRedirect && $skipped) { fclose(self::$context); $data ? call_user_func_array(array($this, $method), array($this->HTTP_REDIRECT_URL, $data, $cookie)): call_user_func_array(array($this, $method), array($this->HTTP_REDIRECT_URL, $cookie)); } if(!$skipped) { if($this->HTTP_STATUS_CODE === 200) { $this->buffer = ''; $chunksize = 0; $chunked = ''; while(!feof(self::$context)) { $line = fgets(self::$context); if($this->HTTP_TRANSFER_CHUNKED) { if(!$chunksize) { $chunksize = (int) hexdec(trim(ltrim($line, '0'))) + 2; }else{ if(strlen($chunked) < $chunksize){ $chunked .= $line; }else{ $this->buffer .= substr($chunked, 0, $chunksize - 2); $chunksize = (int) hexdec(trim(ltrim($line, '0'))) + 2; $chunked = ''; } } }else{ $this->buffer .= $line; } } } } return (string) $this->buffer; } public function get($url, $cookie = null) { return $this->build(array('GET', $url, null, $cookie)); } public function post($url, $data = null, $cookie = null) { return $this->build(array('POST', $url, $data, $cookie)); } public function __set($attr, $value) { $this->$attr = $value; } public function __destruct() { if(is_resource(self::$context)) fclose(self::$context); unset($this->headerList, $this->header, $this->response, $this->request, $this->args, $this->buffer); } } HttpClient::init($HttpClient, array('userAgent' => $_SERVER['HTTP_USER_AGENT'], 'redirect' => true)); $HttpClient->get('http://www.haowei.me'); echo $HttpClient->buffer;

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Google Chrome でこのタブのコンテンツが共有されているというメッセージが表示された場合はどうすればよいですか? Google Chrome を使用して新しいタブを開くと、このタブのコンテンツが共有されているというメッセージが表示されることがあります。それでは何が起こっているのでしょうか?このサイトでは、このタブのコンテンツの共有を促す Google Chrome の問題についての詳細な紹介をユーザーに提供します。 Google Chrome は、このタブのコンテンツが共有されているというメッセージを表示します。解決策: 1. Google Chrome を開きます。ブラウザの右上隅に 3 つの点が表示されます。「Google Chrome のカスタマイズと制御」アイコンをマウスでクリックして変更します。アイコン。 2. クリックすると、下にGoogle Chromeのメニューウィンドウが表示され、「その他のツール」にマウスが移動します。

Blizzard Battle.net のアップデートが 45% で止まってしまいます。解決するにはどうすればよいですか?最近、ソフトウェア更新時にプログレスバーが 45% で止まってしまうことが多く、何度再起動しても進まないことがありますが、この状況を解決するにはどうすればよいでしょうか? クライアントの再インストール、リージョンの切り替え、ファイルの削除などが考えられます。このソフトウェアチュートリアルでは、より多くの人に役立つことを願って、操作手順を共有します。 Blizzard Battle.net のアップデートが 45% で止まってしまいます、どうすれば解決しますか? 1. クライアント 1. まず、クライアントが公式 Web サイトからダウンロードされた正式バージョンであることを確認する必要があります。 2. そうでない場合、ユーザーはアジアのサーバー Web サイトにアクセスしてダウンロードできます。 3. 入力後、右上隅の「ダウンロード」をクリックします。注: インストール時に簡体字中国語を選択しないようにしてください。

エピックセブンは、2月22日正午にノンストップでアップデートされることが確認されました。このアップデートでは、レイアの限定召喚率の増加やスイートミラクル、謎のアップデートなど、多くの新しいアクティビティやコンテンツが追加されます。カードプール、スペシャルサイドストーリー「ミラクルメイドキングダム」の2週目が始まりましたので、今回のアップデートを紹介していきます。モバイルゲーム更新スケジュール: セブンスエピックは2月22日更新: ミラクルメイドキングダム第2週オープン ※「レイア」「スイートミラクル」の限定召喚確率がアップ! ■限定召喚チャンスアップ時間: ~2024/02/22(木) 11:00 ~ 2024/03/07(木) 10:59 ■キャラクター属性と職業: 自然属性、戦士 ■キャラクター紹介: 4人組バンド・ザ「ミラクルメイドキングダム」のサブボーカル、ベイさん

Angular.js は、動的アプリケーションを作成するための無料でアクセスできる JavaScript プラットフォームです。 HTML の構文をテンプレート言語として拡張することで、アプリケーションのさまざまな側面を迅速かつ明確に表現できます。 Angular.js は、コードの作成、更新、テストに役立つさまざまなツールを提供します。さらに、ルーティングやフォーム管理などの多くの機能も提供します。このガイドでは、Ubuntu24 に Angular をインストールする方法について説明します。まず、Node.js をインストールする必要があります。 Node.js は、ChromeV8 エンジンに基づく JavaScript 実行環境で、サーバー側で JavaScript コードを実行できます。ウブにいるために

「Lantern and Dungeons」は2月29日にアップデートされることが決定しており、アップデート後は「Lantern and Dungeons」のリマスター版が発売され、「ネザの伝説」との連動も予定されている。職業を変更したり、プレイヤーが直接ジョブチェンジしたり、ダンジョンコンテンツも拡張されたり、新たなダンジョンエリアがオープンしたりする予定です。モバイルゲーム更新スケジュール ランタンとダンジョンは2月29日更新:リマスター版╳「ネザの伝説」連動版キーコンテンツ 新しい職業、なぜ転職に誘われるの? 点灯夫って実は転職できるの? こんなカッコいい装備は本当に人を欲張りにする転職後はランタン持ちもカッコいいスキルをたくさん覚えられるそうですよ ゴローさんは「タイパンツは熱い!」と叫んだ。ネザの伝説が集結!天地の輪を手にホットホイールを踏みます♫~知恵と勇気を兼ね備えた小さな英雄、ネザと小さなドラゴンガールがやって来ます

MSI グラフィックス カードは、市場で主流のグラフィックス カード ブランドです。パフォーマンスを実現し、互換性を確保するには、グラフィックス カードにドライバーをインストールする必要があることがわかっています。では、MSI グラフィックス カード ドライバーを最新バージョンに更新するにはどうすればよいでしょうか?通常、MSI グラフィック カード ドライバーは公式 Web サイトからダウンロードしてインストールできます。グラフィックカードドライバーの更新方法: 1. まず、「MSI公式Webサイト」に入ります。 2. 入力後、右上隅の「検索」ボタンをクリックし、グラフィックス カードのモデルを入力します。 3. 次に、対応するグラフィックス カードを見つけて、詳細ページをクリックします。 4. 次に、上の「テクニカル サポート」オプションを入力します。 5.最後に「ドライバーとダウンロード」に進みます。

友人のコンピュータにはこのような障害があり、「この PC」と C ドライブのファイルを開くと、「Explorer.EXE Windows は指定されたデバイス、パス、またはファイルにアクセスできません。プロジェクトにアクセスするための適切な権限がない可能性があります。」と表示されます。フォルダ、ファイル、このコンピュータ、ごみ箱などを含め、ダブルクリックするとこのようなウィンドウが表示されますが、通常は右クリックで開きます。システムのアップデートが原因でこの状況が発生した場合は、以下のエディターで解決方法を説明します。 1. レジストリ エディターを開いて Win+R と入力し、「regedit」と入力するか、スタート メニューを右クリックして実行し、「regedit」と入力します。 2. レジストリ「Computer\HKEY_CLASSES_ROOT\PackagedCom\ClassInd」を見つけます。

Windows アップデートにより、次の問題が発生する可能性があります。 1. 互換性の問題: 一部のアプリケーション、ドライバー、またはハードウェア デバイスは、新しい Windows アップデートと互換性がなく、適切に動作しなかったり、クラッシュしたりする可能性があります。 2. パフォーマンスの問題: Windows アップデートにより、システムが遅くなったり、パフォーマンスが低下したりする場合があります。これは、新機能または改善により、実行するためにより多くのリソースが必要になることが原因である可能性があります。 3. システムの安定性の問題: 一部のユーザーは、Windows 更新プログラムをインストールした後、システムで予期しないクラッシュやブルー スクリーン エラーが発生する可能性があると報告しました。 4. データ損失: まれに、Windows アップデートによりデータ損失やファイル破損が発生する場合があります。このため、重要な更新を行う前に、バックアップを作成してください。
