打開一個網路連線或者一個Unix套接字連線

fsockopen

(PHP 4, PHP 5, PHP 7, PHP 8)

fsockopen打開一個網路連線或者一個Unix套接字連線

說明

fsockopen(
    string $hostname,
    int $port = -1,
    int &$errno = ?,
    string &$errstr = ?,
    float $timeout = ini_get("default_socket_timeout")
): resource

初始化一個套接字連線到指定主機(hostname)。

PHP支援以下的套接字傳輸器型別列表 所支援的套接字傳輸器(Socket Transports)列表。也可以通過stream_get_transports()來獲取套接字傳輸器支援型別。

預設情況下將以阻塞模式開啟套接字連線。當然你可以通過stream_set_blocking()將它轉換到非阻塞模式。

stream_socket_client()與之非常相似,而且提供了更加豐富的參數設定,包括非阻塞模式和提供上下文的的設定。

參數

hostname

如果安裝了OpenSSL,那麼你也許應該在你的主機名地址前面新增訪問協議ssl://或者是tls://,從而可以使用基於TCP/IP協議的SSL或者TLS的客戶端連線到遠端主機。

port

埠號。如果對該參數傳一個-1,則表示不使用埠,例如unix://

errno

如果傳入了該參數,holds the system level error number that occurred in the system-level connect() call。

如果errno的返回值為0,而且這個函式的返回值為false,那麼這表明該錯誤發生在套接字連線(connect())呼叫之前,導致連線失敗的原因最大的可能是初始化套接字的時候發生了錯誤。

errstr

錯誤資訊將以字串的資訊返回。

timeout

設定連線的時限,單位為秒。

注意:

注意:如果你要對建立在套接字基礎上的讀寫操作設定操作時間設定連線時限,請使用stream_set_timeout()fsockopen()的連線時限(timeout)的參數僅僅在套接字連線的時候生效。

返回值

fsockopen()將返回一個檔案控制代碼,之後可以被其他檔案類函式呼叫(例如:fgets()fgetss()fwrite()fclose()還有feof())。如果呼叫失敗,將返回false

錯誤/異常

如果主機(hostname)不可訪問,將會拋出一個警告級別(E_WARNING)的錯誤提示。

更新日誌

版本 說明
4.3.0 在win32系統上增加了對時限設定(timeout)參數的支援。
4.3.0 在TCP/IP協議的基礎上增加了SSL和TLS。

範例

示例 #1 fsockopen()的例子

<?php
$fp 
fsockopen("www.example.com"80$errno$errstr30);
if (!
$fp) {
    echo 
"$errstr ($errno)<br />\n";
} else {
    
$out "GET / HTTP/1.1\r\n";
    
$out .= "Host: www.example.com\r\n";
    
$out .= "Connection: Close\r\n\r\n";
    
fwrite($fp$out);
    while (!
feof($fp)) {
        echo 
fgets($fp128);
    }
    
fclose($fp);
}
?>

示例 #2 使用UDP連線

下面這個例子展示了怎麼樣在自己的機器上通過UDP套接字連線(埠號13)來檢索日期和時間。

<?php
$fp 
fsockopen("udp://127.0.0.1"13$errno$errstr);
if (!
$fp) {
    echo 
"ERROR: $errno - $errstr<br />\n";
} else {
    
fwrite($fp"\n");
    echo 
fread($fp26);
    
fclose($fp);
}
?>

註釋

注意:

因為環境的不同,某些情況下在Unix套接字連線或者自定義的連線設定連線時限(timeout)可能不會生效。

警告

UDP套接字有些時候在即使遠端主機未知的情況,也能打開,並且不發生任何錯誤。只有當你通過該套接字進行讀寫的時候才會發現錯誤。之所以會這樣,是因為UDP是一個「非連線狀態」的協議,那麼這就意味著目前操作系統直到它(套接字)真正需要發送和接受數據的時候才會去嘗試為其去建立連線。

注意: 當指定數值型的 IPv6 地址(例如 fe80::1)時必須用方括號將 IP 圍起來——例如, tcp://[fe80::1]:80

參見

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *