2011-12-12 34 views
3

我正在寻找将php脚本嵌入到C++ windows应用程序的方式。 我发现旧的Facebook项目,我不知道它有多好,或如何在Windows应用程序中使用它,如果有的话。 有没有什么办法可以将php嵌入到Windows应用程序中?在C++应用程序中嵌入PHP或以任何方式可以完成?

+0

相关的问题,但对于C:http://stackoverflow.com/questions/1902409/calling-php-from-c –

回答

-1

This是C的相关问题,应该很容易适用于C++。如果通过HTTP请求完成通信,您也可以使用libcurl

-2

有编译器模块为windows应用程序,或整个桌面应用程序建立在PHP,并积极思考IPC你可以做任何事情。

用哪种方式想象这种嵌入的PHP代码?

+1

不要回答一个问题一个问题。 –

4

PHP不是一个可执行文件,它是一个lib。 php-cli,php-cgi,mod_php等只是同一个库的接口。您也可以将lib嵌入到您自己的应用程序中(桌面应用程序,网络工具等),但由于PHP的线程问题而使其非常痛苦。尝试线程化PHP时,这不仅仅是一个问题,但是当你的应用程序的其他部分尝试绕过它时,lib会崩溃或导致未定义的行为。 但是,它可以完成。我已经完成了一些嵌入PHP的项目,并且唯一无法解决线程相关问题的项目是在JNI项目中尝试配合PHP内核。

下面是我将PHP内核嵌入到SMTP服务器的项目。它能够在不做任何修改的情况下访问所有WordPress的代码库(例如包含在wp-includes中),允许AUTH命令使用wordpress进行授权。它还可以将邮件作为基于电子邮件主题的博客条目直接发送(如果用户通过SMTP以管理员身份登录),并将回复作为评论添加到帖子中。这不是一个黑客或变通办法,SMTP服务使用与HTTP服务相同的代码库,配置和数据库。

case 11: // AUTH 
    zval **z_auth_ret_code; 
    zend_hash_index_find(Z_ARRVAL_P(ret_array), 2, (void**)&z_auth_ret_code); 

    if(Z_TYPE_PP(z_auth_ret_code) == IS_LONG) { 
     if(Z_LVAL_PP(z_auth_ret_code) == 334) { // is OK 
      // GET AUTH TYPE 
      zval **z_auth_type_code; 
      zend_hash_index_find(Z_ARRVAL_P(ret_array), 3, (void**)&z_auth_type_code); 

      if(Z_LVAL_PP(z_auth_type_code) == 3) { // AUTH LOGIN 
       send_to_socket(client_socket, "334 AUTH LOGIN ready. Please send UID\r\n"); 

       char *uid_input = NULL; 
       int uid_input_len = 0; 
       if(read_from_socket(client_socket, &uid_input, &uid_input_len, (char*)"\r\n") > 0) { 
        ZVAL_STRING(user_name, uid_input, 1); 
        send_to_socket(client_socket, "334 Please send password for UID\r\n"); 
       } 

       char *pwd_input = NULL; 
       int pwd_input_len = 0; 
       if(read_from_socket(client_socket, &pwd_input, &pwd_input_len, (char*)"\r\n") > 0) { 
        ZVAL_STRING(user_pass, pwd_input, 1); 
       } 

       // setup session 
       zval *function, *retval; 
       zval *params[2]; 

       MAKE_STD_ZVAL(function); 
       MAKE_STD_ZVAL(retval); 

       ZVAL_STRING(function, "open_session", 1); 

       params[0] = user_name; 

       call_user_function(EG(function_table), NULL, function, retval, 1, params); 

       // do auth 
       ZVAL_STRING(function, "smtp_auth", 1); 

       params[0] = user_name; 
       params[1] = user_pass; 

       call_user_function(EG(function_table), NULL, function, retval, 2, params TSRMLS_CC); 

       if(Z_TYPE_P(retval) == IS_LONG && Z_LVAL_P(retval) == 1) { 
        send_to_socket(client_socket, "235 AUTH LOGIN SUCCESSFUL\r\n"); 
        is_authorized = 1; 
       }else { 
        send_to_socket(client_socket, "535 AUTH LOGIN FAILED\r\n"); 
       } 
      } 
     } 
    } 
break; 
相关问题