From af967de2afc584c602c0b6d4d6731e411323d94e Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 10 Apr 2013 21:41:30 +0400 Subject: [PATCH] Allow wilcards in opcache.blacklist_filename --- ext/opcache/README | 8 +++---- ext/opcache/tests/blacklist.phpt | 20 ++++++++++++++++++ ext/opcache/tests/opcache-1.blacklist | 5 +++++ ext/opcache/tests/opcache-2.blacklist | 1 + ext/opcache/zend_accelerator_blacklist.c | 36 ++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 ext/opcache/tests/blacklist.phpt create mode 100644 ext/opcache/tests/opcache-1.blacklist create mode 100644 ext/opcache/tests/opcache-2.blacklist diff --git a/ext/opcache/README b/ext/opcache/README index 03386a0..3110012 100644 --- a/ext/opcache/README +++ b/ext/opcache/README @@ -151,13 +151,13 @@ opcache.dups_fix (default "0") Enable this hack as a workaround for "Cannot redeclare class" errors. opcache.blacklist_filename - The location of the OPcache blacklist file. - The OPcache blacklist file is a text file that holds the names of files + The location of the OPcache blacklist file (wildcards allowed). + Each OPcache blacklist file is a text file that holds the names of files that should not be accelerated. The file format is to add each filename to a new line. The filename may be a full path or just a file prefix (i.e., /var/www/x blacklists all the files and directories in /var/www - that start with 'x'). Files are usually triggered by one of the following - three reasons: + that start with 'x'). Line starting with a ; are ignored (comments). + Files are usually triggered by one of the following three reasons: 1) Directories that contain auto generated code, like Smarty or ZFW cache. 2) Code that does not work well when accelerated, due to some delayed compile time evaluation. diff --git a/ext/opcache/tests/blacklist.phpt b/ext/opcache/tests/blacklist.phpt new file mode 100644 index 0000000..f4a3472 --- /dev/null +++ b/ext/opcache/tests/blacklist.phpt @@ -0,0 +1,20 @@ +--TEST-- +Blacklist (with glob, quote and comments) +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.blacklist_filename={PWD}/opcache-*.blacklist +--SKIPIF-- + +--FILE-- + +--EXPECT-- +Array +( + [0] => /path/to/foo + [1] => /path/to/foo2 + [2] => /path/to/bar +) \ No newline at end of file diff --git a/ext/opcache/tests/opcache-1.blacklist b/ext/opcache/tests/opcache-1.blacklist new file mode 100644 index 0000000..5f498d6 --- /dev/null +++ b/ext/opcache/tests/opcache-1.blacklist @@ -0,0 +1,5 @@ +; comments are allowed in blacklist file +; and empty line are ignored + +/path/to/foo +"/path/to/foo2" \ No newline at end of file diff --git a/ext/opcache/tests/opcache-2.blacklist b/ext/opcache/tests/opcache-2.blacklist new file mode 100644 index 0000000..4f6580a --- /dev/null +++ b/ext/opcache/tests/opcache-2.blacklist @@ -0,0 +1 @@ +/path/to/bar diff --git a/ext/opcache/zend_accelerator_blacklist.c b/ext/opcache/zend_accelerator_blacklist.c index 764c950..b09d0e5 100644 --- a/ext/opcache/zend_accelerator_blacklist.c +++ b/ext/opcache/zend_accelerator_blacklist.c @@ -36,6 +36,14 @@ # define REGEX_MODE (REG_EXTENDED|REG_NOSUB) #endif +#ifdef HAVE_GLOB +#ifdef PHP_WIN32 +#include "win32/glob.h" +#else +#include +#endif +#endif + #define ZEND_BLACKLIST_BLOCK_SIZE 32 struct _zend_regexp_list { @@ -168,7 +176,11 @@ static inline void zend_accel_blacklist_allocate(zend_blacklist *blacklist) } } +#ifdef HAVE_GLOB +static void zend_accel_blacklist_loadone(zend_blacklist *blacklist, char *filename) +#else void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename) +#endif { char buf[MAXPATHLEN + 1], real_path[MAXPATHLEN + 1]; FILE *fp; @@ -238,6 +250,30 @@ void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename) zend_accel_blacklist_update_regexp(blacklist); } +#ifdef HAVE_GLOB +void zend_accel_blacklist_load(zend_blacklist *blacklist, char *filename) +{ + glob_t globbuf; + int ret, i; + + memset(&globbuf, 0, sizeof(glob_t)); + + ret = glob(filename, 0, NULL, &globbuf); +#ifdef GLOB_NOMATCH + if (ret == GLOB_NOMATCH || !globbuf.gl_pathc) { +#else + if (!globbuf.gl_pathc) { +#endif + zend_accel_error(ACCEL_LOG_WARNING, "No blacklist file found matching: %s\n", filename); + } else { + for(i=0 ; i