首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP fsockopen 被禁用完整替代方案:pfsockopen/stream_socket_client/自定義Socket/文件函數

     編輯:PHP 相關知識

禁用原因

虛擬主機為安全常禁用 fsockopen,php.ini 配置:

disable_functions = fsockopen
; 或
allow_url_fopen = Off

方案一:pfsockopen(持久連接版)

若未被禁用,直接替換:

$fp = pfsockopen($host, 80, $errno, $errstr, 30);

方案二:stream_socket_client(PHP 5.0+)

參數順序不同,端口合併到 host:

$fp = stream_socket_client($host . ":80", $errno, $errstr, 30);

方案三:PHP 4/5.0 以下 自定義 Socket 實現

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;
}

// 替換調用
$fp = b_fsockopen($host, 80, $errno, $errstr, 30);

// 同步替換文件操作函數
// fread → socket_read
// fwrite → socket_write
// fclose → socket_close

方案四:高層文件函數(推薦用於 HTTP 獲取)

方法 1:file() 逐行讀取

$lines = file("https://example.com");
$content = implode('', $lines);

方法 2:file_get_contents() 一次性讀取(最推薦)

$content = file_get_contents("https://example.com");

方法 3:cURL(功能最強大)

$ch = curl_init("https://example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
curl_close($ch);

方案對比總結

方案適用場景優點缺點PHP版本要求
pfsockopen高併發短連接連接復用,性能好可能同被禁用所有
stream_socket_client現代替代標準庫,靈活參數格式不同5.0+
自定義Socket極老版本完全可控代碼複雜,需socket擴展4.3+
file_get_contents簡單HTTP GET一行代碼,自動處理無法精細控制請求4.3+
cURL複雜HTTP交互功能最全,支持POST/HTTPS/代理依賴擴展4.0.2+

最佳實踐建議

  • 新代碼優先使用 cURL 或 Guzzle (Composer 包)
  • 簡單 GET 請求用 file_get_contents + stream_context_create
  • 避免直接操作 Socket,除非特殊協議需求
  • 檢查 allow_url_fopen 是否開啟
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved