2012-04-05 5 views
3

私は絞り込むことができないような問題に遭遇しています。 Zend Frameworkアプリケーションでは、Zend Cacheを使用してカスタム応答オブジェクトに含まれている潮汐データと気象データをキャッシュしています。データが最初に作成された時点で、すべて正常に動作します。それをシリアル化してキャッシュします。それから私はリフレッシュを打つ、それはキャッシュからデータを引き出したときに、私は次のエラーを取得する:奇妙な動作オブジェクトをシリアライズしてキャッシュする

Message: String could not be parsed as XML

Stack trace:

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."'>"); 

... 

は(前キャッシュへの)最初の実行上のオブジェクトの関連部分のダンプです:

あなたが「...」他のXMLデータがたくさんある参照
["_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はNWS(National Weather Service)APIから来ており、XMLバリデーターで実行しました。エラーは表示されません。問題は、オブジェクトをシリアル化してキャッシュするとすぐに発生します。ここで私は私のZendのキャッシュを設定している方法です。

// 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) "alabama" ["location"]=> string(32) "bayou-la-batre-mississippi-sound" } ["return_type"]=> string(4) "JSON" ["time_range"]=> array(2) { ["start"]=> object(DateTime)#64 (3) { ["date"]=> string(19) "2012-04-05 18:06:51" ["timezone_type"]=> int(3) ["timezone"]=> 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) "bayou-la-batre-mississippi-sound" ["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) "Alabama" ["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.0529290086617618;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) " meteorological forecast 2012-04-05T18:06:57Z http://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.28 k-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 Daily Maximum Temperature 81 Daily Minimum Temperature 63 Temperature 79 79 74 69 67 Dew Point Temperature 66 65 64 64 61 Wind Speed 12 11 11 13 14 Wind Direction 240 260 280 300 330 Relative Humidity 64 63 71 84 81 Weather Type, Coverage, and Intensity Conditions Icons 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.jpg http://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 }

I ソースの表示が、私はそれので、それをコピーして貼り付けていないよと、「weatherResults」セクションには、そこにXMLを持っていますむしろ長い。/unserializingをシリアライズし、キャッシュを保存するプロセスでは

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) "alabama" ["location"]=> string(32) "bayou-la-batre-mississippi-sound" } ["return_type"]=> string(4) "JSON" ["time_range"]=> array(2) { ["start"]=> object(DateTime)#64 (3) { ["date"]=> string(19) "2012-04-05 18:10:30" ["timezone_type"]=> int(3) ["timezone"]=> 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"]=> string(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(またはその他のキャッシングライブラリについて)のオブジェクトをキャッシュする際に問題に遭遇しましたか?これはシリアル化と関係がありますか?キャッシュ設定がありませんか?長い説明を申し訳ありませんし、事前にあなたの助けをありがとう!

答えて

6

PHPリソースはシリアライズできませんこれはオブジェクト(シンプルXMLオブジェクトを間接的にシリアライズする)をシリアル化することができない理由です。

シリアル化する前に、オブジェクトを整形式のXMLストリング(SimpleXMLElement::asXML())に変換し、オブジェクトがシリアル化されていない場合は、文字列をSimpleXMLオブジェクト(simplexml_load_string())に変換し直す必要があります。

See here詳細については、 This questionも有用です。新しい詳細後


編集:あなたの質問では、これらの新しい要素を持つ、私はあなたの問題はシリアル化されたSimpleXMLオブジェクトから来ていないことを理解しています。 automatic_serializationを使用しない理由はありますか?(ちなみに、 "私は"と書いてありますが、間違っていると思います)。Zend_Cacheは自動的にシリアライズ/アンシリアル化されます。


編集#2:最終的な解決のためのcillosisから怒鳴るのコメントを読んで。

+0

XMLは** ** SimpleXMLオブジェクトではありません。これは、APIコールから返される文字列で、これは '[" weatherResults "] => string(6399)" ... "'から見ることができます。私はPHPリソースをシリアライズできないことを認識しています。これは標準オブジェクトであり、エラーをスローせずに正常にシリアル化します。他のアイデア? –

+1

さて、私はあなたにstacktraceを読んでいるだけですが、間違っているかもしれませんが、SimpleXMLオブジェクトをシリアライズしようとしているようです: '0/home/cillosis/mysites/tidely/application/views/scripts/tides/location.phtml(38):SimpleXMLElement - > __ construct( '')。デバッガは何を言っていますか? 38行目には何がありますか? – Liyali

+0

いいえ、私はそうではありません。上記の編集で、文字列値 '$ this-> response - > _ weatherdata-> weatherResults'からSimpleXMLオブジェクトを作成してください。非直列化は、私がキャッシングを行う場所の上のコードのビットで行われます。シリアライゼーション/シリアライゼーションのある時点でオブジェクトをリセットしています(より良い単語がないため)。これは、PHPでキャッシュしている間に初めてこの問題に遭遇したときです。 –