2 日前、ステーション B で、スムーズな画質で LOL をプレイするためのコンピューターを組み立てるために 100 元を要求している男を見て、ふと思いました。 100行のコードでそれができるということ(単純) 何かに気づくのは楽しいです。私は主にPHP開発を行っているので、この記事を書いています。
もちろん、PHP (swoole 拡張機能は除く) 自体はネットワーク サーバー プログラミングが得意ではないため、このプロキシは単なるおもちゃであり、日常使用からは少し離れています。安定した信頼性の高い暗号化 (インターネットサーフィンを学習できるように) プロキシを使用したい場合は、これを使用できます: https://github.com/momaer/asocks-go も 100 行のコードで実装可能ですgoを使って。
書いている途中で、PHPのマルチスレッドはまだ難しいことが分かりました。たとえば、接続ごとに新しいスレッドを作成することを考え始めました。ただし、このスレッドは保存する必要があります (たとえば、配列に保存する)。たとえば、公式の例では次のようになります: https://github.com/krakjoe/pthreads/blob/master/examples/SocketServer.phpそれ以外の場合は、 (curl -L 301 を必要とするアドレス) してみると、何が起こるかわかります。
この例では、実際には、実行されていないクライアントが確実に破棄されるように何かを行うことを示していますが、実行されなくなった接続を破棄する方法については説明しません。親切。 $clients をクラスに入れ、そのクラスをスレッド クラスに渡し、スレッド クラスが終了しようとしたときに $clients 内の対応する接続の設定を解除しようとしましたが、無駄でした。次に、以下はスレッド プールを使用して実装されたプロキシです。論理的に言えば、終了時にプールを shut down() する必要があり、監視ソケットもシャットダウンする必要があります。しかし、100 行のコードでは、その必要はありません。 Ctrl + C を押して、オペレーティング システムにリソースを再利用させます。
なぜPHPはネットワークプログラミングが苦手なのでしょうか?まず、stream_socket_XXX 関連の関数を使用しました。ソケット拡張を使用してみてはいかがでしょうか。ソケット拡張機能に問題があるため、https://github.com/krakjoe/pthreads/issues/581 を参照してください。
また、stream_set_timeout は、stream_socket_recvfrom などの高度な操作では機能しません。http://php.net を参照してください。 /manual/ja /function.stream-set-timeout.phpそして、プロキシを作成するときはこれらを考慮する必要があります。たとえば、リモートのターゲット サーバーに接続する場合、タイムアウト制御がないため、スレッド プールが簡単にいっぱいになる可能性があります。 テストの場合は、curl を使用してください。 ちなみに、現在はリモート DNS 解決のみがサポートされています。このおもちゃは、後で Hedou がインターネットへのアクセスを学習できるようにするためです:curl --socks5-hostname 127.0.0.1:1080 http://ip.cn