0

memcacheサーバーをrailsおよびphpサーバーと共有しようとしています。

レール:

my_var = {'one'=>1,'two'=>2}
Rails.cache.write 'hello', PHP.serialize(my_var), :raw => true
Rails.cache.read 'hello'

出力:

"a:2:{s:3:\"one\";i:1;s:3:\"two\";i:2;}"

PHP:

$var = self::$memcache->get('hello');
die(var_dump($var));

出力:

"a:2:{s:3:\"one\";i:1;s:3:\"two\";i:2;}"

PHP.serializeは、gemphp_serializeの関数です。私のPHPサーバーがhelloを取得し、配列を生成できることを期待していました。誰かが私がここで間違っている部分を助けてくれませんか?

ありがとうございました

4

2 に答える 2

1

Memcachedは、シリアル化された(マーシャリングされた)文字列を返します。実際の配列を使用するには、Rubyで配列をシリアル化する必要があるのと同じように、最初にPHPで配列をアンシリアル化する必要があります。

試す

$var = unserialize(self::$memcache->get('hello'));
die(var_dump($var));
于 2012-05-29T11:17:05.847 に答える
0

PHPおよびここでrubyのシリアル化とは、オブジェクトをテキスト表現、つまりフラットな文字列に変換することを意味します。PHPでは、これは関数serializeを使用して行われます。したがって、渡されたオブジェクトの新しいインスタンスを実際に作成するには、 PHPの別の関数が必要なこのテキスト表現からオブジェクトを再作成する必要があります。

したがって、@ chiborgが言ったように、ここでunserializeを使用すると、配列が取得されます。

var_dump(unserialize("a:2:{s:3:\"one\";i:1;s:3:\"two\";i:2;}"));

array(2) {
  ["one"]=>
  int(1)
  ["two"]=>
  int(2)
}
于 2012-05-29T11:26:13.137 に答える