@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at upstream/main 55 lines 1.4 kB view raw
1<?php 2 3/** 4 * Proxies another cache and serializes values. 5 * 6 * This allows more complex data to be stored in a cache which can only store 7 * strings. 8 */ 9final class PhabricatorKeyValueSerializingCacheProxy 10 extends PhutilKeyValueCacheProxy { 11 12 public function getKeys(array $keys) { 13 $results = parent::getKeys($keys); 14 15 $reads = array(); 16 foreach ($results as $key => $result) { 17 $structure = @unserialize($result); 18 19 // The unserialize() function returns false when unserializing a 20 // literal `false`, and also when it fails. If we get a literal 21 // `false`, test if the serialized form is the same as the 22 // serialization of `false` and miss the cache otherwise. 23 if ($structure === false) { 24 static $serialized_false; 25 if ($serialized_false === null) { 26 $serialized_false = serialize(false); 27 } 28 if ($result !== $serialized_false) { 29 continue; 30 } 31 } 32 33 $reads[$key] = $structure; 34 } 35 36 return $reads; 37 } 38 39 public function setKeys(array $keys, $ttl = null) { 40 $writes = array(); 41 foreach ($keys as $key => $value) { 42 if (is_object($value)) { 43 throw new Exception( 44 pht( 45 'Serializing cache can not write objects (for key "%s")!', 46 $key)); 47 } 48 $writes[$key] = serialize($value); 49 } 50 51 return parent::setKeys($writes, $ttl); 52 } 53 54 55}