虛擬主機為安全常禁用 fsockopen,php.ini 配置:
disable_functions = fsockopen
; 或
allow_url_fopen = Off
若未被禁用,直接替換:
$fp = pfsockopen($host, 80, $errno, $errstr, 30);
參數順序不同,端口合併到 host:
$fp = stream_socket_client($host . ":80", $errno, $errstr, 30);
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
$lines = file("https://example.com");
$content = implode('', $lines);
$content = file_get_contents("https://example.com");
$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+ |
file_get_contents + stream_context_createallow_url_fopen 是否開啟