絞り込めないように見える問題に直面しています。Zend Framework アプリケーションでは、Zend Cache を使用して、カスタムのResponseオブジェクトに含まれる潮と天気のデータをキャッシュしています。データが最初に作成された時点で、すべてが正常に機能します。シリアル化してキャッシュします。次に、更新を押してキャッシュからデータを取得すると、次のエラーが発生します。
メッセージ: 文字列を XML として解析できませんでした
スタックトレース:
0 /home/cillosis/mysites/tidely/application/views/scripts/tides/location.phtml(38): SimpleXMLElement->__construct('')
1 /home/cillosis/mysites/tidely/library/Zend/View.php(108): include('/home/cillosis/...')
2 /home/cillosis/mysites/tidely/library/Zend/View/Abstract.php(888): Zend_View->_run('/home/cillosis/...')
...
これは、カスタムの「応答オブジェクト」に含まれる XML に次のようにアクセスしているビューで発生します。
<div class="data-box">
<h3>Current Weather</h3>
<hr>
<?php
// *** THIS IS LINE 38 ***
$weather_XML = new SimpleXMLElement($this->response->_weatherdata->weatherResults);
$params = $weather_XML->data->parameters;
$img_path = $params->{'conditions-icon'}->{'icon-link'};
echo("<img src='".$img_path."'>");
...
最初の実行時 (キャッシュ前) のオブジェクトの関連部分のダンプを次に示します。
["_weatherdata"]=>
object(Tidely_WeatherData)#79 (6) {
["weatherResults"]=>
string(6399) "<?xml version="1.0"?>
<dwml version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd">
...
</dwml> "
「...」が表示されている場所には、他にも多くの XML データがあります。XML は NWS (National Weather Service) API から取得したもので、XML バリデーターで実行しましたが、エラーは表示されません。オブジェクトをシリアル化してキャッシュするとすぐに問題が発生します。Zend Cache のセットアップ方法は次のとおりです。
// Setup caching
$frontendOptions = array('lifeTime' => 30, 'automatic_seralization' => false);
$backendOptions = array('cache_dir' => '../application/cache');
$this->_cache = Zend_Cache::factory('Core', 'File', $frontendOptions, $backendOptions);
私はこれでキャッシングと検索を行っています:
// Assign cache id
// Example query: "Chesapeake Bay Virginia"
$cache_id = 'request_results_' . $this->response->_querydata->query);
$cache_id = str_replace(' ', '_', $cache_id);
$cache_id = str_replace('-', '_', $cache_id);
// Check cache for this query
if ( ($results = $this->_cache->load($cache_id)) === false)
{
// Cache not found, process request and generate response
...
// Cache request output for specific query
$serialized_data = serialize($this->response);
$this->_cache->save($serialized_data, $cache_id);
// Return processed request results
return $this->response;
}
else
{
// Return results from cache
return unserialize($results);
}
リクエストを作成してキャッシュすると、$this->response
オブジェクトは次のように出力されます。
object(Tidely_ResponseData)#65 (7) { ["_querydata"]=> object(Tidely_QueryData)#66 (9) { ["query"]=> string(40) "bayou-la-batre-mississippi-sound alabama" ["source"]=> string(15) "TidesController" ["request_type"]=> string(3) "url" ["url_components"]=> array(2) { ["state"]=> string(7) ) "アラバマ州" ["場所"]=> 文字列(32) "バイユー・ラ・バトル-ミシシッピ州の音" } ["return_type"]=> 文字列(4) "JSON" ["time_range"]=> 配列( 2) { ["start"]=> object(DateTime)#64 (3) { ["date"]=> string(19) "2012-04-05 18:06:51" ["timezone_type"]=> int(3) ["タイムゾーン"]=> string(3) "UTC" } ["end"]=>object(DateTime)#63 (3) { ["date"]=> string(19) "2012-04-06 18:06:51" ["timezone_type"]=> int(3) ["timezone"]= > string(3) "UTC" } } ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["_locationdata"]=> object(Tidely_LocationData)# 80 (31) { ["location_id"]=> string(5) "18921" ["station_name"]=> string(33) "Bayou La Batre, Mississippi Sound" ["station_url_name"]=> string(32) "バイユー・ラ・バットル・ミシシッピ・サウンド" ["station_type"]=> string(11) "Subordinate" ["station_id"]=> string(7) "8739051" ["station_lat"]=> string(8) " +30.3717" ["station_lon"]=> string(8) "-88.2750" ["station_height_offset_high"]=> string(5) "*1.23" ["station_height_offset_low"]=> string(5) "*1.23" ["station_time_offset_high"]=> string(3) "112" ["station_time_offset_low" ]=> string(2) "74" ["station_ref_station_id"]=> string(7) "8760551" ["state_id"]=> string(1) "1" ["state_name"]=> string(7) "アラバマ" ["state_url_name"]=> string(7) "alabama" ["timezone"]=> string(2) "-6" ["dst"]=> string(1) "1" ["city_name"] => string(14) "Bayou La Batre" ["city_zip"]=> string(5) "36509" ["city_lat"]=> string(7) "30.4014" ["city_lon"]=>string(8) "-88.2467" ["adjacentStations"]=> string(321) "a:10:{i:8739051;d:2.6562027890531361;s:7:"TEC4393";d:8.052929008617618;i:8740448;d :11.564338218805837;i:8735180;d:14.637787569358004;i:8741196;d:17.602722038773138;i:8734635;d:17.824002491920826;i:8733810;d:19.474837234444919;i:8737048;d:24.414028460259932;i:8742221;d:27.466706516499691 ;i:8731952;d:31.251405048051701;}" ["city_distance"]=> string(15) "2.6562027890531" ["multipleResults"]=> string(0) "" ["multipleCount"]=> int(0) [ "hasMultiple"]=> bool(false) ["showStates"]=> bool(false) ["showLocations"]=> bool(false) ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["_tidedata"]=> object(Tidely_TideData)#68 (6) { ["tideResults"]=> NULL ["queryStart"]=> NULL ["queryEnd"]=> NULL ["hasError"]=> bool(false) [" userMessage"]=> NULL ["logMessage"]=> NULL } ["_weatherdata"]=> object(Tidely_WeatherData)#79 (6) { ["weatherResults"]=> string(6399) " 気象予報 2012-04- 05T18:06:57Zhttp://graphical.weather.gov/xml/ Meteorological Development LaboratoryProduct Generation Branch http://www.nws.noaa.gov/disclaimer.html http://www.weather.gov/ http://www.weather. gov/images/xml_logo.gif http://www.weather.gov/feedback.php point1 http://forecast.weather.gov/MapClick.php?textField1=30.37&textField2=-88.28k-p24h-n1-1 2012-04-05T08:00:00-05:00 2012-04-05T20:00:00-05:00 k-p24h-n1-2 2012-04-05T20:00:00- 05:00 2012-04-06T09:00:00-05:00 k-p3h-n5-3 2012-04-05T13:00:00-05:00 2012-04-05T16:00:00-05:00 2012 -04-05T19:00:00-05:00 2012-04-05T22:00:00-05:00 2012-04-06T01:00:00-05:00 日最高気温 81 日最低気温 63 気温 79 79 74 69 67 露点温度 66 65 64 64 61 風速 12 11 11 13 14 風向 240 260 280 300 330 相対湿度 64 63 71 84 81 気象の種類、範囲、強度 条件 アイコンhttp://forecast.weather.gov/ images/wtf/tsra60.jpg http://forecast.weather.gov/images/wtf/tsra60.jpg http://forecast.weather.gov/images/wtf/scttsra60.jpg http://forecast.weather.gov /images/wtf/nscttsra20.jpghttp://forecast.weather.gov/images/wtf/nsct.jpg " ["queryStart"]=> float(1333649211.6989) ["queryEnd"]=> float(1333649217.2038) ["hasError"]=> bool(false) ) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL }
ソースを表示すると、「weatherResults」セクションに XML があります。かなり長いので、コピーして貼り付けません。更新を押して、上記のオブジェクトのキャッシュされたコピーを使用すると、次のようになります。
object(Tidely_ResponseData)#65 (7) { ["_querydata"]=> object(Tidely_QueryData)#66 (9) { ["query"]=> string(40) "bayou-la-batre-mississippi-sound alabama" ["source"]=> string(15) "TidesController" ["request_type"]=> string(3) "url" ["url_components"]=> array(2) { ["state"]=> string(7) ) "アラバマ州" ["場所"]=> 文字列(32) "バイユー・ラ・バトル-ミシシッピ州の音" } ["return_type"]=> 文字列(4) "JSON" ["time_range"]=> 配列( 2) { ["start"]=> object(DateTime)#64 (3) { ["date"]=> string(19) "2012-04-05 18:10:30" ["timezone_type"]=> int(3) ["タイムゾーン"]=> string(3) "UTC" } ["end"]=>object(DateTime)#63 (3) { ["date"]=> string(19) "2012-04-06 18:10:30" ["timezone_type"]=> int(3) ["timezone"]= > string(3) "UTC" } } ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["_locationdata"]=> object(Tidely_LocationData)# 67 (31) { ["location_id"]=> string(0) "" ["station_name"]=> string(0) "" ["station_url_name"]=> string(0) "" ["station_type"]= > string(0) "" ["station_id"]=> string(0) "" ["station_lat"]=> string(0) "" ["station_lon"]=> string(0) "" ["station_height_offset_high" ]=> 文字列(0) "" ["station_height_offset_low"]=> string(0) "" ["station_time_offset_high"]=> string(0) "" ["station_time_offset_low"]=> string(0) "" ["station_ref_station_id"]=> string(0) "" ["state_id"]=> string(0) "" ["state_name"]=> string(0) "" ["state_url_name"]=> string(0) "" ["timezone"]=> string(0) "" ["dst"]=> string(0) "" ["city_name"]=> string(0) "" ["city_zip"]=> string(0) "" ["city_lat"]=> string( 0) "" ["city_lon"]=> string(0) "" ["adjacentStations"]=> string(0) "" ["city_distance"]=> string(0) "" ["multipleResults"]=> string(0) "" ["multipleCount"]=> int(0) ["hasMultiple"]=> bool(false) ["showStates"]=> bool(false) ["showLocations"]= > bool(false) ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["_tidedata"]=> object(Tidely_TideData)#68 (6) { ["tideResults"]=> NULL ["queryStart"]=> NULL ["queryEnd"]=> NULL ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL } ["_weatherdata"]=> object(Tidely_WeatherData)#69 (6) { ["weatherResults"]=> NULL ["queryStart"]=> NULL ["queryEnd"]=> NULL ["hasError"]=> bool(false) ["userMessage"]=>NULL ["logMessage"]=> NULL } ["hasError"]=> bool(false) ["userMessage"]=> NULL ["logMessage"]=> NULL }
キャッシュをシリアライズ/アンシリアライズして保存する過程で、どういうわけかすべての文字列を空または NULL に設定します! もちろん、空なので XML エラーが発生します。
Zend Cache (またはその他のキャッシュ ライブラリ) を使用してオブジェクトをキャッシュする際に問題が発生した人はいますか? これはシリーズ化と関係がありますか?不足しているキャッシュ設定はありますか? 長い説明で申し訳ありませんが、よろしくお願いします!