我一直在寻找将 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/