国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP回顧之IO

happen / 2950人閱讀

摘要:命令行時返回值為,標準輸入輸出均指向終端可用進程號查看。會在腳本執行完畢后關閉三個流,無需用戶手動關閉。與遠程網址交互是一個請求和響應的過程,其中細節可參考本人之前的文章回顧之請求和回顧之響應,也可參考協議的權威文檔。

轉載請注明文章出處: https://tlanyan.me/php-review...
PHP回顧系列目錄

PHP基礎

web請求

cookie

web響應

session

數據庫操作

加解密

Composer

創建自己的Composer包

發送郵件

無論哪種編程語言,IO操作都值得好好學習和理解。由于PHP簡單的特性,不少人對此毫無概念也能寫出可用的代碼。本文總結PHP開發中幾個常見的IO場景并介紹對應的操作,希望能幫助PHP開發人員加深對IO的理解。后續文章中將介紹隱藏在簡單之下的本質:流。

本文介紹的場景包括:讀寫文件、命令行輸入輸出、與遠程網址交互。廢話少說,直接開始吧!

讀寫文件

文件的讀寫是最常規的IO操作。打開文件、讀寫內容、關閉文件,一氣呵成,沒什么尿點。一個典型的讀取文件內容例子:

function getFileContent(string $filename) : ?string
{
    if (!is_file($filename)) {
        return null;
    }

    $fd = fopen($filename, "rb");
    $content = fread($fd, filesize($filename);
    fclose($fd);
    return $content;
}

讀寫文件So easy! 要想對文件操作玩得更高端點,至少需要熟練使用這些API:

file_exists/is_file/filesize/fileperms等獲取文件信息的輔助函數;

fopen:打開文件,獲取文件句柄,第二個參數(arwcbx)的含義要弄清楚;

flock:獲取文件鎖,可用其實現進程互斥鎖;

fread/fgets/fscanf等獲取文件內容的函數;

fwrite/fputs/fputcsv/ftruncate等寫入內容函數;

feof/ftell/fseek/rewind等操作文件指針位置的函數;

fclose: 關閉文件,釋放資源。

注意本節中的文件指是 本地文件,對于遠程文件,上述函數是否起作用取決于協議是否提供支持。例如fread/fwrite可以操作http://協議的資源,但stat/filesize等函數不能正常工作。可參考官網的“協議和包裝器” 查看非本地普通文件時可用的函數信息。

命令行輸入和輸出

PHP主要用于web開發,命令行應用也比較常見,比如定時任務的腳本。命令行模式下,有不少與web開發不同的地方,比如可以使用多進程/線程(web中的curl_multiple不算),沒有運行時間限制等。

命令行時php_sapi_name返回值為cli,標準輸入輸出均指向終端(可用ll /proc/進程號/fd查看)。PHP定義了三個句柄常量:

STDIN: 標準輸入,只讀,等同于用fopen打開"php://stdin";

STDOUT: 標準輸出,只寫,等同于用fopen打開"php://stdout";

STDERR: 標準錯誤輸出,只寫,等同于fopen打開"php://stderr"。

注意標準輸入對應"php://stdin"而非"php://input",雖然這兩者行為在命令行模式下幾乎一致(區別可參考本人之前的文章php://output和php://stdout的區別)。

操作三個讀寫通道,對應的函數是fread/fgetc/fscanf/fwrite/fputc/fputs等。PHP會在腳本執行完畢后關閉三個流,無需用戶手動關閉。下面用代碼簡要展示用法:

function prompt(string $message) : string
{
    fwrite(STDOUT, $message);
    // fgets會把換行符也讀入,可用rtrim過濾掉
    return rtrim(fgets(STDIN));
}

function println(string $message) : void
{
    fputs(STDOUT, $message . PHP_EOL);
}

function error(string $message) : void
{
    fputs(STDERR, $message . PHP_EOL);
}

$value = prompt("input your value:");
if ($value !== "") {
    println("your input: $value");
} else {
    error("invalid value!");
}

命令行模式時"php://output"鏈接到標準輸出,所以echo/print/var_dump等輸出函數可正常使用。要交互式的從命令行獲取輸入,則需要用到fread/fgets等文件讀取函數。

常量PHP_EOL是預定義的跨平臺換行符,EOL是end of line的縮寫,不是end of life~

與遠程網址交互

從網頁獲取內容,cURL拓展絕對值得大提特提。如果你熟悉curl命令,對其功能的強大應該有所了解,那么應該對使用PHP中的CURL系列函數會得心應手。

與遠程網址交互是一個請求和響應的過程,其中細節可參考本人之前的文章:PHP回顧之web請求和PHP回顧之web響應,也可參考HTTP協議的權威文檔。使用CURL與遠程web服務器的交互流程如下:

初始化CURL句柄

設置請求信息:請求URL、頭部信息、cookie、正文等;

發送請求

獲取執行結果

關閉CURL句柄,釋放資源

CURL簡單好用,缺點是請求的設置參數繁雜難記。

實踐中推薦以類Java的HttpClient庫形式與遠程服務器交互。HttpClient類庫將請求、響應、傳輸等概念抽出來,完全面向對象,更語義化,使用其能更好促進對HTTP協議的理解,缺點是代碼相對繁瑣。PHP有不少類似的HTTP請求庫,以下使用Yii2中的yii2-httpclient類庫展示使用示例:

use yiihttpclientClient;
use yiihttpclientResponse;

$url = "https://tlanyan.me";
$data = [
    "key1" => "value1",
    "key2" => "value2",
];
$response = (new Client())->createRequest()
    ->setMethod("POST")
    ->setFormat(Client::FORMAT_JSON)
    ->setUrl($url)
    ->setData($data)
    ->send();

if ($response->isOk) {
    $response->setFormat(Client::FORMAT_JSON);
    // 獲取解析后的數據
    $data = $response->data;
   ....
}

使用fopen/fsocketopen等函數也能實現與遠程服務器的交互,這部分內容放在后續的流中闡述。

file_get_contents

上文廢話了半天,還沒說到PHP中獲取內容的神器:file_get_contents函數。該函數是PHP讀取內容當之無愧的神器,不管是常規文件、php://、http://、還是標準輸入等,file_get_contents一句話搞定。相較于Java等語言中的client/connection/stream等一堆代碼,file_get_contents體現了PHP簡單實用的設計哲學。

想必PHP開發常用該函數,就用幾個簡單的示例結束本文(注意代碼中POST請求網頁已經涉及到了流的內容)。

// 讀取普通文件
file_get_contents("/etc/passwd");

// 獲取web請求的原始正文,可獲取json/xml等數據格式的原始內容,也可獲得上傳文件的內容,注意該返回可能唯二進制
// 以json/xml數據格式交互時,推薦使用此方法而非通過$GLOBALS["HTTP_RAW_POST_DATA"]獲取,$HTTP_RAW_POST_DATA在PHP 7.2中已被移除
file_get_contents("php://input");

// 獲取網址內容,可取代curl
file_get_contents("https://tlanyan.me");


// 傳入context對象,可實現post請求
$contextOptions = [
    "http" => [
        "method" => "POST",
        "ignore_errors" => true,
        "content" => "username=tlanyan",
        "header" => "Content-type: application/x-www-form-urlencoded",
        "user_agent" => "MySpider/1.0",
    ],
    "ssl" => [
    "verify_peer" => false,
    ],
];
$context = stream_context_create($contextOptions);
file_get_contents("https://tlanyan.me", false, $context);

// cli模式下從標準輸入讀取數據,此時換行符也被當做輸入的一部分,要以ctrl+d作為結束輸入的標志
file_get_contents(STDIN);

// 寫入文件內容
file_put_contents("foo.txt", "Test function call
", FILE_APPEND);
參考

http://php.net/manual/en/ref....

http://php.net/manual/en/feat...

http://php.net/manual/en/book...

https://github.com/yiisoft/yi...

感謝閱讀,感謝指正!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30726.html

相關文章

  • PHP回顧協程

    摘要:本文先回顧生成器,然后過渡到協程編程。其作用主要體現在三個方面數據生成生產者,通過返回數據數據消費消費者,消費傳來的數據實現協程。解決回調地獄的方式主要有兩種和協程。重點應當關注控制權轉讓的時機,以及協程的運作方式。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 sess...

    Java3y 評論0 收藏0
  • PHP回顧執行流程及相關概念

    摘要:通過,腳本層無需過多考慮執行的具體環境,而本身則可以讓針對自己的特點給出特有實現。模式下,也只執行一次。這幾個概念的關系如下網關協議,與語言無關,所以與關系也不大。總結本文簡要回顧了程序的架構和執行流程,并對幾個容易混淆概念做了介紹。 轉載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie we...

    jsdt 評論0 收藏0
  • PHP回顧socket編程

    摘要:如果你想體驗原味編程,用開頭的比較適合否則建議使用流函數。有關流的知識,請參考本人之前的博文回顧之流。接下來我們用流函數實現一個簡單的客戶端和服務端。流函數中的和兩個函數是我們想要的。本文目的是簡要介紹中的編程,行文到此已經達到目的。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie w...

    tomorrowwu 評論0 收藏0
  • PHP回顧

    摘要:本文先簡要跟蹤底層流的原理,再回到用戶態中流的使用。底層流我們知道中的函數可以打開本地文件等并返回一個句柄,函數能對資源句柄進行讀寫,用于關閉資源。更多關于底層流的操作可參考官方文檔中開發者的流章節,本文不再深入。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 sessi...

    gself 評論0 收藏0
  • PHP回顧多進程編程

    摘要:多進程中與多進程相關的兩個重要拓展是和。函數執行期間,主進程除了等待無法處理其他任務,所以一般不認為這是多進程編程。回收子進程有兩種方式,一種是主進程調用函數等待子進程結束另外一種是處理信號。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數據庫操作 加解...

    lifesimple 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<