PHP有許多用于與網(wǎng)頁服務(wù)器進行交互的函數(shù),其中之一就是fsockopen
函數(shù)。這個函數(shù)可以被用來向一個服務(wù)器發(fā)送POST請求。使用這個函數(shù)的好處是因為它可以很方便地和其他函數(shù)一起使用,例如file_get_contents
、fputs
和fread
。
下面這個例子展示了使用fsockopen
函數(shù)向百度搜索發(fā)送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); }
在這個例子中,我們首先設(shè)定了要向服務(wù)器發(fā)送POST請求的目標(biāo)地址,這個例子中是www.baidu.com/s?wd=php。然后,我們創(chuàng)建了fsockopen
函數(shù)之后,創(chuàng)建一個變量$out
,這個變量存儲了我們要發(fā)送給服務(wù)器的數(shù)據(jù)。要注意的幾個點包括:
- 我們指定了使用POST方法
- 我們指定了目標(biāo)服務(wù)器的主機名
- 我們指定了數(shù)據(jù)的長度
- 最后,我們將實際的數(shù)據(jù)寫入了輸出流中
當(dāng)服務(wù)器返回成功響應(yīng)時,我們可以使用fgets
函數(shù)讀取響應(yīng)的結(jié)果。
如果我們想要在PHP程序中發(fā)送數(shù)據(jù)(例如使用一個表單的方式),這時fsockopen
函數(shù)就非常適合。下面是一個例子,它演示了向網(wǎng)頁發(fā)送POST請求以接收數(shù)據(jù)的方法:
<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
條件來檢查用戶是否已經(jīng)提交了表單數(shù)據(jù)。如果是這樣的話,我們使用fsockopen
去向目標(biāo)服務(wù)器發(fā)送一個HTTP POST方法的請求,在請求中包括了用戶表單中的參數(shù)。一旦服務(wù)器響應(yīng)成功,我們可以讀取它返回的數(shù)據(jù)。
總的來說,fsockopen
是一個十分有用的函數(shù),特別是對于需要經(jīng)常向服務(wù)器發(fā)送HTTP請求的PHP開發(fā)者。這個函數(shù)可以為他們提供十分方便的數(shù)據(jù)交換機制,使得他們能夠取得與其他語言同樣的靈活性。