﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	severity	resolution	keywords	cc
23381	update_option() stores unserialized value in object cache	rmccue		"`update_option()` and `add_option()` have inconsistent behaviour when storing items in the cache. `add_option()` stores the serialized version, whereas `update_option()` stores the raw data. When using APC for object caching, this can result in objects being loaded in `wp_load_alloptions()` before the class for it is defined in a plugin.

In `update_option()` (storing raw data):
{{{
	$_newvalue = $newvalue;
	$newvalue = maybe_serialize( $newvalue );

	// ...
			$alloptions[$option] = $_newvalue;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
	}
}}}

Whereas in `add_option()` (storing serialized data):
{{{
	$_value = $value;
	$value = maybe_serialize( $value );

	// ...
			$alloptions[$option] = $value;
			wp_cache_set( 'alloptions', $alloptions, 'options' );
}}}

Example plugin included, breaks horribly when using the APC cache, as that doesn't enforce serialization internally. This only occurs when using `update_option()` on an existing option.

Looks like this was introduced in r13673.

= Steps to reproduce =
  1. Install markjaquith's APC object caching plugin
  2. Activate my plugin. Each refresh will append an object to the array
  3. Note output is:
{{{
array(0) {
}
}}}
  4. Refresh. Note new output is:
{{{
array(1) {
  [0]=>
  object(rmccue_Test_Object)#275 (0) {
  }
}
}}}
  5. Refresh again. Output should be:
{{{
array(2) {
  [0]=>
  object(__PHP_Incomplete_Class)#5 (1) {
    [""__PHP_Incomplete_Class_Name""]=>
    string(18) ""rmccue_Test_Object""
  }
  [1]=>
  object(__PHP_Incomplete_Class)#6 (1) {
    [""__PHP_Incomplete_Class_Name""]=>
    string(18) ""rmccue_Test_Object""
  }
}
}}}"	defect (bug)	new	normal	3.6	Cache	3.0	normal		has-patch	themacmaster@…
