私は常に同じキャッシュクラスを使用して要素の配列をファイルにキャッシュしていましたが、毎回うまくいきました。しかし、Flight PHP マイクロ フレームワークで使用しようとすると、動作しません。これは、ページウィッチキャッシュに向ける私のindex.php部分です。
Flight::route('/results/@uzklausa', function($uzklausa){
//include 'funcs/functions.new.php';
include 'funcs/simple_html_dom.php';
Flight::register('db2', 'PDO', array('mysql:host=localhost;port=3306;dbname=rasti_failai', 'root', 'pw'), function($db) {
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
});
//Flight::etag($uzklausa);
Flight::set('uzklausa', $uzklausa);
Flight::render('search_main', array('uzklausa' => $uzklausa));
Flight::render('footer');
});
そして、これが私のsearch_main.phpファイル魔女キャッシュクラスです:
$uzkla = str_replace('-', ' ', Flight::get('uzklausa'));
class FileCache {
// Funkcija issaugoti informacijai
function store($key,$data,$ttl) {
// Atidarom faila
$h = fopen($this->getFileName($key),'w');
if (!$h) throw new Exception('Could not write to cache');
// Serializinam su TTL
$data = serialize(array(time()+$ttl,$data));
if (fwrite($h,$data)===false) {
throw new Exception('Could not write to cache');
}
fclose($h);
}
// paprasta funkcija kad surasti faila pagal key
private function getFileName($key) {
return 'newcache/s_cache' . md5($key);
}
//grazina false on failure
function fetch($key) {
$filename = $this->getFileName($key);
if (!file_exists($filename) || !is_readable($filename)) return false;
$data = file_get_contents($filename);
$data = @unserialize($data);
if (!$data) {
// Unlinkinam file kai unserializing failed
unlink($filename);
return false;
}
// tikrinam ar expired
if (time() > $data[0]) {
// Unlinkinam
unlink($filename);
return false;
}
return $data[1];
}
}
次に、キャッシュする必要がある配列を返す関数に進みます。
function pirmi_rezultatai($uzklausa)
{ some php code wich works fine and is displayed if no cache is on }
次に、cacheClass を使用して配列をキャッシュする関数:
$cache = new FileCache();
function rezultataiVienas($uzklausa) {
global $cache;
// Unikalus key ID
$key = 'pirmas-'.$uzklausa.''; //ALso tried changing this to $key = 'pirmas'; for debug, nothing changed
// tikrinam ar jau cachintas
if (!$data = $cache->fetch($key)) {
//Jei nera atliekam nauja funkcija ir paimam duomenis
$data = pirmi_rezultatai($uzklausa);
//ir juos uzcachinam
$cache->store($key,$data,1440000); // 1440000 2592000 12960000
}
return $data;
}
$pirmiRezai = rezultataiVienas($uzkla);
print_r($pirmiRezai);
そして、このコードで mydomain.com/results/anything にアクセスすると、次のようになります: Fatal error: Call to a member function fetch() on a non-object in /var/www/ctifiles/views/search_main.php on line 136
私が変わるとき
$pirmiRezai = rezultataiVienas($uzkla);
に
$pirmiRezai = pirmi_rezultatai($uzkla);
コードの最後で、完全に正常に動作するため、問題は cacheClass にあります。また、このクラスは、同じWebサーバー上の他のドメインであっても、他の場所でうまく機能します。問題はフライトフレームワークの使用にあると思いますか?