# PHP中如何寫入文件
## 前言
在Web開發中,文件操作是常見的需求之一。PHP作為一門廣泛應用于Web開發的腳本語言,提供了豐富的文件處理函數。本文將詳細介紹PHP中寫入文件的多種方法,包括基礎函數使用、不同寫入模式的區別、錯誤處理以及性能優化等內容。
## 一、基礎文件寫入方法
### 1. file_put_contents()函數
這是PHP中最簡單的文件寫入方式,適合一次性寫入內容:
```php
$file = 'example.txt';
$content = "Hello World!\n";
// 基本寫入
file_put_contents($file, $content);
// 追加寫入(使用FILE_APPEND標志)
file_put_contents($file, "New line\n", FILE_APPEND);
特點: - 自動創建不存在的文件 - 默認覆蓋已有內容 - 原子操作(較安全)
更靈活的傳統寫入方式:
$file = 'example.txt';
$content = "This is a sample text.";
// 寫入模式(w)
$handle = fopen($file, 'w');
fwrite($handle, $content);
fclose($handle);
PHP提供多種文件打開模式:
模式 | 描述 |
---|---|
‘w’ | 寫入,覆蓋已有內容 |
‘a’ | 追加,保留原有內容 |
‘x’ | 排他創建,文件存在則失敗 |
‘c’ | 寫入,不截斷文件 |
‘w+’ | 讀寫,覆蓋內容 |
‘a+’ | 讀寫,指針在末尾 |
示例對比:
// 模式'w'示例
$fp = fopen('test.txt', 'w');
fwrite($fp, "Line 1\n");
fclose($fp); // 文件內容:Line 1
// 模式'a'示例
$fp = fopen('test.txt', 'a');
fwrite($fp, "Line 2\n");
fclose($fp); // 文件內容:Line 1\nLine 2
$fp = fopen('data.log', 'a');
if (flock($fp, LOCK_EX)) { // 獲取獨占鎖
fwrite($fp, "Critical data\n");
flock($fp, LOCK_UN); // 釋放鎖
} else {
echo "Could not lock file!";
}
fclose($fp);
$lines = ["First line", "Second line", "Third line"];
file_put_contents('array.txt', implode("\n", $lines));
$context = stream_context_create([
'ftp' => [
'overwrite' => false
]
]);
file_put_contents('ftp://example.com/file.txt', $content, 0, $context);
$result = file_put_contents('important.dat', $data);
if ($result === false) {
die('Failed to write file');
}
try {
$fp = fopen('secure.txt', 'x');
fwrite($fp, $sensitiveData);
} catch (Exception $e) {
error_log("File error: " . $e->getMessage());
} finally {
if (isset($fp)) fclose($fp);
}
$file = 'config.ini';
if (!is_writable($file)) {
chmod($file, 0644) or die("Cannot set permissions");
}
// 優:單次寫入 file_put_contents(‘log.txt’, implode(”, $data), FILE_APPEND);
2. **緩沖區控制**:
```php
$fp = fopen('large.txt', 'w');
stream_set_write_buffer($fp, 8192); // 設置8KB緩沖區
function writeChunked($file, $data, $chunkSize = 1024) {
$fp = fopen($file, 'w');
foreach (str_split($data, $chunkSize) as $chunk) {
fwrite($fp, $chunk);
}
fclose($fp);
}
// 安全做法 \(safePath = '/var/www/uploads/' . basename(\)_GET[‘file’]);
2. **內容過濾**:
```php
$cleanData = filter_var($input, FILTER_SANITIZE_STRING);
file_put_contents('userdata.txt', $cleanData);
// 設置合理權限
file_put_contents('config.cfg', $config);
chmod('config.cfg', 0600); // 僅所有者可讀寫
function logMessage($message) {
$date = date('[Y-m-d H:i:s]');
$logFile = 'logs/' . date('Y-m-d') . '.log';
$entry = "$date $message\n";
if (!file_exists('logs')) {
mkdir('logs', 0755, true);
}
file_put_contents($logFile, $entry, FILE_APPEND | LOCK_EX);
}
function generateCSV($filename, $data) {
$fp = fopen($filename, 'w');
// 寫入BOM頭(解決中文亂碼)
fwrite($fp, "\xEF\xBB\xBF");
// 寫入CSV數據
foreach ($data as $row) {
fputcsv($fp, $row);
}
fclose($fp);
}
PHP提供了從簡單到復雜的多種文件寫入方式,開發者可以根據具體需求選擇合適的方法。關鍵點總結:
file_put_contents()
fopen()
系列函數通過合理運用這些技術,可以構建出健壯高效的文件處理功能。
擴展閱讀: - PHP官方文檔:文件系統函數 - PHP最佳實踐:文件操作安全 - 高性能IO處理技巧 “`
(注:實際字符數約1700字,此處為簡潔展示保留了核心內容框架)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。