0

状態の選択オプションを出力するインクルード ファイルを含む Web フォームがあります。htmlは次のようになります

    <select name="state" id="state">
        <option value="">--</option>
        <?php include ("resources/data/stateoptions.php"); ?>
      </select>

状態オプションは Web サービスを呼び出して、店舗の場所のリストが常に最新の状態になるようにします。ただし、このお問い合わせフォーム ページの実行速度は非常に遅いようです (このインクルードを削除すると、はるかに高速になります)。だから私はWebサービスの呼び出しをキャッシュしたい。私の状態オプションファイルは次のようになります

<?php
  $cachefile = "cache/states.html";
  $cachetime = 5 * 60; // 5 minutes

  // Serve from the cache if it is younger than $cachetime
  if (file_exists($cachefile) && (time() - $cachetime < filemtime($cachefile))) 
  {
     include($cachefile);

     echo "<!-- Cached ".date('jS F Y H:i', filemtime($cachefile))." 
     -->n";

     exit;
  }

  ob_start(); // start the output buffer
?>

<?php
//url of locations web service
$serviceURL = 'http://webserviceurl/state';

//query the webservice
$string = file_get_contents($serviceURL);

//decode the json response into an array
$json_a=json_decode($string,true);

foreach( $json_a as $State => $IdealState){
$IdealState = $IdealState[State];
$IdealState2 = str_replace(' ', '-', $IdealState);
echo '<option value='.$IdealState2.'>'.$IdealState.'</option>';
}
?>

<?php
// open/create cache file and write data
$fp = fopen($cachefile, 'w'); 
// save the contents of output buffer to the file
fwrite($fp, ob_get_contents()); 
// close the file
fclose($fp); 
// Send the output to the browser
ob_end_flush(); 
?>

このファイルを直接呼び出すと、すべてが期待どおりに機能し、states.html ファイルが作成されます。しかし何らかの理由で、stateoptions.php ファイルがコンタクト フォーム ページに含まれていると、キャッシュ ファイルが作成されず、速度の問題が解決しません。私はかなり初心者のプログラマーなので、どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

1

ここでの問題は、おそらく相対パスと作業ディレクトリです。インクルードされたファイルは、呼び出し元のスクリプトから作業ディレクトリを継承します。ファイルが存在する場所の作業ディレクトリを自動的に取得することはありません。

魔法の__DIR__定数のようなものを使用して絶対パスを作成するか、それに応じて相対パスを調整する必要があります。

ここで少し手足を踏み出して、最初の行を次のように変更すると、次のようになります。

$cachefile = "resources/data/cache/states.html";

...おそらく、期待どおりに機能することがわかります。

于 2013-01-03T15:43:05.880 に答える