Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
f (feof($file)) echo "文件結(jié)尾";
php 文件處理fopen()
fopen() 函數(shù)用于在 PHP 中打開(kāi)文件
此函數(shù)的第一個(gè)參數(shù)含有要打開(kāi)的文件的名稱,第二個(gè)參數(shù)規(guī)定了使用哪種模式來(lái)打開(kāi)文件:
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
如果 fopen() 函數(shù)不能打開(kāi)指定的文件,下面的實(shí)例會(huì)生成一段消息:
<html>
<body>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
fclose() 函數(shù)用于關(guān)閉打開(kāi)的文件:
<?php
$file=fopen("test.txt","r");
//執(zhí)行一些代碼
fclose($file);
?>
feof() 函數(shù)檢測(cè)是否已到達(dá)文件末尾(EOF)
在循環(huán)遍歷未知長(zhǎng)度的數(shù)據(jù)時(shí),feof() 函數(shù)很有用
注釋:在 w 、a 和 x 模式下,您無(wú)法讀取打開(kāi)的文件
if (feof($file)) echo "文件結(jié)尾";
fgets() 函數(shù)用于從文件中逐行讀取文件
在調(diào)用該函數(shù)之后,文件指針會(huì)移動(dòng)到下一行
下面的實(shí)例逐行讀取文件,直到文件末尾為止:
<?php
$file=fopen("welcome.txt", "r") or exit("無(wú)法打開(kāi)文件!");
// 讀取文件每一行,直到文件結(jié)尾
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
fgetc() 函數(shù)用于從文件中逐字符地讀取文件
注釋:在調(diào)用該函數(shù)之后,文件指針會(huì)移動(dòng)到下一個(gè)字符。
下面的實(shí)例逐字符地讀取文件,直到文件末尾為止
Filesystem 函數(shù)允許您訪問(wèn)和操作文件系統(tǒng)
Filesystem 函數(shù)是 PHP 核心的組成部分。無(wú)需安裝即可使用這些函數(shù)
Filesystem 函數(shù)的行為受到 php.ini 中設(shè)置的影響
.打開(kāi)文件
定義和用法
fopen() 函數(shù)打開(kāi)文件或者 URL。
如果打開(kāi)失敗,本函數(shù)返回 FALSE。
語(yǔ)法
fopen(filename,mode,include_path,context)
參數(shù)描述
filename必需。規(guī)定要打開(kāi)的文件或 URL。
mode必需。規(guī)定要求到該文件/流的訪問(wèn)類型。可能的值見(jiàn)下表。
include_path可選。如果也需要在 include_path 中檢索文件的話,可以將該參數(shù)設(shè)為 1 或 TRUE。
context可選。規(guī)定文件句柄的環(huán)境。Context 是可以修改流的行為的一套選項(xiàng)。
mode 參數(shù)的可能的值
mode說(shuō)明
"r"只讀方式打開(kāi),將文件指針指向文件頭。
"r+"讀寫方式打開(kāi),將文件指針指向文件頭。
"w"寫入方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
"w+"讀寫方式打開(kāi),將文件指針指向文件頭并將文件大小截為零。如果文件不存在則嘗試創(chuàng)建之。
"a"寫入方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
"a+"讀寫方式打開(kāi),將文件指針指向文件末尾。如果文件不存在則嘗試創(chuàng)建之。
"x"
創(chuàng)建并以寫入方式打開(kāi),將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級(jí)別的錯(cuò)誤信息。如果文件不存在則嘗試創(chuàng)建之。
這和給底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標(biāo)記是等價(jià)的。
此選項(xiàng)被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。
"x+"
創(chuàng)建并以讀寫方式打開(kāi),將文件指針指向文件頭。如果文件已存在,則 fopen() 調(diào)用失敗并返回 FALSE,并生成一條 E_WARNING 級(jí)別的錯(cuò)誤信息。如果文件不存在則嘗試創(chuàng)建之。
這和給底層的 open(2) 系統(tǒng)調(diào)用指定 O_EXCL|O_CREAT 標(biāo)記是等價(jià)的。
此選項(xiàng)被 PHP 4.3.2 以及以后的版本所支持,僅能用于本地文件。
說(shuō)明
fopen() 將 filename 指定的名字資源綁定到一個(gè)流上。如果 filename 是 "scheme://..." 的格式,則被當(dāng)成一個(gè) URL,PHP 將搜索協(xié)議處理器(也被稱為封裝協(xié)議)來(lái)處理此模式。如果該協(xié)議尚未注冊(cè)封裝協(xié)議,PHP 將發(fā)出一條消息來(lái)幫助檢查腳本中潛在的問(wèn)題并將 filename 當(dāng)成一個(gè)普通的文件名繼續(xù)執(zhí)行下去。
如果 PHP 認(rèn)為 filename 指定的是一個(gè)本地文件,將嘗試在該文件上打開(kāi)一個(gè)流。該文件必須是 PHP 可以訪問(wèn)的,因此需要確認(rèn)文件訪問(wèn)權(quán)限允許該訪問(wèn)。如果激活了安全模式或者 open_basedir 則會(huì)應(yīng)用進(jìn)一步的限制。
如果 PHP 認(rèn)為 filename 指定的是一個(gè)已注冊(cè)的協(xié)議,而該協(xié)議被注冊(cè)為一個(gè)網(wǎng)絡(luò) URL,PHP 將檢查并確認(rèn) allow_url_fopen 已被激活。如果關(guān)閉了,PHP 將發(fā)出一個(gè)警告,而 fopen 的調(diào)用則失敗。
例:fopen.php
<?php
@fopen("file.txt", "r");//只讀打開(kāi),將文件指針指向文件頭
@fopen("file.txt", "w");//寫入打開(kāi),將文件指針指向文件頭 @ 可以屏蔽一些警告信息,但頻繁使用 @ 會(huì)造成程序運(yùn)行過(guò)慢
?>
結(jié)果:
在北京寫代碼(31)
作者:魯棒棒
寫于:20240322
正文
上一篇寫到了我的第一個(gè)工作所面對(duì)的需求,以及使用的框架,今天來(lái)詳細(xì)記錄一下我當(dāng)時(shí)做研發(fā)所面對(duì)的一些問(wèn)題和一些困惑。當(dāng)時(shí)因?yàn)槭鞘褂昧?openresty 這個(gè)框架,這個(gè)框架貌似是用在爬蟲(chóng)里的,我近期又研究了一下這個(gè)框架,這個(gè)框架貌似不太適合把比較復(fù)雜的業(yè)務(wù)放在里面,所以我仔細(xì)考慮之后,也沒(méi)太弄明白為什么非要讓我用這個(gè)框架去做。
當(dāng)然這個(gè)抽取數(shù)據(jù)并放到 web 頁(yè)面中的功能本身也不復(fù)雜,放在 nginx 里,也不能說(shuō)不行,但是可用的替代方案實(shí)在是太多了,為什么偏要用 lua 這套東西呢?我到現(xiàn)在也沒(méi)有十分清楚,同時(shí)我的上級(jí)也不跟我講為什么,跟我對(duì)接的說(shuō)辭就是
“我們公司現(xiàn)在在用的一個(gè)東西是 openresty,你看一下,之后你要用這個(gè)東西來(lái)寫代碼,這個(gè)是 lua 的,你看下 lua,今天就開(kāi)始寫吧”
然后我就吭哧吭哧滿頭大汗的開(kāi)始搞了,我認(rèn)為不外乎幾點(diǎn)原因,但是都是我自己的推測(cè),除非我去問(wèn)一下我當(dāng)時(shí)的領(lǐng)導(dǎo)。首先就是公司技術(shù)棧的適應(yīng)問(wèn)題,現(xiàn)在公司的項(xiàng)目有一部分是基于 openresty 的,讓我用這個(gè)東西來(lái)寫業(yè)務(wù),可能也是出于適應(yīng)公司文化上的考慮。
其次還有一個(gè)原因就是我面試的時(shí)候所面的職位是 “Python 程序員” 當(dāng)時(shí)不讓我做 python 方面的工作,可能是想在實(shí)習(xí)期,給我一個(gè)比較全面的測(cè)試,比如學(xué)習(xí)技術(shù)的速度,對(duì)業(yè)務(wù)的理解,抗壓能力等等。我認(rèn)為這個(gè)理由可能比較靠譜,當(dāng)然在一般情況下,面試的崗位和工作的崗位不同,是經(jīng)常有這種情況的,尤其是在不太成熟的小微企業(yè),這種情況沒(méi)必要過(guò)多解釋,因?yàn)椴还苊嬖囀裁绰毼欢际?“打雜職位”,和大型科技巨頭的 “一個(gè)蘿卜一個(gè)坑” 是非常不同的,純屬個(gè)人瞎猜,不用較真。
因?yàn)楫?dāng)時(shí)有更快的方案去實(shí)現(xiàn)整個(gè)業(yè)務(wù),但是我不能用,沒(méi)有選擇權(quán),比如用 django 或者用 flask,都是我比較熟悉的 web 框架,用起來(lái)也是比較順手,同時(shí)我覺(jué)得 openresty 內(nèi)嵌的 lua,不太好用,比較適合做一些流量轉(zhuǎn)發(fā),權(quán)限校驗(yàn)等需要在網(wǎng)關(guān)層面做的業(yè)務(wù),增刪改查用這個(gè)東西來(lái)做,可能有些牽強(qiáng),我當(dāng)時(shí)其實(shí)就這么想的,只是苦于不敢跟領(lǐng)導(dǎo)說(shuō)。
其實(shí)還是自己的心態(tài)不夠強(qiáng)大,其次也是多年所受的教育就叫我要 “逆來(lái)順受”,人家讓你干嘛你就干嘛,這也是老祖宗教我的,現(xiàn)在我不打算這么干了,所以我選擇成為一名藝術(shù)家,我現(xiàn)在行為基本是反過(guò)來(lái)的。不是 “人家讓你干嘛你干嘛” 而是 “我想干嘛就干嘛” 當(dāng)然僅限于在干活上。生活中我選擇多參加點(diǎn)娛樂(lè)活動(dòng),這樣可以身心放松一點(diǎn)。
明白了業(yè)務(wù),明白了需要用的技術(shù),然后我就開(kāi)始工作了,費(fèi)盡千辛萬(wàn)苦把框架搭建起來(lái)之后,終于把 “Hello World” 跑通了,跑通之后我就需要去學(xué)習(xí)使用 lua 處理 http 請(qǐng)求了。
關(guān)于 lua 我的印象很深刻,公司當(dāng)時(shí)給我扔過(guò)來(lái)一本很厚的書,叫做 “Lua 程序設(shè)計(jì)” 這本書是 lua 的作者寫的,現(xiàn)在已經(jīng)有了第四版,而我當(dāng)時(shí)看的不是第四版,而是黃色書皮的那個(gè)版本,因?yàn)橐M快開(kāi)始寫代碼,我也沒(méi)有去翻看這本書,而是打算晚上的時(shí)候帶回住處,慢慢看。
而在公司里,肯定不能讓別人看到你整個(gè)下午抱著書看了,而是慢慢的一點(diǎn)一點(diǎn)從 demo 中復(fù)制代碼過(guò)來(lái),然后慢慢改著,測(cè)試運(yùn)行,雖然并不十分清楚每一行代碼的用處,但是比如處理字符串,處理 table,還有獲取 http 請(qǐng)求,從 http 請(qǐng)求中獲取參數(shù)等,都是一些 web 框架的常見(jiàn)的功能。
不外乎使用什么技術(shù),什么語(yǔ)言,協(xié)議是如此的,那么就肯定要處理各種 http 中的參數(shù),比如 query string 之類的等等。當(dāng)時(shí)我比較著急,所以覺(jué)得心情有些焦躁,心態(tài)把控的不是很好,總覺(jué)得催命一樣的感覺(jué),總之就是很不舒服,也不知道該如何緩解,很郁悶。
就這樣一邊琢磨,一邊研究,一邊心慌的終于把 http 請(qǐng)求處理這部分跑通了,然后成功的在網(wǎng)頁(yè)上打印出了 “Hello World” 不過(guò)我對(duì)其中的原理還是一知半解的。之后便很快又遇到了另一個(gè)問(wèn)題,那就是 lua 的模板語(yǔ)言我看不懂,不會(huì)用,這就更著急了。
當(dāng)時(shí)的程序還不是前后端分離啥的,可能現(xiàn)在參加培訓(xùn)之后上崗的程序員朋友,沒(méi)聽(tīng)說(shuō)過(guò)模板渲染,原理和現(xiàn)在流行的 nodejs 里的那個(gè) server side render 差不多,都可以說(shuō)是一種服務(wù)端渲染,反正 html 代碼都是服務(wù)器上拼裝上去的,連同 js 代碼, css 代碼,有時(shí)候也是需要在服務(wù)器端拼裝的。
但是拼裝的時(shí)候,比如需要把某個(gè)變量的值,直接傳輸?shù)侥硞€(gè)頁(yè)面里,如果沒(méi)有模板引擎,就只能自己去用讀文件的方法 fopen 這個(gè) html 文件,用字符串讀出來(lái),然后找到 token,最后將 token 替換成變量的值。
而有了模板引擎就不需要這樣做了,因?yàn)槟0逡孀龅墓ぷ骶褪谴鷵Q變量值和進(jìn)行計(jì)算的工作,而公司大佬寫的這個(gè)框架,一開(kāi)始是沒(méi)有模板引擎的,讓我著急了好一陣子,因?yàn)槲易约号幻靼祝抑粫?huì)用 django 里的模板引擎。
無(wú)論如何我都解決不了模板的問(wèn)題,而且前端頁(yè)面的代碼量也比較大,很多功能都得自己寫 html 和 js 才行,我跟領(lǐng)導(dǎo)說(shuō)了,領(lǐng)導(dǎo)說(shuō)自己研究研究,我跟寫框架的大佬說(shuō),他說(shuō)回頭給你整個(gè)模板引擎,不過(guò)我估計(jì)他給我整模板引擎整的就把我整下崗了。
所以我很著急啊,接著我磨蹭了大佬好久,大佬終于把一個(gè)開(kāi)源的 lua 模板引擎加上去了,不過(guò)也是 bug 很多,其實(shí)他可以告訴我的,我可以自己搞搞試試,但是我不知道模板引擎還能用開(kāi)源的,我以為必須自己寫。
這也算是我的一個(gè)經(jīng)驗(yàn)不足的問(wèn)題吧,現(xiàn)在代碼跑通了,模板引擎也有了,接下來(lái)就開(kāi)始開(kāi)發(fā)業(yè)務(wù)。今天就寫到這里,明天繼續(xù)吧。
晚安!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。