ThinkPHP F() 方法 專為簡單數據、高頻讀取、無過期需求的場景設計,採用 PHP return 方式直接包含文件,性能極高。本文詳解 F() 特性、用法、適用場景、與 S() 選型指南。
核心特性
- PHP return 格式:緩存文件為
,include 直接返回數據
- 無序列化開銷:比 serialize/unserialize 快 3-5 倍
- 支援子目錄:自動創建多級目錄結構
- 無有效期:永久有效,手動刪除
- 僅簡單類型:陣列、字符串、數字、布爾,不支援對象/資源
基本語法
F($name, $value, $path = '')
| 參數 | 說明 |
| $name | 緩存名,支援 dir/subdir/name 多級目錄 |
| $value | 緩存數據,null 表示刪除 |
| $path | 可選,自定義緩存根目錄,默認 RUNTIME_PATH |
實戰示例
1. 寫入緩存
$path = RUNTIME_PATH; // 默認項目 Runtime 目錄
$str = "fast cache content";
// 寫入:自動創建 str/ 目錄,生成 ffun.php
F("str/ffun", $str, $path);
// 生成文件內容:
//
2. 讀取緩存
$data = F("str/ffun"); // 直接返回 'fast cache content'
var_dump($data);
3. 刪除緩存
F("str/ffun", null); // 刪除文件
4. 批量配置緩存
// 配置文件緩存(極高頻讀取)
$config = array(
'site_name' => 'My Site',
'per_page' => 20,
'upload_ext' => 'jpg,png,gif',
);
F('config/site', $config);
// 讀取
$siteConfig = F('config/site');
生成文件結構示例
Runtime/
├── Cache/
│ └── str/
│ └── ffun.php #
├── Config/
│ └── site.php #
└── Data/
└── _fields/
└── user.php # 表字段緩存
適用場景最佳實踐
| 場景 | 鍵名建議 | 更新頻率 |
| 系統配置 | config/system | 極低(部署時) |
| 數據庫表字段信息 | _fields/table_name | 結構變更時 |
| 路由映射表 | route/map | 路由變更時 |
| 語言包 | lang/zh-cn | 版本發布時 |
| 靜態選項字典 | dict/province | 極低 |
| 模板編譯結果 | _tpl/xxx | 模板修改時 |
自動化更新機制
// 模型事件中自動清除字段緩存
class UserModel extends Model {
protected function _after_write($data, $options) {
// 保存後清除字段緩存
F('_fields/user', null);
}
protected function _after_delete($data, $options) {
F('_fields/user', null);
}
}
// 配置更新後台
class ConfigAction extends Action {
public function save() {
// 保存配置到數據庫...
// 重新生成配置緩存
$configs = M('Config')->select();
$map = array();
foreach ($configs as $c) {
$map[$c['name']] = $c['value'];
}
F('config/system', $map);
$this->success('配置已更新並緩存');
}
}
F() vs S() 選型決策表
| 需求 | 選擇 | 理由 |
| 需要過期時間 | S() | F() 無過期機制 |
| 緩存對象/資源 | S() | F() 僅簡單類型 |
| 分佈式部署 | S(Redis) | F() 僅本地文件 |
| 極高頻讀取、簡單數據 | F() | PHP return 最快 |
| 配置/字段/字典類靜態數據 | F() | 無過期、讀多寫少 |
| 查詢結果、會話、業務數據 | S() | 需過期、對象支援 |
性能優化技巧
- Opcode 緩存:開啟 OPcache,F() 文件直接編譯緩存,二次讀取極快
- 目錄分級:大量緩存文件使用
F('a/b/c', $v) 避免單目錄文件過多
- SSD 存儲:Runtime 目錄掛載 SSD 或 tmpfs 內存盤
- 避免大數組:單文件超過 1MB 考慮拆分或改用 S(Redis)
常見問題
| 問題 | 解決 |
| 綠色通道失效 | 檢查 RUNTIME_PATH 可寫、磁盤空間、inode 耗盡 |
| 數據不更新 | OPcache 未重置,重啟 php-fpm 或 opcache_reset() |
| 刪除失敗 | 權限問題、文件被進程佔用 |
| 包含失敗 | 緩存文件語法錯誤(手動修改導致),刪除重建 |
更多緩存技術:《ThinkPHP 緩存機制深度解析》、《PHP 高性能緩存策略》