首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Laravel 開發筆記:動態切換快取驅動、Facade 別名、Storage 權限問題解決

     編輯:PHP 相關知識

Laravel 實用開發筆記:配置動態修改、命名空間別名、權限排查

1. 動態切換快取驅動

執行時修改 config/cache.php 的 default 值,適用於多環境、多租戶、測試切換:

<?php
// 切換至 Redis
Config::set('cache.default', 'redis');
var_dump(Config::get('cache.default')); // "redis"

// 切換至 Memcached
Config::set('cache.default', 'memcached');
var_dump(Config::get('cache.default')); // "memcached"

// 驗證實際存取
Cache::put('test_key', 'value', 60);
echo Cache::get('test_key'); // value

// 注意:僅影響當前請求生命週期,不會持久化到配置檔
?>

2. Facade 根命名空間與別名

Laravel 服務容器綁定的 Facade 可用兩種方式存取:

<?php
// 完整命名空間
\Illuminate\Support\Facades\Cache::put('key', 'value');

// 根命名空間別名 (config/app.php aliases 設定)
Cache::put('key', 'value'); // 等同以上

// 原理:config/app.php
'aliases' => [
    'Cache' => \Illuminate\Support\Facades\Cache::class,
    // ...
]

// 服務容器綁定鍵名通常為小寫單數:cache, session, auth, db, log...
?>

3. Linux 下 Storage 目錄權限問題

常見錯誤:Unable to create directory storage/framework/cache/data 或 The stream or file could not be opened

解決步驟

# 1. 確認 Web 伺服器執行用戶 (nginx.conf / php-fpm.conf)
# 通常為 www-data (Debian/Ubuntu) 或 nginx (CentOS/RHEL) 或 www

# 2. 遞歸修改擁有者
chown -R www:www storage bootstrap/cache

# 3. 設定目錄權限 (775) 與檔案權限 (664)
find storage -type d -exec chmod 775 {} \;
find storage -type f -exec chmod 664 {} \;
find bootstrap/cache -type d -exec chmod 775 {} \;
find bootstrap/cache -type f -exec chmod 664 {} \;

# 4. 若使用 ACL (更精細控制)
setfacl -R -m u:www:rwx storage bootstrap/cache
setfacl -R -d -m u:www:rwx storage bootstrap/cache

# 5. 清除配置/路由/視圖快取
php artisan config:clear
php artisan route:clear
php artisan view:clear
php artisan cache:clear

# 6. 重新優化 (生產環境)
php artisan config:cache
php artisan route:cache
php artisan view:cache

權限問題檢查清單

症狀可能原因檢查指令
無法寫入 storage/logs目錄擁有者非 Web 用戶ls -la storage/
快取讀寫失敗storage/framework/cache 權限不足ls -la storage/framework/
上傳檔案失敗storage/app/public 不可寫ls -la storage/app/
Session 檔案錯誤storage/framework/sessions 權限ls -la storage/framework/sessions/
視圖編譯失敗storage/framework/views 權限ls -la storage/framework/views/

4. 額外實用技巧

快速清除所有快取

<?php
// 程式化清除
Artisan::call('cache:clear');
Artisan::call('config:clear');
Artisan::call('route:clear');
Artisan::call('view:clear');
Artisan::call('optimize:clear'); // Laravel 9+ 包含以上所有
?>

多資料庫連線動態切換

<?php
// 運行時切換預設連線
Config::set('database.default', 'pgsql');
// 或指定模型連線
$users = User::on('pgsql')->get();
// 查詢建構器
DB::connection('mysql')->table('users')->get();
?>

環境變數動態修改 (測試用)

<?php
// 僅影響當前進程
putenv('APP_ENV=testing');
$_ENV['APP_ENV'] = 'testing';
$_SERVER['APP_ENV'] = 'testing';
// 注意:config() 已快取不會重新讀取 .env
?>

常見坑點提醒

  • ❌ Config::set() 不會寫入 .env 或 config/*.php,僅記憶體生效
  • ❌ config:cache 後 env() 返回 null,務必在配置檔用 env('KEY', 'default')
  • ❌ Storage 權限設定後需重啟 PHP-FPM/Queue Worker 才生效
  • ✅ 部署腳本自動化權限設定(Deployer、GitHub Actions、Forge)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved