Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
M
memcache
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Custom Issue Tracker
Custom Issue Tracker
Labels
Merge Requests
1
Merge Requests
1
Requirements
Requirements
List
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Analytics
Analytics
Code Review
Insights
Issue
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
project
memcache
Commits
f5dbe3fb
Commit
f5dbe3fb
authored
May 22, 2007
by
robertDouglass
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactored all dmemcache functions into separate include
parent
2f7c4147
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
209 additions
and
393 deletions
+209
-393
dmemcache.inc
dmemcache.inc
+206
-0
memcache.db.inc
memcache.db.inc
+1
-196
memcache.inc
memcache.inc
+1
-196
memcache.module
memcache.module
+1
-1
No files found.
dmemcache.inc
0 → 100644
View file @
f5dbe3fb
<?php
// $Id$
/*
* Core dmemcache functions required by:
* memcache.inc
* memcache.db.inc
* session-memcache.inc
* session-memcache.db.inc
*/
global
$_memcache_statistics
;
$_memcache_statistics
=
array
(
'get'
=>
array
(),
'set'
=>
array
(),
'hit'
=>
array
());
/*
* A memcache API for Drupal.
*/
/**
* Place an item into memcache
*
* @param $key The string with with you will retrieve this item later.
* @param $value The item to be stored.
* @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
* (but memcached server doesn't guarantee this item to be stored all the time, it could be
* deleted from the cache to make place for other items).
* @param $bin The name of the Drupal subsystem that is making this call. Examples could be
* 'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
* different memcache servers.
*
* @return bool
*/
function
dmemcache_set
(
$key
,
$value
,
$exp
=
0
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'set'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
if
(
!
$mc
->
set
(
$full_key
,
$value
,
TRUE
,
$exp
))
{
watchdog
(
'memcache'
,
'Failed to set key: '
.
$full_key
,
WATCHDOG_ERROR
);
}
else
{
return
TRUE
;
}
}
return
FALSE
;
}
/**
* Retrieve a value from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return The item which was originally saved or FALSE
*/
function
dmemcache_get
(
$key
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'get'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
$result
=
$mc
->
get
(
$full_key
);
if
(
$result
)
{
$_memcache_statistics
[
'hit'
][]
=
$key
;
}
return
$result
;
}
}
/**
* Deletes an item from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_delete
(
$key
,
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
return
$mc
->
delete
(
$full_key
);
}
return
FALSE
;
}
/**
* Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
* resources, it only marks all the items as expired, so occupied memory will be overwritten by
* new items.
*
* @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
* as $bin. There is no way at this time to empty just one bin.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_flush
(
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
flush
();
}
}
function
dmemcache_stats
(
$bin
=
'cache'
,
$type
=
''
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
getExtendedStats
(
$type
);
}
}
/**
* Returns an Memcache object based on the bin requested. Note that there is
* nothing preventing developers from calling this function directly to get the
* Memcache object. Do this if you need functionality not provided by this API
* or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
* delete, flush) API functions provided here.
*
* @param $bin The bin which is to be used.
*
* @param $flush Rebuild the bin/server/cache mapping.
*
* @return an Memcache object or FALSE.
*/
function
dmemcache_object
(
$bin
=
NULL
,
$flush
=
FALSE
)
{
static
$memcacheCache
=
array
(),
$memcache_servers
,
$memcache_bins
;
if
(
$flush
)
{
foreach
(
$memcacheCache
as
$cluster
)
{
$cluster
->
close
();
}
$memcacheCache
=
array
();
}
if
(
empty
(
$memcacheCache
)
||
empty
(
$memcacheCache
[
$bin
]))
{
// $memcache_servers and $memcache_bins originate from settings.php.
// $memcache_servers_custom and $memcache_bins_custom get set by
// memcache.module. They are then merged into $memcache_servers and
// $memcache_bins, which are statically cached for performance.
if
(
empty
(
$memcache_servers
))
{
// Values from settings.php
$memcache_servers
=
variable_get
(
'memcache_servers'
,
array
(
'127.0.0.1:11211'
=>
'default'
));
$memcache_bins
=
variable_get
(
'memcache_bins'
,
array
(
'cache'
=>
'default'
));
}
// If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
$cluster
=
empty
(
$memcache_bins
[
$bin
])
?
'default'
:
$memcache_bins
[
$bin
];
// If this bin isn't in our $memcache_bins configuration array, and the
// 'default' cluster is already initialized, map the bin to 'cache' because
// we always map the 'cache' bin to the 'default' cluster.
if
(
empty
(
$memcache_bins
[
$bin
])
&&
!
empty
(
$memcacheCache
[
'cache'
]))
{
$memcacheCache
[
$bin
]
=
&
$memcacheCache
[
'cache'
];
}
else
{
// Create a new Memcache object. Each cluster gets its own Memcache object.
$memcache
=
new
Memcache
;
// A variable to track whether we've connected to the first server.
$init
=
FALSE
;
// Link all the servers to this cluster.
foreach
(
$memcache_servers
as
$s
=>
$c
)
{
if
(
$c
==
$cluster
)
{
list
(
$host
,
$port
)
=
explode
(
':'
,
$s
);
// This is a server that belongs to this cluster.
if
(
!
$init
)
{
// First server gets the connect.
if
(
@
$memcache
->
addServer
(
$host
,
$port
))
{
// Only set init to true if a connection was made.
$init
=
TRUE
;
}
}
else
{
// Subsequent servers gett addServer.
@
$memcache
->
addServer
(
$host
,
$port
);
}
}
}
if
(
$init
)
{
// Map the current bin with the new Memcache object.
$memcacheCache
[
$bin
]
=
$memcache
;
// Now that all the servers have been mapped to this cluster, look for
// other bins that belong to the cluster and map them too.
foreach
(
$memcache_bins
as
$b
=>
$c
)
{
if
(
$c
==
$cluster
&&
$b
!=
$bin
)
{
// Map this bin and cluster by reference.
$memcacheCache
[
$b
]
=
&
$memcacheCache
[
$bin
];
}
}
}
}
}
return
empty
(
$memcacheCache
[
$bin
])
?
FALSE
:
$memcacheCache
[
$bin
];
}
function
dmemcache_key
(
$key
,
$bin
=
'cache'
)
{
static
$prefix
;
// memcache_key_prefix can be set in settings.php to support site namespaces
// in a multisite environment.
if
(
empty
(
$prefix
))
{
$prefix
=
variable_get
(
'memcache_key_prefix'
,
''
);
}
$full_key
=
(
$prefix
?
$prefix
.
'-'
:
''
)
.
$bin
.
'-'
.
$key
;
return
urlencode
(
$full_key
);
}
memcache.db.inc
View file @
f5dbe3fb
<?php
// $Id$
global
$_memcache_statistics
;
$_memcache_statistics
=
array
(
'get'
=>
array
(),
'set'
=>
array
(),
'hit'
=>
array
());
/*
* A memcache API for Drupal.
*/
/**
* Place an item into memcache
*
* @param $key The string with with you will retrieve this item later.
* @param $value The item to be stored.
* @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
* (but memcached server doesn't guarantee this item to be stored all the time, it could be
* deleted from the cache to make place for other items).
* @param $bin The name of the Drupal subsystem that is making this call. Examples could be
* 'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
* different memcache servers.
*
* @return bool
*/
function
dmemcache_set
(
$key
,
$value
,
$exp
=
0
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'set'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
if
(
!
$mc
->
set
(
$full_key
,
$value
,
TRUE
,
$exp
))
{
watchdog
(
'memcache'
,
'Failed to set key: '
.
$full_key
,
WATCHDOG_ERROR
);
}
else
{
return
TRUE
;
}
}
return
FALSE
;
}
/**
* Retrieve a value from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return The item which was originally saved or FALSE
*/
function
dmemcache_get
(
$key
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'get'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
$result
=
$mc
->
get
(
$full_key
);
if
(
$result
)
{
$_memcache_statistics
[
'hit'
][]
=
$key
;
}
return
$result
;
}
}
/**
* Deletes an item from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_delete
(
$key
,
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
return
$mc
->
delete
(
$full_key
);
}
return
FALSE
;
}
/**
* Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
* resources, it only marks all the items as expired, so occupied memory will be overwritten by
* new items.
*
* @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
* as $bin. There is no way at this time to empty just one bin.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_flush
(
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
flush
();
}
}
function
dmemcache_stats
(
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
getExtendedStats
();
}
}
/**
* Returns an Memcache object based on the bin requested. Note that there is
* nothing preventing developers from calling this function directly to get the
* Memcache object. Do this if you need functionality not provided by this API
* or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
* delete, flush) API functions provided here.
*
* @param $bin The bin which is to be used.
*
* @param $flush Rebuild the bin/server/cache mapping.
*
* @return an Memcache object or FALSE.
*/
function
dmemcache_object
(
$bin
=
NULL
,
$flush
=
FALSE
)
{
static
$memcacheCache
=
array
(),
$memcache_servers
,
$memcache_bins
;
if
(
$flush
)
{
foreach
(
$memcacheCache
as
$cluster
)
{
$cluster
->
close
();
}
$memcacheCache
=
array
();
}
if
(
empty
(
$memcacheCache
)
||
empty
(
$memcacheCache
[
$bin
]))
{
// $memcache_servers and $memcache_bins originate from settings.php.
// $memcache_servers_custom and $memcache_bins_custom get set by
// memcache.module. They are then merged into $memcache_servers and
// $memcache_bins, which are statically cached for performance.
if
(
empty
(
$memcache_servers
))
{
// Values from settings.php
$memcache_servers
=
variable_get
(
'memcache_servers'
,
array
(
'127.0.0.1:11211'
=>
'default'
));
$memcache_bins
=
variable_get
(
'memcache_bins'
,
array
(
'cache'
=>
'default'
));
}
// If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
$cluster
=
empty
(
$memcache_bins
[
$bin
])
?
'default'
:
$memcache_bins
[
$bin
];
// If this bin isn't in our $memcache_bins configuration array, and the
// 'default' cluster is already initialized, map the bin to 'cache' because
// we always map the 'cache' bin to the 'default' cluster.
if
(
empty
(
$memcache_bins
[
$bin
])
&&
!
empty
(
$memcacheCache
[
'cache'
]))
{
$memcacheCache
[
$bin
]
=
&
$memcacheCache
[
'cache'
];
}
else
{
// Create a new Memcache object. Each cluster gets its own Memcache object.
$memcache
=
new
Memcache
;
// A variable to track whether we've connected to the first server.
$init
=
FALSE
;
// Link all the servers to this cluster.
foreach
(
$memcache_servers
as
$s
=>
$c
)
{
if
(
$c
==
$cluster
)
{
list
(
$host
,
$port
)
=
explode
(
':'
,
$s
);
// This is a server that belongs to this cluster.
if
(
!
$init
)
{
// First server gets the connect.
if
(
@
$memcache
->
addServer
(
$host
,
$port
))
{
// Only set init to true if a connection was made.
$init
=
TRUE
;
}
}
else
{
// Subsequent servers gett addServer.
@
$memcache
->
addServer
(
$host
,
$port
);
}
}
}
if
(
$init
)
{
// Map the current bin with the new Memcache object.
$memcacheCache
[
$bin
]
=
$memcache
;
// Now that all the servers have been mapped to this cluster, look for
// other bins that belong to the cluster and map them too.
foreach
(
$memcache_bins
as
$b
=>
$c
)
{
if
(
$c
==
$cluster
&&
$b
!=
$bin
)
{
// Map this bin and cluster by reference.
$memcacheCache
[
$b
]
=
&
$memcacheCache
[
$bin
];
}
}
}
}
}
return
empty
(
$memcacheCache
[
$bin
])
?
FALSE
:
$memcacheCache
[
$bin
];
}
function
dmemcache_key
(
$key
,
$bin
=
'cache'
)
{
static
$prefix
;
// memcache_key_prefix can be set in settings.php to support site namespaces
// in a multisite environment.
if
(
empty
(
$prefix
))
{
$prefix
=
variable_get
(
'memcache_key_prefix'
,
''
);
}
$full_key
=
(
$prefix
?
$prefix
.
'-'
:
''
)
.
$bin
.
'-'
.
$key
;
return
urlencode
(
$full_key
);
}
require_once
'dmemcache.inc'
;
/** Implementation of cache.inc with memcache logic included **/
...
...
memcache.inc
View file @
f5dbe3fb
<?php
// $Id$
global
$_memcache_statistics
;
$_memcache_statistics
=
array
(
'get'
=>
array
(),
'set'
=>
array
(),
'hit'
=>
array
());
/*
* A memcache API for Drupal.
*/
/**
* Place an item into memcache
*
* @param $key The string with with you will retrieve this item later.
* @param $value The item to be stored.
* @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
* (but memcached server doesn't guarantee this item to be stored all the time, it could be
* deleted from the cache to make place for other items).
* @param $bin The name of the Drupal subsystem that is making this call. Examples could be
* 'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
* different memcache servers.
*
* @return bool
*/
function
dmemcache_set
(
$key
,
$value
,
$exp
=
0
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'set'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
if
(
!
$mc
->
set
(
$full_key
,
$value
,
TRUE
,
$exp
))
{
watchdog
(
'memcache'
,
'Failed to set key: '
.
$full_key
,
WATCHDOG_ERROR
);
}
else
{
return
TRUE
;
}
}
return
FALSE
;
}
/**
* Retrieve a value from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return The item which was originally saved or FALSE
*/
function
dmemcache_get
(
$key
,
$bin
=
'cache'
)
{
global
$_memcache_statistics
;
$_memcache_statistics
[
'get'
][]
=
$key
;
$_memcache_statistics
[
'bins'
][]
=
$bin
;
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
$result
=
$mc
->
get
(
$full_key
);
if
(
$result
)
{
$_memcache_statistics
[
'hit'
][]
=
$key
;
}
return
$result
;
}
}
/**
* Deletes an item from the cache.
*
* @param $key The key with which the item was stored.
* @param $bin The bin in which the item was stored.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_delete
(
$key
,
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
$full_key
=
dmemcache_key
(
$key
,
$bin
);
return
$mc
->
delete
(
$full_key
);
}
return
FALSE
;
}
/**
* Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
* resources, it only marks all the items as expired, so occupied memory will be overwritten by
* new items.
*
* @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
* as $bin. There is no way at this time to empty just one bin.
*
* @return Returns TRUE on success or FALSE on failure.
*/
function
dmemcache_flush
(
$bin
=
'cache'
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
flush
();
}
}
function
dmemcache_stats
(
$bin
=
'cache'
,
$type
=
''
)
{
if
(
$mc
=
dmemcache_object
(
$bin
))
{
return
$mc
->
getExtendedStats
(
$type
);
}
}
/**
* Returns an Memcache object based on the bin requested. Note that there is
* nothing preventing developers from calling this function directly to get the
* Memcache object. Do this if you need functionality not provided by this API
* or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
* delete, flush) API functions provided here.
*
* @param $bin The bin which is to be used.
*
* @param $flush Rebuild the bin/server/cache mapping.
*
* @return an Memcache object or FALSE.
*/
function
dmemcache_object
(
$bin
=
NULL
,
$flush
=
FALSE
)
{
static
$memcacheCache
=
array
(),
$memcache_servers
,
$memcache_bins
;
if
(
$flush
)
{
foreach
(
$memcacheCache
as
$cluster
)
{
$cluster
->
close
();
}
$memcacheCache
=
array
();
}
if
(
empty
(
$memcacheCache
)
||
empty
(
$memcacheCache
[
$bin
]))
{
// $memcache_servers and $memcache_bins originate from settings.php.
// $memcache_servers_custom and $memcache_bins_custom get set by
// memcache.module. They are then merged into $memcache_servers and
// $memcache_bins, which are statically cached for performance.
if
(
empty
(
$memcache_servers
))
{
// Values from settings.php
$memcache_servers
=
variable_get
(
'memcache_servers'
,
array
(
'127.0.0.1:11211'
=>
'default'
));
$memcache_bins
=
variable_get
(
'memcache_bins'
,
array
(
'cache'
=>
'default'
));
}
// If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
$cluster
=
empty
(
$memcache_bins
[
$bin
])
?
'default'
:
$memcache_bins
[
$bin
];
// If this bin isn't in our $memcache_bins configuration array, and the
// 'default' cluster is already initialized, map the bin to 'cache' because
// we always map the 'cache' bin to the 'default' cluster.
if
(
empty
(
$memcache_bins
[
$bin
])
&&
!
empty
(
$memcacheCache
[
'cache'
]))
{
$memcacheCache
[
$bin
]
=
&
$memcacheCache
[
'cache'
];
}
else
{
// Create a new Memcache object. Each cluster gets its own Memcache object.
$memcache
=
new
Memcache
;
// A variable to track whether we've connected to the first server.
$init
=
FALSE
;
// Link all the servers to this cluster.
foreach
(
$memcache_servers
as
$s
=>
$c
)
{
if
(
$c
==
$cluster
)
{
list
(
$host
,
$port
)
=
explode
(
':'
,
$s
);
// This is a server that belongs to this cluster.
if
(
!
$init
)
{
// First server gets the connect.
if
(
@
$memcache
->
addServer
(
$host
,
$port
))
{
// Only set init to true if a connection was made.
$init
=
TRUE
;
}
}
else
{
// Subsequent servers gett addServer.
@
$memcache
->
addServer
(
$host
,
$port
);
}
}
}
if
(
$init
)
{
// Map the current bin with the new Memcache object.
$memcacheCache
[
$bin
]
=
$memcache
;
// Now that all the servers have been mapped to this cluster, look for
// other bins that belong to the cluster and map them too.
foreach
(
$memcache_bins
as
$b
=>
$c
)
{
if
(
$c
==
$cluster
&&
$b
!=
$bin
)
{
// Map this bin and cluster by reference.
$memcacheCache
[
$b
]
=
&
$memcacheCache
[
$bin
];
}
}
}
}
}
return
empty
(
$memcacheCache
[
$bin
])
?
FALSE
:
$memcacheCache
[
$bin
];
}
function
dmemcache_key
(
$key
,
$bin
=
'cache'
)
{
static
$prefix
;
// memcache_key_prefix can be set in settings.php to support site namespaces
// in a multisite environment.
if
(
empty
(
$prefix
))
{
$prefix
=
variable_get
(
'memcache_key_prefix'
,
''
);
}
$full_key
=
(
$prefix
?
$prefix
.
'-'
:
''
)
.
$bin
.
'-'
.
$key
;
return
urlencode
(
$full_key
);
}
require_once
'dmemcache.inc'
;
/** Implementation of cache.inc with memcache logic included **/
...
...
memcache.module
View file @
f5dbe3fb
...
...
@@ -40,7 +40,7 @@ function memcache_shutdown() {
if
(
!
empty
(
$stats
))
{
$output
=
theme
(
'item_list'
,
$stats
);
// this makes sure all of the HTML is within the <body> even though this <script> is outside it
print
'<div id="memcache-devel">'
.
$output
.
'</div>'
;
print
'<div id="memcache-devel">
<h2>'
.
t
(
'Memcache statistics'
)
.
'</h2>
'
.
$output
.
'</div>'
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment