如何通过php-fpm将gwan与wordpress安装一起使用


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

有没有一种简单的方法可以使用gwan通过php-fpm使用wordpress?

任何用例,要分享的示例?

由于我们从未成功地使Zend PHP以线程安全的方式运行,因此我们无法提供建议,除非有人为 PH7 制作一个Wordpress端口,它既受 G-WAN 支持,又支持线程安全。

由于多核系统现在是常态(即使在嵌入式平台上),Zend最终将公开发布线程安全的PHP,或者人们将越来越多地寻找替代方案。


根据"Nagi"的请求,这是发送的G-WAN PHP 模块到Zend进行审查:

// ---------------------------------------------------------
// 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
// ---------------------------------------------------------