2024 年日本 PHP 研討會

pfsockopen

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

pfsockopen開啟持續性網際網路或 Unix 網域通訊端連線

說明

pfsockopen(
    字串 $hostname,
    整數 $port = -1,
    整數 (int) &$error_code = null,
    字串 (string) &$error_message = null,
    ?浮點數 (float) $timeout = null
): 資源 (resource)|false

此函式的行為與 fsockopen() 完全相同,不同之處在於腳本執行完成後連線不會關閉。它是 fsockopen() 的持續性版本。

參數

有關參數資訊,請參閱 fsockopen() 文件。

返回值

pfsockopen() 返回一個檔案指標,可與其他檔案函式(例如 fgets()fgetss()fwrite()fclose()feof())一起使用,或者在失敗時返回 false

更新日誌

版本 說明
8.0.0 timeout 現在可以為 null。

另請參閱

  • fsockopen() - 開啟網際網路或 Unix 網域通訊端連線

新增註記

使用者貢獻的註記 5 則註記

zuraw
12 年前
pfsockopen() 在 IIS/Windows 7 安裝上運作良好,它會保持連線開啟,這對效能很有幫助。然而,有一個需要注意的地方:當連線因為實體網路故障而中斷時,pfsockopen() 會傳回控制代碼,就好像連線正常運作一樣。後續呼叫 fwrite() 會返回 false,以便您獲得錯誤資訊。問題是,在實體網路連線恢復後,情況並未改變:pfsockopen() 仍然返回控制代碼,而 fwrite() 返回 false。換句話說,PHP 會堅持使用失效的舊連線(如果您改用 fsockopen(),它會正確連線)。30 分鐘後,當 PHP 關閉未使用的連線時,情況會恢復正常。
解決此問題的方法是在 fwrite() 返回 false 時呼叫 fclose() 關閉通訊端控制代碼。
k dot andris at gmail dot com
15 年前
要查看這是一個新的連線還是重複使用的連線,您可以使用 ftell() - 並查看該連線上是否有任何流量。如果大於 0,則表示是重複使用的連線。
pulstar at ig dot com dot br
21 年前
無論是 Socket 還是資料庫,持久連線都應該僅用於限制明確的伺服器。例如,資料庫中允許的連線數必須大於 Apache 的處理程序數,否則連線將被資料庫拒絕(如果您使用持久連線,這肯定會發生)。Socket 連線也可能發生同樣的情況。這取決於服務配置。在我看來,只有當您完全控制一個或多個相關的伺服器時,持久連線才有用,例如在負載較重的專用伺服器上,這種情況下,效能的些微提升值得使用此類連線。永遠不要在共享伺服器上使用它們。
php dot net at domainofdarkness dot com
23 年前
好的,關於 p* 函數在已存在連線時開啟新連線的問題。我的理解是(至少在 Apache 下),這是基於每個處理程序的。如果您在伺服器上執行 'ps auxw|grep httpd',您將看到多個處理程序。p* 所做的只是在其中一個處理程序上建立 p-連線,即實際處理您的請求的處理程序。當您再次訪問該頁面時,它很可能會由不同的處理程序來回應。我猜想,如果您不斷重新整理,您最終會回到原始的處理程序,並且不會出現錯誤訊息或開啟第二個連線。無論如何,所有 p* 函數都是如此;它們不是為每個伺服器開啟一個連線,而是為每個伺服器_處理程序_開啟一個連線。
bimal dot das at maxartists dot com
18 年前
以下是使用 pfsockopen 將表單動作 POST 到 SSL 伺服器的 cgi 並擷取輸出的方法

<?php

$host
= gethostbyaddr($_SERVER['REMOTE_ADDR']);

# 工作變數
$host = 'www.example.com';
$service_uri = '/cgi-bin/processACT';
$vars ='code=22&act=TEST';

# 組合 HTTP 請求標頭
$header = "Host: $host\r\n";
$header .= "User-Agent: PHP Script\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($vars)."\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = pfsockopen("ssl://".$host, 443, $errno, $errstr);
if (!
$fp) {
echo
"$errstr ($errno)<br/>\n";
echo
$fp;
} else {
fputs($fp, "POST $service_uri HTTP/1.1\r\n");
fputs($fp, $header.$vars);
fwrite($fp, $out);
while (!
feof($fp)) {
echo
fgets($fp, 128);
}
fclose($fp);
}

?>
To Top