PHP有許多用于與網頁服務器進行交互的函數,其中之一就是fsockopen
函數。這個函數可以被用來向一個服務器發送POST請求。使用這個函數的好處是因為它可以很方便地和其他函數一起使用,例如file_get_contents
、fputs
和fread
。
下面這個例子展示了使用fsockopen
函數向百度搜索發送POST請求的過程:
<code class="php"> $host = "www.baidu.com"; $port = "80"; $path = "/s?wd=php"; $data = "q=php"; $fp = fsockopen($host, $port, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)\n"; } else { $out = "POST $path HTTP/1.1\r\n"; $out .= "Host: $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); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); }
在這個例子中,我們首先設定了要向服務器發送POST請求的目標地址,這個例子中是www.baidu.com/s?wd=php。然后,我們創建了fsockopen
函數之后,創建一個變量$out
,這個變量存儲了我們要發送給服務器的數據。要注意的幾個點包括:
- 我們指定了使用POST方法
- 我們指定了目標服務器的主機名
- 我們指定了數據的長度
- 最后,我們將實際的數據寫入了輸出流中
當服務器返回成功響應時,我們可以使用fgets
函數讀取響應的結果。
如果我們想要在PHP程序中發送數據(例如使用一個表單的方式),這時fsockopen
函數就非常適合。下面是一個例子,它演示了向網頁發送POST請求以接收數據的方法:
<code class="php"> if (isset($_POST['__submit__'])) { $name = $_POST['name']; $email = $_POST['email']; $phone = $_POST['phone']; $host = "www.example.com"; $port = "80"; $path = "/contact/process.php"; $data = "name=$name&email=$email&phone=$phone"; $fp = fsockopen($host, $port, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)\n"; } else { $out = "POST $path HTTP/1.1\r\n"; $out .= "Host: $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); while (!feof($fp)) { echo fgets($fp, 128); } fclose($fp); } }
在這個例子中,我們使用isset
條件來檢查用戶是否已經提交了表單數據。如果是這樣的話,我們使用fsockopen
去向目標服務器發送一個HTTP POST方法的請求,在請求中包括了用戶表單中的參數。一旦服務器響應成功,我們可以讀取它返回的數據。
總的來說,fsockopen
是一個十分有用的函數,特別是對于需要經常向服務器發送HTTP請求的PHP開發者。這個函數可以為他們提供十分方便的數據交換機制,使得他們能夠取得與其他語言同樣的靈活性。