Jer*_*ris 3 php serialization zend-framework zend-cache
我遇到了一个似乎无法缩小范围的问题.在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."'>");
...
Run Code Online (Sandbox Code Playgroud)
这是第一次运行时(缓存之前)对象的相关部分的转储:
["_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> "
Run Code Online (Sandbox Code Playgroud)
你看到"......"的地方还有很多其他的XML数据.XML来自NWS(国家气象服务)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);
Run Code Online (Sandbox Code Playgroud)
我正在使用这个进行缓存和检索:
// 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);
}
Run Code Online (Sandbox Code Playgroud)
一旦我发出请求并将其缓存,$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.4140 28460259932; 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"] =>字符串(6399)"气象预报2012-04-05T18:06:57Z http://graphical.weather.gov/xml/气象发展实验室产品生成分支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和文本字段2 = -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每日最高温度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.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}
当我查看源代码时,"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 )"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 ["lo gMessage"] => 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(或任何其他缓存库)缓存对象?这与序列化有关吗?我缺少缓存设置吗?对不起,给出了很长的解释,并提前感谢您的帮助!
PHP资源无法序列化,这就是您无法序列化对象(将间接序列化SimpleXML对象)的原因.
在序列化之前,您需要将对象转换为格式良好的XML字符串(SimpleXMLElement::asXML()),并且在对象反序列化后,将字符串重新转换为SimpleXML对象(simplexml_load_string()).
在新细节之后编辑:在您的问题中使用这些新元素,我知道您的问题不是来自序列化的SimpleXML对象.你有什么理由不使用automatic_serialization吗?(顺便说一句是" 我 ",我猜你拼错了)而不是让Zend_Cache自动序列化/反序列化你的对象.
编辑#2:阅读cillosis的评论,以获得最终解决方案.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |