PHP函數:fsockopen

fsockopen:打開網絡的 Socket 連接
  
語法: resuce fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
返回值: 資源;
函數種類: 網絡系統;

內容說明:

目前這個函數提供兩個 Socket 資料流界面,分別爲 Internet 用的 AF_INET 及 Unix 用的 AF_UNIX。
 
在 Internet 中,參數 hostname 及 port 分別表明網址及端口號。
在 UNIX 中,參數hostname 表示到 socket 的路徑,port 配置爲 0。timeout可省略表示多久沒有連上就中斷。該函數返回文件指針,供文件函數使用,包括 fgets()、fgetss()、fputs()、fclose()、feof()。參數 errno 及 errstr 可省略,作錯誤處理使用。該函數使用阻塞模式 (blocking mode) 處理,可用 set_socket_blocking() 轉換成無阻塞模式。

實例:

  <?php
     $fp = fsockopen("php.wilson.gs", 80, &$errno, &$errstr, 10);
     if(!$fp) {
         echo "$errstr ($errno)<br>\n";
     } else {
         fputs($fp,"GET / HTTP/1.0\nHost: php.wilson.gs\n\n");
         while(!feof($fp)) {
             echo fgets($fp,128);
         }
         fclose($fp);
     }
  ?>
備註: fputs() 函數寫入文件(可安全用於二進制文件)。fputs() 函數是 fwrite() 函數的別名。

fsockopen() — Open Internet or Unix domain socket connection php


1、如何禁用fsockopen()

下面是兩種經常使用的禁用fsockopen的方法。
一、修改php.ini,將 disable_functions = 後加入 fsockopen
二、修改php.ini,將 allow_url_fopen = On 改成 allow_url_fopen = Off
安全


2、如何解決fsockopen函數被禁用


一、若是服務器沒有同時禁用pfsockopen,那麼直接將fsockopen函數替換爲pfsockopen。
具體操做:搜索程序中的字符串 fsockopen( 替換爲 pfsockopen(。示例以下
修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30); 服務器

修改後:
$fp = pfsockopen($host, 80, $errno, $errstr, 30);

二、若是服務器同時禁用了pfsockopen,那麼用其餘函數代替,如stream_socket_client()。
注意:stream_socket_client()和fsockopen()的參數不一樣。
具體操做:搜索程序中的字符串 fsockopen( 替換爲 stream_socket_client(,而後,將原fsockopen函數中的端口參數「80」刪掉,並加到$host。示例以下
修改前:
$fp = fsockopen($host, 80, $errno, $errstr, 30); 網絡

修改後
$fp = stream_socket_client($host."80", $errno, $errstr, 30);

三、若是PHP版本低於5.0,fsockopen被禁用,又沒有stream_socket_client()怎麼辦呢?本身寫一個函數實現fsockopen的功能,參考代碼:
function b_fsockopen($host, $port, &$errno, &$errstr, $timeout) {
 $ip = gethostbyname($host);
 $s = socket_create(AF_INET, SOCK_STREAM, 0);
 if (socket_set_nonblock($s)) {
  $r = @socket_connect($s, $ip, $port);
  if ($r || socket_last_error() == EINPROGRESS) {
   $errno = EINPROGRESS;
   return $s;
  }
 }
 $errno = socket_last_error($s);
 $errstr = socket_strerror($errno);
 socket_close($s);
 return false;
} dom

具體操做:

1.首先找到使用fsockopen函數的代碼段,將上面代碼加至其上端,搜索該代碼段中的字符串fsockopen( 替換爲 b_fsockopen(

2.由於fsockopen函數返回文件指針因此能夠被文件函數操做,可是這個b_fsockopen函數沒能返回文件指針,須要繼續修改代碼段:用socket_read(替換掉 fread(,用socket_write(替換掉fwrite(,用socket_close(替換掉fclose(socket

相關文章
相關標籤/搜索