php - 将 php 嵌入到 C++ 应用程序中或以任何方式完成?

标签 php c++

我一直在寻找将 PHP 脚本嵌入到 C++ Windows 应用程序中的方法。 我发现了旧的 Facebook 项目,我不知道它有多好,也不知道如何在 Windows 应用程序中使用它(如果有的话)。 有什么方法可以将 php 嵌入到 Windows 应用程序中?

最佳答案

PHP 不是可执行文件,它是一个库。 php-cli、php-cgi、mod_php 等只是同一个库的接口(interface)。您也可以将库嵌入到您自己的应用程序(桌面应用程序、网络工具等)中,但由于 PHP 的线程问题,这很麻烦。这不仅是尝试对 PHP 进行线程处理时的问题,而且当您的应用程序的其他部分尝试对它进行线程处理时,库会崩溃或可能导致未定义的行为。 但是,这是可以做到的。我已经完成了几个嵌入 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;

关于php - 将 php 嵌入到 C++ 应用程序中或以任何方式完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8474924/

相关文章:

php - 合并两个二维数组,对一个列值进行分组,并对每组内的另一个列值求和

php - 为什么连接失败时 PDO 会打印我的密码?

PHP/MySQL - 查找具有相似或匹配属性的项目

c++ - c/c++中VARNAME_T和VARNAME_P有什么区别

c++ - Objective-C++ ARC 和 C++ 容器

javascript - 如何使用 jQuery 获取成功的 ajax 响应并将其分配到变量中?

php - 如何使用 MySQL 存储 UNIX 时间戳

c++ - 包含拇指小部件的 slider 小部件的相对坐标

c++ - 优化算法以找到满足特定属性的六位数字的数量

c++ - C/++ 中的 WaitForSingleObject 和 while 循环