ホームページ  >  記事  >  バックエンド開発  >  仮想ホストphpのfsockopen関数を無効にする解決策

仮想ホストphpのfsockopen関数を無効にする解決策

WBOY
WBOYオリジナル
2016-07-25 09:00:09813ブラウズ
  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
コードをコピー

変更後:

  1. $fp = pfsockopen($host, 80, $errno, $errstr, 30);
コードをコピー

2. サーバーが pfsockopen も無効にする場合は、代わりに stream_socket_client などの他の関数を使用します。 ()。注: stream_socket_client() と fsockopen() のパラメータは異なります。 具体的な操作: プログラム内で文字列 fsockopen( を検索し、stream_socket_client( に置き換えます。次に、元の fsockopen 関数のポート パラメーター "80" を削除し、$host に追加します。例は次のとおりです。 修正する前に:

  1. $fp = fsockopen($host, 80, $errno, $errstr, 30);
コードをコピー

変更後

  1. $fp = stream_socket_client($host."80", $errno, $errstr, 30);
コードをコピー

3. PHP バージョンが 5.0 未満の場合、fsockopen は無効になります。そして、「stream_socket_client()をどうするか?」はありません。 fsockopen の関数を実装する関数を自分で記述します。参照コードは次のとおりです。

  1. function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
  2. $ip = gethostbyname($host);
  3. $s =ソケット_create(AF_INET, SOCK_STREAM, 0);
  4. if (socket_set_nonblock($s)) {
  5. $r = @socket_connect($s, $ip, $port);
  6. if ($r ||ソケット_last_error() == EINPROGRESS) {
  7. $errno = EINPROGRESS;
  8. return $s;
  9. }
  10. }
  11. $errno =ソケット_last_error($s);
  12. $errstr =ソケット_strerror($errno);
  13. ソケット_クローズ($s);
  14. return false;
  15. }
  16. ?>
コードをコピー

特定の操作: 1. まず、fsockopen 関数を使用するコード セグメントを見つけて、その先頭に上記のコードを追加し、コード セグメント内で文字列 fsockopen( を検索し、 b_fsockopen( に置き換えます。 2. fsockopen 関数はファイル ポインターを返すため、file 関数で操作できますが、b_fsockopen 関数はファイル ポインターを返すことができません。コード セグメントを引き続き変更する必要があります。fread( をsocket_read(、replace) に置き換えます。 fwrite(とsocket_write(、socket_close(を使用します。 fclose(を置き換えます。

)


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。