phpwordpressmultithreadingg-wan

How to use gwan with wordpress installation through php-fpm?


Is there an easy way to use wordpress through php-fpm using gwan?

Any use case, example of this to share?


Solution

  • As we never succeeded in making Zend PHP run in a thread-safe manner, there's no way we can advise, unless someone makes a Wordpress port for PH7, which is both supported by G-WAN and thread-safe.

    As multicore systems are now the norm (even on embedded platforms), either Zend will finally publicly release a thread-safe PHP, or people will increasingly look for alternatives.


    Per the request of 'Nagi', here is the G-WAN PHP module sent to Zend for review:

    // ---------------------------------------------------------
    // php.c: G-WAN using PHP scripts
    // ---------------------------------------------------------
    // To build PHP5:
    //
    //    CFLAGS="-O3" ./configure --enable-embed --enable-maintainer-zts
    //                             --with-tsrm-pthreads --without-pear
    //    make clean
    //    make
    //    sudo make install
    /*    Installing PHP SAPI module:       embed
          Installing PHP CLI binary:        /usr/local/bin/
          Installing PHP CLI man page:      /usr/local/php/man/man1/
          Installing PHP CGI binary:        /usr/local/bin/
          Installing build environment:     /usr/local/lib/php/build/
          Installing header files:          /usr/local/include/php/
          Installing helper programs:       /usr/local/bin/
            program: phpize
            program: php-config
          Installing man pages:             /usr/local/php/man/man1/
            page: phpize.1
            page: php-config.1
          Installing PEAR environment:      /usr/local/lib/php/
          [PEAR] Archive_Tar    - already installed: 1.3.7
          [PEAR] Console_Getopt - already installed: 1.3.0
          [PEAR] Structures_Graph- already installed: 1.0.4
          [PEAR] XML_Util       - already installed: 1.2.1
          [PEAR] PEAR           - already installed: 1.9.4
          Wrote PEAR system config file at: /usr/local/etc/pear.conf
          You may want to add: /usr/local/lib/php to your php.ini include_path
          /home/pierre/Downloads/PHP/php5.4-20/build/shtool install -c ext/phar/phar.phar /usr/local/bin
          ln -s -f /usr/local/bin/phar.phar /usr/local/bin/phar
          Installing PDO headers:          /usr/local/include/php/ext/pdo/       *//*      
       enabling the 'thread safety' --enable-maintainer-zts option 
       results in:
       error: 'tsrm_ls' undeclared (first use in this function)
    *//*
    // ---------------------------------------------------------
    TEST VALIDATING THIS CODE WITH ONE SINGLE THREAD
    (use 2 threads and the PHP runtime crashes)
    // ---------------------------------------------------------
    weighttp -n 100000 -c 100 -t 1 -k "http://127.0.0.1:8080/?php.c"
    
    finished in 0 sec, 592 millisec, 168744 req/s, 48283 kbyte/s
    requests: 100000 total/started/done/succeeded, 0 failed/errored
    status codes: 100000 2xx, 0 3xx, 0 4xx, 0 5xx
    traffic: 29299985 bytes total, 27599985 bytes http, 
             1700000 bytes data
    // --------------------------------------------------------- */
    #pragma include "/usr/local/include/php"
    #pragma include "/usr/local/include/php/main"
    #pragma include "/usr/local/include/php/TSRM"
    #pragma include "/usr/local/include/php/Zend"
    #pragma link "/usr/local/lib/libphp5.so"
    
    #include "gwan.h" // G-WAN exported functions
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/syscall.h>
    
    #include <php/sapi/embed/php_embed.h>
    #include <php/Zend/zend_stream.h>
    // ---------------------------------------------------------
    static pid_t gettid(void) { return syscall(__NR_gettid); }
    // ---------------------------------------------------------
    // PHP
    // ---------------------------------------------------------
    static int ub_write(const char *str, unsigned int str_len TSRMLS_DC)
    {
       puts(str); // this is the stdout output of a PHP script
       return 0;
    }
    // ---------------------------------------------------------
    static void log_message(char * message)
    {
       printf("log_message: %s\n", message);
    }
    // ---------------------------------------------------------
    static void sapi_error(int type, const char * fmt, ...) { }
    // ---------------------------------------------------------
    static void php_set_var(char *varname, char *varval)
    {
       zval *var;
       MAKE_STD_ZVAL(var);
       ZVAL_STRING(var, varval, 1);
       zend_hash_update(&EG(symbol_table), varname, strlen(varname) + 1,
                        &var, sizeof(zval*), NULL);
    }
    // ---------------------------------------------------------
    static char *php_get_var(char *varname)
    {
       zval **data = NULL;
       char *ret = NULL;
       if(zend_hash_find(&EG(symbol_table), varname, strlen(varname) + 1,
                        (void**)&data) == FAILURE)
       {
          printf("Name not found in $GLOBALS\n");
          return "";
       }
    
       if(!data)
       {
          printf("Value is NULL (not possible for symbol_table?)\n");
          return "";
       }
    
       ret = Z_STRVAL_PP(data);
       return ret;
    }
    // ---------------------------------------------------------
    static int php_init(void)
    {
       static int once = 0;
       if(once) return 0;
    
       once = 1;
       static char *myargv[2] = {"toto.php", NULL};
       php_embed_module.log_message = log_message;
       php_embed_module.sapi_error  = sapi_error;
       php_embed_module.ub_write    = ub_write;
       if(php_embed_init(1, myargv PTSRMLS_CC) == FAILURE)
       {
          printf("php_embed_init error\n");
          return 1;
       }
       return 0;
    }
    // ---------------------------------------------------------
    static void php_shutdown()
    {
       php_embed_shutdown(TSRMLS_C);
    }
    // ---------------------------------------------------------
    static int php_exec(char *str)
    {
       zval ret_value;
       int exit_status;
       zend_first_try
       {
          PG(during_request_startup) = 0;
    
          // run the specified PHP script file
          // sprintf(str, "include (\"% s \ ");", scriptname);
    
          zend_eval_string(str, &ret_value, "toto.php" TSRMLS_CC);
    
          exit_status = Z_LVAL(ret_value);
       } zend_catch
       {
          exit_status = EG(exit_status);
       }
       zend_end_try();
       return exit_status;
    }
    // ---------------------------------------------------------
    __thread char reply_num[8] = {0};
    __thread pid_t tid = 0;
    
    int main(int argc, char *argv[])
    {
       if(!tid)
       {
          tid = gettid();
          s_snprintf(reply_num, 8, "%u", tid);
          php_init();
       }
    
       xbuf_t *reply = get_reply(argv);
       //php_set_var("argv", argv[0]);
       php_set_var(reply_num, "");
    
       char fmt[] = //"print(\"from php [$test]\n\");\n"
                    "$reply%s = \"Hello World (PHP)\";\n";
       char php[sizeof(fmt) + sizeof(reply_num) + 2];
       s_snprintf(php, sizeof(php), fmt, reply_num);
    
       php_exec(php);
    
       xbuf_cat(reply, php_get_var(reply_num));
       return 200;
    }
    // ---------------------------------------------------------
    // End of Source Code
    // ---------------------------------------------------------