在c ++应用程序中嵌入php或以任何方式可以完成?

时间:2011-12-12 13:16:22

标签: php c++

我一直在寻找将php脚本嵌入到c ++ windows应用程序中的方法。 我发现旧的Facebook项目,我不知道它是多么好或如何在Windows应用程序中使用它,如果有的话。 有没有办法在Windows应用程序中嵌入php?

3 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分:-2)

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

答案 2 :(得分:-2)

Windows应用程序的模块编译器,或者构建在php上的整个桌面应用程序,并且对IPC有积极的思考,你可以做任何事情。

你想象这种嵌入php代码的方式是什么?