]> granicus.if.org Git - php/commitdiff
better scaling for large servers using many session ids
authorSascha Schumann <sas@php.net>
Mon, 7 Jun 1999 19:51:54 +0000 (19:51 +0000)
committerSascha Schumann <sas@php.net>
Mon, 7 Jun 1999 19:51:54 +0000 (19:51 +0000)
ext/session/mod_files.c
ext/session/session.c

index bc775cfc95b265b56b1d7fc7447b508ed965ae36..88c2fb6a39b0b319654689d1d97c2aeee6fb114a 100644 (file)
@@ -41,6 +41,7 @@ typedef struct {
        int fd;
        char *lastkey;
        char *basedir;
+       int dirdepth;
 } ps_files;
 
 
@@ -54,11 +55,16 @@ ps_module ps_mod_files = {
 PS_OPEN_FUNC(files)
 {
        ps_files *data;
+       char *p;
 
        data = ecalloc(sizeof(*data), 1);
        *mod_data = data;
 
        data->fd = -1;
+       if((p = strchr(save_path, ':'))) {
+               data->dirdepth = strtol(save_path, NULL, 10);
+               save_path = p + 1;
+       }
        data->basedir = estrdup(save_path);
        
        return SUCCESS;
@@ -77,17 +83,38 @@ PS_CLOSE_FUNC(files)
        return SUCCESS;
 }
 
+#if WIN32|WINNT
+#define DIR_DELIMITER '\\'
+#else
+#define DIR_DELIMITER '/'
+#endif
+
 static void _ps_files_open(ps_files *data, const char *key)
 {
        char buf[MAXPATHLEN];
-       
+       const char *p;
+       int i;
+       int n;
+       int keylen;
+
        if(data->fd < 0 || !data->lastkey || strcmp(key, data->lastkey)) {
                if(data->lastkey) efree(data->lastkey);
                if(data->fd > -1) close(data->fd);
+
+               keylen = strlen(key);
+               if(keylen <= data->dirdepth || MAXPATHLEN < 
+                               (strlen(data->basedir) + 2 * data->dirdepth + keylen + 5)) 
+                       return;
+               p = key;
+               n = sprintf(buf, "%s/", data->basedir);
+               for(i = 0; i < data->dirdepth; i++) {
+                       buf[n++] = *p++;
+                       buf[n++] = DIR_DELIMITER;
+               }
+               strcat(buf, p);
                
                data->lastkey = estrdup(key);
                
-               snprintf(buf, MAXPATHLEN, "%s/%s", data->basedir, key);
                data->fd = open(buf, O_CREAT | O_RDWR, 0600);
                if(data->fd > -1) {
                        flock(data->fd, LOCK_EX);
@@ -151,5 +178,6 @@ PS_DELETE_FUNC(files)
 
 PS_GC_FUNC(files) 
 {
+       
        return SUCCESS;
 }
index 1bfa91d746c378e793d81e408ed00bffdf369744..c357afa7f636129cd6c5372e6805a85ac7a8d98e 100644 (file)
@@ -31,9 +31,7 @@
  * TODO:
  * - improve session id creation to avoid collisions
  *   (make use of mersenne twister, other data such as IP, browser etc.)
- * - improve files handler for better scaling
  * - add complete support for objects (partially implemented)
- * - complete ZTS support (currently only useable as non-ZTS)
  * - userland callback functions for ps_module
  */
 #if !(WIN32|WINNT)