<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                php網絡主要有[網絡核心擴展函數](http://www.hmoore.net/a173512/php_note/1690697)和[curl擴展函數](http://www.hmoore.net/a173512/php_note/1690685)構成,具體參看函數參考--其他服務--網絡(核心)和cURL擴展 >注意區分PHP流包裝器和基于流的套接字函數的套接字傳輸器(套接字傳輸協議名稱) **PHP 帶有很多內置 URL 風格的封裝協議,如:** * [file://](https://www.php.net/manual/zh/wrappers.file.php)— 訪問本地文件系統 * [http://](https://www.php.net/manual/zh/wrappers.http.php)— 訪問 HTTP(s) 網址 * [ftp://](https://www.php.net/manual/zh/wrappers.ftp.php)— 訪問 FTP(s) URLs * [php://](https://www.php.net/manual/zh/wrappers.php.php)— 訪問各個輸入/輸出流(I/O streams) * [zlib://](https://www.php.net/manual/zh/wrappers.compression.php)— 壓縮流 * [data://](https://www.php.net/manual/zh/wrappers.data.php)— 數據(RFC 2397) * [glob://](https://www.php.net/manual/zh/wrappers.glob.php)— 查找匹配的文件路徑模式 * [phar://](https://www.php.net/manual/zh/wrappers.phar.php)— PHP 歸檔 * [ssh2://](https://www.php.net/manual/zh/wrappers.ssh2.php)— Secure Shell 2 * [rar://](https://www.php.net/manual/zh/wrappers.rar.php)— RAR * [ogg://](https://www.php.net/manual/zh/wrappers.audio.php)— 音頻流 * [expect://](https://www.php.net/manual/zh/wrappers.expect.php)— 處理交互式的流 這些封裝協議可用于類似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系統函數。 ``` $handle = fopen("/home/rasmus/file.txt", "r");//同fopen("file:///home/rasmus/file.txt", "r") $handle = fopen("/home/rasmus/file.gif", "wb"); $handle = fopen("http://www.example.com/", "r"); $handle = fopen("ftp://user:password@example.com/somefile.txt", "w"); ``` 除了這些封裝協議,還能通過[stream\_wrapper\_register()](https://www.php.net/manual/zh/function.stream-wrapper-register.php)來注冊自定義的封裝協議。 # **流與套接字** //初始化一個套接字連接到指定主機(hostname) ``` $handle=fsockopen ("www.test.com" $port=80 , $errno, $errstr, $timeout = ini_get("default_socket_timeout")) //或者: $handle=fstream_socket_client("tcp://www.test.com:80",?$errno,?$errstr,?30) ``` >fsockopen()**將返回一個文件句柄**,之后可以被其他文件類函數調用(例如:fgets(),fgetss(),fwrite(),fclose()還有feof())。如果調用失敗,將返回FALSE 要得到自己的 PHP 版本中所安裝的傳輸器列表,使用 stream_get_transports() ``` var_dump(stream_get_transports());//array(8) { [0]=> string(3) "tcp" [1]=> string(3) "udp" [2]=> string(3) "ssl" [3]=> string(5) "sslv3" [4]=> string(3) "tls" [5]=> string(7) "tlsv1.0" [6]=> string(7) "tlsv1.1" [7]=> string(7) "tlsv1.2" } ``` **所支持的套接字傳輸器(Socket Transports)列表** ## **Internet 領域:** ``` 127.0.0.1 fe80::1 www.example.com tcp://127.0.0.1 默認是 tcp:// 所以可以省略哦 tcp://fe80::1 tcp://www.example.com udp://www.example.com ssl://www.example.com 自 PHP 4.3 起可用 sslv2://www.example.com 自 PHP 5.0.2 起可用 sslv3://www.example.com 自 PHP 5.0.2 起可用 tls://www.example.com 自 PHP 4.3 起可用 ``` ## **Unix 領域:** 進程間通信方式有很多,套接字(Socket)就是其中的一種。但傳統的套接字的用法都是基于TCP/IP協議棧的,需要指定IP地址。 如果不同主機上的兩個進程進行通信,當然這樣做沒什么問題。但是,如果只需要在一臺機器上的兩個不同進程間通信,還要用到IP地址就有點多余。 而這個Unix域套接字的類別,專門用來解決這個問題 ``` unix:///tmp/mysock 自 PHP 3 起可用 udg:///tmp/mysock 自 PHP 5 起可用。 ``` >[danger]以上各種 URL 風格的套接字傳輸器 用于基于流的套接字函數,如fsockopen()和stream_socket_client() >這些傳輸器 不適用于 Sockets 擴展庫 Internet 領域套接字在目標地址中還期望有一個端口號。在 fsockopen()中在第二個參數中指定,這樣就不會影響傳輸器的 URL。然而在 stream_socket_client()和相關的函數中是用傳統的 URL,端口號在傳輸器 URL 后面以冒號分隔而指定 ``` tcp://127.0.0.1:80 tcp://[fe80::1]:80 IPv6 tcp://www.example.com:80 ``` ~~~ $handle=fsockopen ("www.test.com" $port=80 , $errno, $errstr, $timeout = ini_get("default_socket_timeout")) //或者: $handle=fstream_socket_client("tcp://www.test.com:80", $errno, $errstr, 30) ~~~ >[danger]**注意:** ssl://和 tls://傳輸器(僅在 openssl 支持已編譯入 PHP 后可用)是 tcp://傳輸器加入 SSL 加密后的擴展。在 PHP 4.3.0 中 OpenSSL 支持必須被靜態編譯入 PHP,在 PHP 5.0.0 中可以編譯為模塊或者靜態的。 ssl://將根據遠程服務器的兼容性和參數設置嘗試與之建立 SSL V2 或 SSL V3 鏈接 sslv2://和 sslv3://將明確的選擇 SSL V2 或 SSL V3 協議進行連接。 **ssl:// 和 tls:// 傳輸器的上下文選項(自 PHP 4.3.2 起)** | 名稱 | 用法 | 默認值 | | --- | --- | --- | | *verify\_peer* | &true; 或 &false;。用于 SSL 證書請求驗證。 | &false; | | *allow\_self\_signed* | &true; 或 &false;。允許自簽名的證書。 | &false; | | *cafile* | 本地文件系統中證書授權機構文件的位置,應和*verify\_peer*上下文選項一起使用來認證遠端的身份。 | ? | | *capath* | 如果沒有指定*cafile*或者如果該處沒找到證書,則在*capath*指定的目錄中搜索相配的證書。*capath*必須是一個正確的被散列化的證書目錄。 | ? | | *local\_cert* | 文件系統中本地證書文件的路徑。必須是一個用 PEM 編碼并包含你的證書和私人密鑰的文件。可以選擇包括發行者的證書鏈。 | ? | | *passphrase* | 你的*local\_cert*文件編碼的 passphrase。 | ? | | *CN\_match* | 所期待的 Common Name。PHP 能進行有限的通配符匹配。如果 Common Name 與此不匹配,連接嘗試會失敗。 | >[danger]Note: 因為 ssl://是 https:// 和 ftps:// 封裝協議的底層傳輸器,適用于 ssl://的任何上下文選項也適用于 https://和 ftps://。 **套接字傳輸器**適用于fsockopen 和 流 卻不適用于socket擴展 # **套接字(socket)** 套接字擴展在流行的BSD套接字的基礎上實現了套接字通信功能的低級接口,從而可以充當套接字服務器和客戶端。有關更通用的客戶端套接字接口,請參見`stream_socket_client()`, `stream_socket_server()`, `fsockopen()`, 和 `pfsockopen()` **示例代碼** 套接字: ~~~ ... $main_socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Cannot create socket.\n"); @socket_bind($main_socket, $host, $port) or die("Could not bind to socket $host : $port.\n"); @socket_listen($main_socket, 5) or die("Could not set up socket listener\n"); ... ~~~ 流: ~~~ ... $main_socket = @stream_socket_server ("tcp://$host:$port", $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN) or die("Cannot create socket.\n"); $clients = array($main_socket); $clients_peername = array(array('port' => $port)); fputs(STDOUT, "Waiting for connections...\n"); ... ~~~ 可以看到的重點是: * 可以使用任一**套接字**(sockets)函數或任一**流**(Streams)函數來創建客戶機和服務器 * Streams是PHP核心的一部分,而Sockets是擴展 套接字和流之間有什么區別? 相比較而言fsockopen 和 流 而言,socket更底層的。可以在創建套接字時更好進行更細粒度的控制,并且可以選擇SOCK_STREAM,SOCK_DGRAM,SOCK_SEQPACKET等。 我能想到的唯一常見例外是ICMP。例如,`ping`。但是,似乎目前還沒有從PHP進行ICMP的安全方法。此類調用需要通過套接字擴展名進行SOCK\_RAW,套接字擴展名需要具有**root權限**才能執行。另外,并非所有路由器都會路由TCP,UDP和ICMP之外的其他數據包類型。這限制了套接字擴展的用途。 好理解的比喻: socket?水泥、沙子,底層的東西 fsockopen?水泥預制件,可以用來搭房子 curl?毛坯房,自己裝修一下就能住了 stream_socket_client?和?fsockopen?沒有本質上的區別 socket?是一個封裝了?TCP/IP?操作的工具包 stream_socket_client?和?fsockopen?分屬不同流派的對?socket?的封裝 fsockopen?是比較底層的調用,屬于網絡系統的socket調用,而curl經過的包裝支持HTTPS認證,HTTP POST方法,?HTTP PUT方法,FTP上傳,?kerberos認證,HTTP上傳,代理服務器,?cookies,用戶名/密碼認證,下載文件斷點續傳,上載文件斷點續傳,http代理服務器管道(?proxy tunneling),甚至它還支持IPv6,?socks5代理服務器,,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。fsockopen?返回的是沒有處理過的數據,包括數據的長度數據內容和數據的結束符。而curl是處理后的內容 使用時,curl?更加方便,但其參數很多,配置稍微復雜,fsockopen?則有固定的幾個參數,簡單,但獲取結果可能需要再做處理 **file_get_contents呢?** 有些時候用?file_get_contents()?調用外部文件容易超時報錯。curl?效率比?file_get_contents()?和?fsockopen()?高一些,原因是CURL會自動對DNS信息進行緩存。 file_get_contents / curl / fsockopen?在當前所請求環境下選擇性操作,沒有一概而論。 file_get_contents?需要php.ini里開啟allow_url_fopen,請求http時,使用的是http_fopen_wrapper,不會keeplive的話curl是可以的。?file_get_contents()單個執行效率高,返回沒有頭的信息。? 這個是讀取一般文件的時候并沒有什么問題,但是在讀取遠程問題的時候有可能就會出現問題。如果是要打一個持續連接,多次請求多個頁面。那么[file_get_contents](http://www.nowamagic.net/academy/tag/file_get_contents)和fopen就會出問題。取得的內容也可能會不對。所以做一些類似采集工作的時候,肯定就有問題了。? fsockopen?較底層,可以設置基于UDP或是TCP協議去交互,配置麻煩,不易操作。返回完整信息。? 總之,file_get_contents?和?curl?能干的,socket都能干。socket能干的,curl?就不一定能干了。file_get_contents?更多的時候只是去拉取數據。效率比較高也比較簡單。? 只討論?[curl](http://www.nowamagic.net/academy/tag/curl)?與file_get_contents?的話,有這么一些結論: 1.????fopen /file_get_contents?每次請求都會重新做DNS查詢,并不對DNS信息進行緩存。但是CURL會自動對DNS信息進行緩存。對同一域名下的網頁或者圖片的請求只需要一次DNS查詢。這大大減少了DNS查詢的次數。所以CURL的性能比fopen /file_get_contents?好很多。 2.????fopen /file_get_contents在請求HTTP時,使用的是http_fopen_wrapper,不會keeplive。而curl卻可以。這樣在多次請求多個鏈接時,curl效率會好一些。 3.????fopen / file_get_contents函數會受到php.ini文件中allow_url_open選項配置的影響。如果該配置關閉了,則該函數也就失效了。而curl不受該配置的影響。 4.????curl可以模擬多種請求,例如:POST數據,表單提交等,用戶可以按照自己的需求來定制請求。而fopen / file_get_contents只能使用get方式獲取數據。 PS:file_get_contents()函數獲取https鏈接內容的時候,需要php?中mod_ssl的支持(或安裝opensll)。 結論就是,curl?效率及穩定都比?file_get_contents()?要好,fsockopen?也很強大,但是比較偏底層。 參考:[stream\_context\_create()模擬POST/GET](http://www.nowamagic.net/librarys/veda/detail/2585)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看