不依賴 cURL 或 stream_context,直接以 fsockopen 建立 TCP 連線發送原始 HTTP 請求。
function socketGet($url, &$ret) {
$urlArr = parse_url($url);
$host = $urlArr['host'];
$port = isset($urlArr['port']) ? $urlArr['port'] : 80;
$path = isset($urlArr['path']) ? $urlArr['path'] : '/';
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) return false;
$out = "GET $path HTTP/1.1\r\nHost: $host\r\nConnection: Close\r\n\r\n";
fwrite($fp, $out);
$ret = '';
while (!feof($fp)) $ret .= fgets($fp, 128);
fclose($fp);
return true;
}
function socketPost($url, $data, &$ret) {
$urlArr = parse_url($url);
$host = $urlArr['host'];
$port = isset($urlArr['port']) ? $urlArr['port'] : 80;
$path = isset($urlArr['path']) ? $urlArr['path'] : '/';
$fp = fsockopen($host, $port, $errno, $errstr, 30);
if (!$fp) return false;
$out = "POST $path HTTP/1.1\r\nHost: $host\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($data) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $data;
fwrite($fp, $out);
$ret = '';
while (!feof($fp)) $ret .= fgets($fp, 128);
fclose($fp);
return true;
}
若 POST 失敗,可將 Connection: Keep-Alive 改為 Close。此方式適合理解 HTTP 協定底層運作。