From 7f408e4b4184e4c850156090e648fc120985c975 Mon Sep 17 00:00:00 2001 From: v12mike Date: Mon, 26 Jun 2017 12:43:23 +0100 Subject: [PATCH] [PHPBB3-15247] Add support for php v7 APCu cache API Add new cache driver apcu.php (based closely on existing APC cache driver) Add new unit test apcu_driver_test.php for the new driver Update RUNNING_TESTS.md to clarify requirements for apc, apcu and apc_bc extensions and add a couple of general hints to RUNNING_TESTS.md PHPBB3-15247 --- phpBB/phpbb/cache/driver/apcu.php | 70 +++++++++++++++++++++++++++++++ tests/RUNNING_TESTS.md | 12 +++++- tests/cache/apcu_driver_test.php | 58 +++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 phpBB/phpbb/cache/driver/apcu.php create mode 100644 tests/cache/apcu_driver_test.php diff --git a/phpBB/phpbb/cache/driver/apcu.php b/phpBB/phpbb/cache/driver/apcu.php new file mode 100644 index 0000000000..40192e4026 --- /dev/null +++ b/phpBB/phpbb/cache/driver/apcu.php @@ -0,0 +1,70 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\cache\driver; + +/** +* ACM for APCU +*/ +class apcu extends \phpbb\cache\driver\memory +{ + var $extension = 'apcu'; + + /** + * {@inheritDoc} + */ + function purge() + { + apcu_clear_cache(); + + parent::purge(); + } + + /** + * Fetch an item from the cache + * + * @access protected + * @param string $var Cache key + * @return mixed Cached data + */ + function _read($var) + { + return apcu_fetch($this->key_prefix . $var); + } + + /** + * Store data in the cache + * + * @access protected + * @param string $var Cache key + * @param mixed $data Data to store + * @param int $ttl Time-to-live of cached data + * @return bool True if the operation succeeded + */ + function _write($var, $data, $ttl = 2592000) + { + return apcu_store($this->key_prefix . $var, $data, $ttl); + } + + /** + * Remove an item from the cache + * + * @access protected + * @param string $var Cache key + * @return bool True if the operation succeeded + */ + function _delete($var) + { + return apcu_delete($this->key_prefix . $var); + } +} diff --git a/tests/RUNNING_TESTS.md b/tests/RUNNING_TESTS.md index b082197166..c9941d61e5 100644 --- a/tests/RUNNING_TESTS.md +++ b/tests/RUNNING_TESTS.md @@ -30,7 +30,9 @@ Some of the functionality in phpBB and/or the test suite uses additional PHP extensions. If these extensions are not loaded, respective tests will be skipped: -- apc (APC cache driver) +- apc (APC cache driver, php5 only) +- apcu (APCu cache driver - native API, php7+) +- apcu_bc, apcu (APCu cache driver - APC API, php7+) - bz2 (compress tests) - mysql, pdo_mysql (MySQL database driver) - mysqli, pdo_mysql (MySQLi database driver) @@ -117,6 +119,14 @@ directory (above phpBB): $ phpBB/vendor/bin/phpunit +To generate an xml log file, run: + + $ phpBB/vendor/bin/phpunit --log-junit tests/tmp/log/log.xml + +If you are getting a memory exhausted error after running a few tests, you can try running: + + $ phpBB/vendor/bin/phpunit -d memory_limit=2048M + Slow tests -------------- diff --git a/tests/cache/apcu_driver_test.php b/tests/cache/apcu_driver_test.php new file mode 100644 index 0000000000..9de1d82a15 --- /dev/null +++ b/tests/cache/apcu_driver_test.php @@ -0,0 +1,58 @@ + +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +// Important: apc.enable_cli=1 must be in php.ini. +// http://forums.devshed.com/php-development-5/apc-problem-561290.html +// http://php.net/manual/en/apc.configuration.php + +require_once dirname(__FILE__) . '/common_test_case.php'; + +class phpbb_cache_apcu_driver_test extends phpbb_cache_common_test_case +{ + protected static $config; + protected $driver; + + public function getDataSet() + { + return $this->createXMLDataSet(dirname(__FILE__) . '/fixtures/config.xml'); + } + + static public function setUpBeforeClass() + { + if (!extension_loaded('apcu')) + { + self::markTestSkipped('APCu extension is not loaded'); + } + + $php_ini = new \bantu\IniGetWrapper\IniGetWrapper; + + if (!$php_ini->getBool('apc.enabled')) + { + self::markTestSkipped('APCu is not enabled. Make sure apc.enabled=1 in php.ini'); + } + + if (PHP_SAPI == 'cli' && !$php_ini->getBool('apc.enable_cli')) + { + self::markTestSkipped('APCu is not enabled for CLI. Set apc.enable_cli=1 in php.ini'); + } + } + + protected function setUp() + { + parent::setUp(); + + $this->driver = new \phpbb\cache\driver\apcu; + + $this->driver->purge(); + } +}