Merge branch 'PHP-7.4'

* PHP-7.4:
  Allow multiple cache instances per user/host on Windows
This commit is contained in:
Christoph M. Becker 2019-07-17 19:52:49 +02:00
commit 54401001a8
9 changed files with 62 additions and 51 deletions

View File

@ -33,7 +33,7 @@ environment:
PARALLEL: -j2
- THREAD_SAFE: 1
OPCACHE: 1
PARALLEL:
PARALLEL: -j2
INTRINSICS: AVX
services:

View File

@ -45,6 +45,7 @@
#include "zend_file_cache.h"
#include "ext/pcre/php_pcre.h"
#include "ext/standard/md5.h"
#include "ext/hash/php_hash.h"
#ifdef HAVE_JIT
# include "jit/zend_jit.h"
@ -58,6 +59,7 @@
typedef int uid_t;
typedef int gid_t;
#include <io.h>
#include <lmcons.h>
#endif
#ifndef ZEND_WIN32
@ -101,6 +103,9 @@ zend_accel_shared_globals *accel_shared_globals = NULL;
/* true globals, no need for thread safety */
char accel_system_id[32];
#ifdef ZEND_WIN32
char accel_uname_id[32];
#endif
zend_bool accel_startup_ok = 0;
static char *zps_failure_reason = NULL;
char *zps_api_failure_reason = NULL;
@ -2171,6 +2176,26 @@ zend_op_array *persistent_compile_file(zend_file_handle *file_handle, int type)
return zend_accel_load_script(persistent_script, from_shared_memory);
}
#ifdef ZEND_WIN32
static int accel_gen_uname_id(void)
{
PHP_MD5_CTX ctx;
unsigned char digest[16];
wchar_t uname[UNLEN + 1];
DWORD unsize = UNLEN;
if (!GetUserNameW(uname, &unsize)) {
return FAILURE;
}
PHP_MD5Init(&ctx);
PHP_MD5Update(&ctx, (void *) uname, (unsize - 1) * sizeof(wchar_t));
PHP_MD5Update(&ctx, ZCG(accel_directives).cache_id, strlen(ZCG(accel_directives).cache_id));
PHP_MD5Final(digest, &ctx);
php_hash_bin2hex(accel_uname_id, digest, sizeof digest);
return SUCCESS;
}
#endif
/* zend_stream_open_function() replacement for PHP 5.3 and above */
static int persistent_stream_open_function(const char *filename, zend_file_handle *handle)
{
@ -2612,9 +2637,7 @@ static void accel_globals_ctor(zend_accel_globals *accel_globals)
static void accel_gen_system_id(void)
{
PHP_MD5_CTX context;
unsigned char digest[16], c;
char *md5str = accel_system_id;
int i;
unsigned char digest[16];
PHP_MD5Init(&context);
PHP_MD5Update(&context, PHP_VERSION, sizeof(PHP_VERSION)-1);
@ -2626,14 +2649,7 @@ static void accel_gen_system_id(void)
PHP_MD5Update(&context, __TIME__, sizeof(__TIME__)-1);
}
PHP_MD5Final(digest, &context);
for (i = 0; i < 16; i++) {
c = digest[i] >> 4;
c = (c <= 9) ? c + '0' : c - 10 + 'a';
md5str[i * 2] = c;
c = digest[i] & 0x0f;
c = (c <= 9) ? c + '0' : c - 10 + 'a';
md5str[(i * 2) + 1] = c;
}
php_hash_bin2hex(accel_system_id, digest, sizeof digest);
}
#ifdef HAVE_HUGE_CODE_PAGES
@ -2824,6 +2840,13 @@ static int accel_startup(zend_extension *extension)
return FAILURE;
}
#ifdef ZEND_WIN32
if (UNEXPECTED(accel_gen_uname_id() == FAILURE)) {
zps_startup_failure("Unable to get user name", NULL, accelerator_remove_cb);
return SUCCESS;
}
#endif
#ifdef HAVE_HUGE_CODE_PAGES
if (ZCG(accel_directives).huge_code_pages &&
(strcmp(sapi_module.name, "cli") == 0 ||

View File

@ -185,6 +185,9 @@ typedef struct _zend_accel_directives {
zend_bool huge_code_pages;
#endif
char *preload;
#ifdef ZEND_WIN32
char *cache_id;
#endif
#ifdef HAVE_JIT
zend_long jit;
zend_long jit_buffer_size;
@ -278,6 +281,9 @@ typedef struct _zend_accel_shared_globals {
} zend_accel_shared_globals;
extern char accel_system_id[32];
#ifdef ZEND_WIN32
extern char accel_uname_id[32];
#endif
extern zend_bool accel_startup_ok;
extern zend_bool file_cache_only;
#if ENABLE_FILE_CACHE_FALLBACK

View File

@ -19,6 +19,7 @@
+----------------------------------------------------------------------+
*/
#include "php.h"
#include "ZendAccelerator.h"
#include "zend_shared_alloc.h"
#include "zend_accelerator_util_funcs.h"
@ -67,38 +68,24 @@ static void zend_win_error_message(int type, char *msg, int err)
static char *create_name_with_username(char *name)
{
static char newname[MAXPATHLEN + UNLEN + 4 + 1 + 32];
char *uname;
uname = php_win32_get_username();
if (!uname) {
return NULL;
}
snprintf(newname, sizeof(newname) - 1, "%s@%s@%.32s", name, uname, accel_system_id);
free(uname);
static char newname[MAXPATHLEN + 32 + 4 + 1 + 32];
snprintf(newname, sizeof(newname) - 1, "%s@%.32s@%.32s", name, accel_uname_id, accel_system_id);
return newname;
}
static char *get_mmap_base_file(void)
{
static char windir[MAXPATHLEN+UNLEN + 3 + sizeof("\\\\@") + 1 + 32];
char *uname;
static char windir[MAXPATHLEN+ 32 + 3 + sizeof("\\\\@") + 1 + 32];
int l;
uname = php_win32_get_username();
if (!uname) {
return NULL;
}
GetTempPath(MAXPATHLEN, windir);
l = strlen(windir);
if ('\\' == windir[l-1]) {
l--;
}
snprintf(windir + l, sizeof(windir) - l - 1, "\\%s@%s@%.32s", ACCEL_FILEMAP_BASE, uname, accel_system_id);
free(uname);
snprintf(windir + l, sizeof(windir) - l - 1, "\\%s@%.32s@%.32s", ACCEL_FILEMAP_BASE, accel_uname_id, accel_system_id);
return windir;
}

View File

@ -325,6 +325,9 @@ ZEND_INI_BEGIN()
STD_PHP_INI_BOOLEAN("opcache.huge_code_pages" , "0" , PHP_INI_SYSTEM, OnUpdateBool, accel_directives.huge_code_pages, zend_accel_globals, accel_globals)
#endif
STD_PHP_INI_ENTRY("opcache.preload" , "" , PHP_INI_SYSTEM, OnUpdateStringUnempty, accel_directives.preload, zend_accel_globals, accel_globals)
#if ZEND_WIN32
STD_PHP_INI_ENTRY("opcache.cache_id" , "" , PHP_INI_SYSTEM, OnUpdateString, accel_directives.cache_id, zend_accel_globals, accel_globals)
#endif
#ifdef HAVE_JIT
STD_PHP_INI_ENTRY("opcache.jit" , ZEND_JIT_DEFAULT, PHP_INI_SYSTEM, OnUpdateLong, accel_directives.jit, zend_accel_globals, accel_globals)
STD_PHP_INI_ENTRY("opcache.jit_buffer_size" , "0" , PHP_INI_SYSTEM, OnUpdateLong, accel_directives.jit_buffer_size, zend_accel_globals, accel_globals)
@ -789,6 +792,9 @@ static ZEND_FUNCTION(opcache_get_configuration)
add_assoc_bool(&directives, "opcache.huge_code_pages", ZCG(accel_directives).huge_code_pages);
#endif
add_assoc_string(&directives, "opcache.preload", STRING_NOT_NULL(ZCG(accel_directives).preload));
#if ZEND_WIN32
add_assoc_string(&directives, "opcache.cache_id", STRING_NOT_NULL(ZCG(accel_directives).cache_id));
#endif
#ifdef HAVE_JIT
add_assoc_long(&directives, "opcache.jit", ZCG(accel_directives).jit);
add_assoc_long(&directives, "opcache.jit_buffer_size", ZCG(accel_directives).jit_buffer_size);

View File

@ -835,31 +835,13 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path)
memcpy(filename + len + 33, ZSTR_VAL(script_path), ZSTR_LEN(script_path));
memcpy(filename + len + 33 + ZSTR_LEN(script_path), SUFFIX, sizeof(SUFFIX));
#else
PHP_MD5_CTX ctx;
char md5uname[32];
unsigned char digest[16], c;
size_t i;
char *uname = php_win32_get_username();
PHP_MD5Init(&ctx);
PHP_MD5Update(&ctx, uname, strlen(uname));
PHP_MD5Final(digest, &ctx);
for (i = 0; i < 16; i++) {
c = digest[i] >> 4;
c = (c <= 9) ? c + '0' : c - 10 + 'a';
md5uname[i * 2] = c;
c = digest[i] & 0x0f;
c = (c <= 9) ? c + '0' : c - 10 + 'a';
md5uname[(i * 2) + 1] = c;
}
len = strlen(ZCG(accel_directives).file_cache);
filename = emalloc(len + 33 + 33 + ZSTR_LEN(script_path) + sizeof(SUFFIX));
memcpy(filename, ZCG(accel_directives).file_cache, len);
filename[len] = '\\';
memcpy(filename + 1 + len, md5uname, 32);
memcpy(filename + 1 + len, accel_uname_id, 32);
len += 1 + 32;
filename[len] = '\\';
@ -889,7 +871,6 @@ static char *zend_file_cache_get_bin_file_path(zend_string *script_path)
memcpy(filename + len + 33, ZSTR_VAL(script_path), ZSTR_LEN(script_path));
memcpy(filename + len + 33 + ZSTR_LEN(script_path), SUFFIX, sizeof(SUFFIX));
}
free(uname);
#endif
return filename;

View File

@ -1823,6 +1823,10 @@ ldap.max_links = -1
; errors.
;opcache.mmap_base=
; Facilitates multiple OPcache instances per user (for Windows only). All PHP
; processes with the same cache ID and user share an OPcache instance.
;opcache.cache_id=
; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching.

View File

@ -1825,6 +1825,10 @@ ldap.max_links = -1
; errors.
;opcache.mmap_base=
; Facilitates multiple OPcache instances per user (for Windows only). All PHP
; processes with the same cache ID and user share an OPcache instance.
;opcache.cache_id=
; Enables and sets the second level cache directory.
; It should improve performance when SHM memory is full, at server restart or
; SHM reset. The default "" disables file based caching.

View File

@ -2076,7 +2076,7 @@ TEST $file
}
// Default ini settings
$ini_settings = array();
$ini_settings = $workerID ? array('opcache.cache_id' => "worker$workerID") : array();
// Additional required extensions
if (array_key_exists('EXTENSIONS', $section_text)) {