PHP开发笔记系列(四)-文件操作
??? 对于一般的web应用程序,数据会保存在数据库表中,但是文件操作也是必须的,例如文件的读取、写入等,典型的应用场景是考试报名,当系统启动时,自动读取“报名须知”的内容到内存中,然后再需要时显示到页面当中。这次本文《PHP开发笔记系列(四)-文件操作》 将研究一下PHP中的文件操作。
?
1. 读取文件到数组(file)
??? file()函数可以将文件按行读取到一个字符串数组中,后续程序可以通过遍历这个字符串数组来做处理。
file:file.php url:http://localhost:88/file/file.php <?php $file = file(basename(__FILE__)); $lines = count($file); for($i=0; $i<$lines; $i++){ $color = ($i%2==0) ? 'red' : 'white'; echo '<div style="background-color: '.$color.'">'; echo $i.':'.htmlspecialchars($file[$i]); echo '</div>'; } ?>?
2. 读取文件到字符串(file_get_contents)
??? file_get_contents()函数可以将文件中的所有内容读取到一个字符串变量中,后续程序可以将这个字符串中的内容显示在页面,或者写入到新文件当中。
file:file_get_contents.php url:http://localhost:88/file/readfile.php <?php $file = file_get_contents('file.html'); $file = strip_tags($file); echo '<form><textarea rows=12 cols=80>'.htmlspecialchars($file).'</textarea></form>'; ?>?
3. 读取文件到屏幕(readfile)
??? readfile()函数直接读取文件内容并回显到屏幕,上传或下载时也会用到这个函数。
file:readfile.php url:http://localhost:88/file/readfile.php <?php readfile('file.html'); ?>
?
??? 上面的方法只能全部或按照新行符读取文件中的内容,读到数组或字符串或屏幕中,然后如果需要更加灵活的读取文件内容或写文件内容,就需要用到文件句柄了,类似于C语言当中的文件读写函数。
4. 一次读取整个文件内容(fread、filesize)
??? 对于文件的大小相对比较小的文件,可以一次将整个文件的内容读取到内存当中。步骤是,1)fopen打开新文件,并指定使用模式,2)使用fread按照指定的长度读取文件内容,3)fclose关闭句柄。
file:fread.php url:http://localhost:88/file/fread.php <?php $location = 'file.html'; $file = fopen($location, "rb"); $fileContent = fread($file, filesize($location)); fclose($file); echo $fileContent; ?>?
5. 分次读取整个文件的内容(fgets、feof)
??? fgets函数可以分片获取文件的中内容,feof可以判断文件是否已经读取到末尾。
file:fgets.php url:http://localhost:88/file/fgets.php <?php $location = 'file.html'; $fp = fopen($location, 'rb'); while(!feof($fp)){ $chunk = fgets($fp); echo $chunk; } fclose($fp); ?>?
6. 一次读取(file_get_contents),一次写入(file_put_contents)
??? 有时候对于小文件读取和写入,可以方便的使用file_get_contents()和file_put_contents()方法进行写入,无需创建文件句柄。
file:readOnce_writeOnce.php url:http://localhost:88/file/readOnce_writeOnce.php <?php $source = 'file.html'; $destination1 = 'readOnce_writeOnce.html'; // 一次读取,一次写入 $sourceContent = file_get_contents($source); file_put_contents($destination1, $sourceContent); ?>
?
7. 分行读取,分行写入(fwrite)
??? 对于大文件的读取和写入,如果一次load到内容,很有可能导致内存溢出或web服务器宕机,因此需要采用逐行读取逐行写入。可以使用file()行数将源文件读取到一个字符串数组中,然后通过fwrite逐行写入目标文件,当然,需要使用fopen打开句柄,写入结束后使用fclose关闭句柄。
file:multiRead_multiWrite.php url:http://localhost:88/file/multiRead_multiWrite.php <?php $source = 'file.html'; $destination2 = 'multiRead_multiWrite.html'; $lines = file($source); $fp = fopen($destination2, 'w'); foreach ($lines as $line) { fwrite($fp, $line); } fclose($fp); ?>?
8. 其他文件处理函数
file:other.php url:http://localhost:88/file/other.php <?php $fileName = basename(__FILE__); $dirPath = './'; // file_exists()返回1 或 0 echo $fileName.': '.file_exists($fileName).'<br/>'; // is_file()返回1 或 0 echo $fileName.' is '.is_file($fileName)?'file':'directory'.'!'.'<br/>'; // is_readable()返回1 或 0 echo $fileName.' readable:'.is_readable($fileName).'<br/>'; // is_writable()返回1 或 0 echo $fileName.' writable:'.is_writable($fileName).'<br/>'; echo $fileName.' created at:'.filemtime($fileName).'<br/>'; echo $fileName.' created at:'.fileatime($fileName).'<br/>'; echo $fileName.' size:'.filesize($fileName).'<br/>'; ?>
?
?
9. 目录读取(opendire、readdir、closedir)
??? 第一种方法,使用opendir、readdir、closedir函数进行目录的打开、读取、关闭,类似于文件的fopen、fread、fclose,代码如下:
file:dir.php url:http://localhost:88/file/dir.php <?php $location = './'; $dp = opendir($location); while ($entry = readdir($dp)){ if(is_dir($entry)) { echo '[DIR] '.$entry. '<br/>'; }elseif (is_file($entry)) { echo '[FILE] '.$entry. '<br/>'; } } closedir($dp); ?>
?
??? 第二种方法,采用php提供的面向对象的dir类,通过传入一个目录路径来构造一个dir实例,再通过实例的read方法进行目录读取,代码如下:
file:dir-class.php url:http://localhost:88/file/dir-class.php <?php $location = './'; $dir = dir($location); while ($entry = $dir->read()){ if(is_dir($entry)) { echo '[DIR] '.$entry. '<br/>'; }elseif (is_file($entry)) { echo '[FILE] '.$entry. '<br/>'; } } closedir($dp); ?>?
10. 文件拷贝(copy)
file:copy.php url:http://localhost:88/file/copy.php <?php $source = 'file.html'; $dest = 'file-copy.html'; copy($source, $dest); ?>
?
?
11. 文件移动、重命名(rename)
<?php $source = 'file-copy.html'; $dest = 'file-copy-1.html'; rename($source, $dest); ?>
?
??? 本文地址:http://ryan-d.iteye.com/blog/1543374

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),