views:

27

answers:

2

Say I have this code in PHP :

$query = mysql_query("SELECT ...");

the statement returns a resource object. Normally it would get passed to mysql_fetch_array() or one of the mysql_fetch_* functions to populate the data set.

I'm wondering if the resouce object - the $query variable in this case can be cached in memcache and then a while later can be fetched and used just like the moment it's created.

// cache it
$memcache->set('query', $query);

// restore it later
$query = $memcache->get('query');

// reuse it
while(mysql_fetch_array($query)) { ... }

I have googled the question, didn't got much luck.

I'm asking this is because it looks way much light-weighted than the manner of "populate the result array first then cache".

So is it possible?

+2  A: 

I doubt it. From the serialize manual entry

serialize() handles all types, except the resource-type.

Edit: Resources are generally tied to the service that created them. I don't know if memcached uses serialize however I'd guess it would be subject to the same limitations.

Phil Brown
+2  A: 

The Memcache extension serializes objects before sending them to the Memcached server. As the other poster mentioned, resources can't be serialized. A resource is basically a reference to a network connection to the database server. You can't cache a network connection and reuse it later. You can only cache the data that gets transmitted over the connection.

With queries like that, you should fetch all rows before caching them.

$all_results = array();
while ($row = mysql_fetch_array($query)) {
    $all_results[] = $row;
}
$memcache->set('query', $all_results);

Modern database drivers such as MySQLi and PDO have a fetch_all() function that will fetch all rows. This simplifies things a bit.

When you retrieve that array later, you can just use foreach() to iterate over it. This doesn't work with very large query results (Memcached has a 1MB limit) but for most purposes you shouldn't have any problem with it.

kijin