前篇:
http://www.cnblogs.com/galaxyyao/archive/2013/05/07/3065237.html
在和同事交流後發現,我自己把問題給偷換了,結果導致把自己框起來了。
原本我打算解決的問題是:
使用者的外掛程式目錄可能沒有寫入權限,無法更新外掛程式
而不是:
不使用檔案讀寫的形式來快取資料
因此完全可以在讀取完資料庫後,將資料臨時存在一個外掛程式擁有讀寫權限的目錄,例如臨時檔案夾。
於是按這個思路寫出了範例程式碼:
$tempFolderPath = sys_get_temp_dir();$handle;mkdir($tempFolderPath, 0777, TRUE);$tempFileName = $tempFolderPath . '\kancartplugin.txt';if (file_exists($tempFileName)) { $totalCode = file_get_contents($tempFileName); $totalCode= str_replace("$", "\$", $totalCode); eval($totalCode);} else {$handle = fopen($tempFileName, "x+");$totalCode="";//接下來從資料庫讀取代碼拼成$totalCode。需要注意讀完一行資料後添加一個\n,不然可能會和注釋連載一起。比如//end和class連在一起fwrite($handle, $totalCode);}
發現一個比較奇妙的現象是,我的測試程式會把臨時檔案儲存體到C:\Windows\Temp,但實際程式會存到C:\Users\使用者名稱\AppData\Local\Temp,明明是一樣的代碼。。。大概和環境變數的設定有關吧,等以後有時間再去好好研究。
更新:發現問題根源了:測試程式是跑在IIS下,而實際代碼是跑在Nginx下。對於IIS,臨時檔案夾是C:\Windows\Temp,對於Nginx,臨時檔案夾是C:\Users\使用者名稱\AppData\Local\Temp。如果要進一步深究原因的話,應該是IIS是用系統帳號在啟動並執行,而Nginx是用我的個人帳號在運行。