中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP怎樣實現異步

發布時間:2021-01-27 14:15:41 來源:億速云 閱讀:198 作者:小新 欄目:編程語言

小編給大家分享一下PHP怎樣實現異步,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

三種實現方式

通用的異步執行文件 exec.php

sleep(8);
$data = "--- type " . date("Y-m-d H:i:s") . " ---\\n";
file_put_contents("../log.txt", $data, FILE_APPEND);

popen

通過 popen() 函數打開進程文件指針,從而能異步執行腳本文件。(只在linux下有效)

pclose(popen("php exec.php &", 'r'));
echo 1;

缺點:只能異步執行本地的腳本文件,不能跨域執行,不能傳遞參數。

每次執行都會創建新的進程,當并發量高時就創建大量進程,從而造成資源浪費。

curl

應用程序以 curl 發起 http 請求的形式實現異步。但是 curl 請求也需要等待請求返回,程序同樣會阻塞,這時我們需要設置 http 請求的超時時間為1s,這樣相當于發起了一個 http 請求去執行任務,但是不等待其返回結果,繼續向下執行程序,這樣就可以實現異步效果。

function asyncCurl($url, $data)
{
    if (is_array($data)) {
        $data = http_build_query($data, null, '&');
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $result['response'] = curl_exec($ch);
    $result['httpCode'] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    return $result;
}

$url = "<http://127.0.0.1/exec.php>";
$data = [];

asyncCurl($url, $data);

echo "OK";

curl 請求實現異步方式的缺陷就是 http 請求的最小超時時間為1s。也就是應用程序無論如何都要等待1s鐘以上才能響應(現在 curl 擴展也能支持毫秒級別的超時時間設置,不過毫秒時間的超時很容易造成請求失敗)。

fsockopen

fsockopen() 函數用于打開一個網絡連接或者一個Unix套接字連接。通過發起 http 通信來實現異步。

從原理上來說與 curl 請求一樣。

function sockPost($host, $url, $param)
{
    $port = parse_url($url, PHP_URL_PORT);
    $port = $port ? $port : 80;
    $scheme = parse_url($url, PHP_URL_SCHEME);
    $path = parse_url($url, PHP_URL_PATH);
    $query = http_build_query($param);

    if ($scheme == 'https') {
        $host = 'ssl://' . $host;
    }
    $fp = fsockopen($host, $port, $error_code, $error_msg, 1);
    if (!$fp) {
        return array('error_code' => $error_code, 'error_msg' => $error_msg);
    } else {
        stream_set_blocking($fp, 0);
        stream_set_timeout($fp, 10);
        $header = "GET $path" . "?" . "$query" . " HTTP/1.1\\r\\n";
        $header .= "Host: $host\\r\\n";
        $header .= "Connection: close\\r\\n\\r\\n";//長連接關閉
        fwrite($fp, $header);
        usleep(2000); // 延時,防止在nginx服務器上無法執行成功
        fclose($fp);
        return array('error_code' => 0);
    }
}

$host = "127.0.0.1";
$url = "/exec.php";
$param = [];
$result = sockPost($host, $url, $param);
var_dump($result);

fsockopen 方式相比 curl 更復雜,需要自己拼接處 http 請求的 header 部分。在 curl 不支持毫秒級超時之前 fsockopen 方式無疑是最佳選擇。

以上是“PHP怎樣實現異步”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西峡县| 普格县| 弥勒县| 万载县| 团风县| 巴里| 马边| 措美县| 镇原县| 衡南县| 舒城县| 扶沟县| 韩城市| 永川市| 梅河口市| 长顺县| 横峰县| 于都县| 饶河县| 德保县| 莲花县| 手游| 佛山市| 汉沽区| 新泰市| 宜章县| 塔城市| 鹤山市| 江门市| 金川县| 定日县| 离岛区| 灵台县| 历史| 疏勒县| 神池县| 四子王旗| 青浦区| 达拉特旗| 西安市| 黔西县|