From 17746507f04bd83168549d5cd289e87f8833a1f7 Mon Sep 17 00:00:00 2001 From: Paavo-Einari Kaipila Date: Mon, 1 Jun 2026 00:53:03 +0300 Subject: [PATCH 1/2] fix session on PHP 8.6+ reference: https://github.com/php/php-src/commit/71096cd87382c3df399a349a1ffd36f112b37aea --- php_memcached_session.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/php_memcached_session.c b/php_memcached_session.c index e509cb84..7ac53443 100644 --- a/php_memcached_session.c +++ b/php_memcached_session.c @@ -324,15 +324,21 @@ PS_OPEN_FUNC(memcached) memcached_server_list_st servers; +#if PHP_VERSION_ID >= 80600 + const char *save_path_str = ZSTR_VAL(save_path); +#else + const char *save_path_str = save_path; +#endif + // Fail on incompatible PERSISTENT identifier (removed in php-memcached 3.0) - if (strstr(save_path, "PERSISTENT=")) { + if (strstr(save_path_str, "PERSISTENT=")) { php_error_docref(NULL, E_WARNING, "failed to parse session.save_path: PERSISTENT is replaced by memcached.sess_persistent = On"); PS_SET_MOD_DATA(NULL); return FAILURE; } // First parse servers - servers = memcached_servers_parse(save_path); + servers = memcached_servers_parse(save_path_str); if (!servers) { php_error_docref(NULL, E_WARNING, "failed to parse session.save_path"); @@ -343,7 +349,7 @@ PS_OPEN_FUNC(memcached) if (MEMC_SESS_INI(persistent_enabled)) { zend_resource *le_p; - plist_key_len = spprintf(&plist_key, 0, "memc-session:%s", save_path); + plist_key_len = spprintf(&plist_key, 0, "memc-session:%s", save_path_str); if ((le_p = zend_hash_str_find_ptr(&EG(persistent_list), plist_key, plist_key_len)) != NULL) { if (le_p->type == s_memc_sess_list_entry()) { From f5b102bb64053f935fc64ee25d9ab2f950d6db3f Mon Sep 17 00:00:00 2001 From: Paavo-Einari Kaipila Date: Mon, 1 Jun 2026 06:46:37 +0300 Subject: [PATCH 2/2] fix offsetof on PHP 8.6+ reference: https://github.com/php/php-src/commit/7114314c5a96c362b95663f7e7c9184586721f58 --- php_memcached.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/php_memcached.c b/php_memcached.c index b78eb82a..f026b0e0 100644 --- a/php_memcached.c +++ b/php_memcached.c @@ -195,7 +195,7 @@ typedef struct { } php_memc_result_callback_ctx_t; static inline php_memc_object_t *php_memc_fetch_object(zend_object *obj) { - return (php_memc_object_t *)((char *)obj - XtOffsetOf(php_memc_object_t, zo)); + return (php_memc_object_t *)((char *)obj - offsetof(php_memc_object_t, zo)); } #define Z_MEMC_OBJ_P(zv) php_memc_fetch_object(Z_OBJ_P(zv)); @@ -280,7 +280,7 @@ typedef struct { } php_memc_server_t; static inline php_memc_server_t *php_memc_server_fetch_object(zend_object *obj) { - return (php_memc_server_t *)((char *)obj - XtOffsetOf(php_memc_server_t, zo)); + return (php_memc_server_t *)((char *)obj - offsetof(php_memc_server_t, zo)); } #define Z_MEMC_SERVER_P(zv) php_memc_server_fetch_object(Z_OBJ_P(zv)) @@ -4404,7 +4404,7 @@ PHP_MINIT_FUNCTION(memcached) zend_class_entry ce; memcpy(&memcached_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - memcached_object_handlers.offset = XtOffsetOf(php_memc_object_t, zo); + memcached_object_handlers.offset = offsetof(php_memc_object_t, zo); memcached_object_handlers.clone_obj = NULL; memcached_object_handlers.free_obj = php_memc_object_free_storage; @@ -4415,7 +4415,7 @@ PHP_MINIT_FUNCTION(memcached) #ifdef HAVE_MEMCACHED_PROTOCOL memcpy(&memcached_server_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); - memcached_server_object_handlers.offset = XtOffsetOf(php_memc_server_t, zo); + memcached_server_object_handlers.offset = offsetof(php_memc_server_t, zo); memcached_server_object_handlers.clone_obj = NULL; memcached_server_object_handlers.free_obj = php_memc_server_free_storage;