现在5.4.x已经在EOL,我们正在跳转到5.6,所以我们实际上可以回到功能上。但是我们遇到了:
Strict standards: Declaration of Hobis_Api_Cache::get() should be compatible with Memcached::get($key, $cache_cb = NULL, &$cas_token = NULL, &$udf_flags = NULL)
...警告。
它看起来像一个主要的SF2包:LswMemcacheBundle有同样的问题,但他们的“修复”是将API从Memcached切换到Memcache,这可能有效,但我们之所以选择Memcached是有原因的。然而,用于memcached的php包装器的维护者显然不会将this issue视为高优先级。然而,由于5.4 EOL,更多用户被迫更新到5.5+,我认为这个问题需要尽快解决。
所以我的问题是,有没有人想出这个问题的优雅解决方案?
我们的内部中间件(Hobis_Api)保护了我们一点点,因为我可以打破set
和get
函数并将它们放在自己的类中,它不会扩展Memcached,然后将它们视为基于当前php版本ID的包装函数,如下所示:
// Now
class Hobis_Api_Cache extends memcached
{
public function set($key, $value, $expiry = self::EXPIRY_DEFAULT) {}
}
// Proposed
class Hobis_Api_Cache_Package
{
public static function set($key, $value, $expiry, $udfs)
{
$cache = new Memcached;
if (PHP_VERSION_ID < 50500) {
$cache->set($key, $value, $expiry);
} else {
$cache->set($key, $value, $expiry, $udfs);
}
}
}
但显然这将是一个PITA b / c我必须将所有调用代码从$cache->set()
更新为Hobis_Api_Cache_Package::set()
答案 0 :(得分:1)
对保罗的建议,这是最终结果:
class Hobis_Api_Cache extends memcached
{
/**
* Magic method override so we can use our version of get/set
* Otherwise default get/set will break in php 5.5+
*
* @param string
* @param array
*/
public function __call($name, $arguments)
{
switch ($name)
{
// Override due to 5.5+ using php-memcache 2.2
case 'get':
$this->myGet($arguments);
break;
// Override due to 5.5+ using php-memcache 2.2
case 'set':
$this->mySet($arguments);
break;
}
}
}
这只有在你使用自己的类扩展memcached类时才有效,如果没有,那么你可能要考虑添加自己的类。