您現在的位置是:首頁 > PHP學習

李清波 2020-02-17 PHP學習 177

php fsockopen

fsockopen — 打開一個網絡連接或者一個Unix套接字連接

參數

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。

示例一

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
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($fp, 128);
    }
    fclose($fp);
}
?>

示例二

主要用于推送微信消息模板

//異步發送
openid = '';
access_token = '';
$redirect_uri = cmf_url('weixin/Index/login');

$data = array(
    "touser"      => $openid,
    "template_id" => "jSx2-LE5ceOzKXof24IRBOoZ6iOmeAlol-r5fBvK_QA",
    "url"         => $redirect_uri,
    "data"        => array(
        "first"    => array("value" => $company_data['company'].'-'.$key),
        "keyword1" => array("value" => $fxmonth),
        "keyword2" => array("value" => $payroll['title']),
    ),
);
$params         = json_encode($data, JSON_UNESCAPED_UNICODE);

$fp = fsockopen('api.weixin.qq.com', 80, $error, $errstr, 1);
$http = "POST /cgi-bin/message/template/send?access_token={$access_token} HTTP/1.1\r\nHost: api.weixin.qq.com\r\nContent-type: application/x-www-form-urlencoded\r\nContent-Length: " . strlen($params) . "\r\nConnection:close\r\n\r\n$params\r\n\r\n";
fwrite($fp, $http);
fclose($fp);

示例三

下面這個例子展示了怎么樣在自己的機器上通過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($fp, 26);
    fclose($fp);
}
?>


評論