这是迟到的,但应该做你想做的。
使用 zend 引擎制作您自己的自定义扩展,因为它们编译为 c++ dll。将该 dll 添加到 php 目录中的 ext 位置。之后,您可以将自己的 php 脚本调用为 php 函数。请记住,php 只是服务器端,因此除非从服务器复制并分发,否则没有人可以获取您的脚本。
下载您拥有的版本的 php 源库。 [windows.php.net] 你需要的zend东西都会包含在内。
步骤 1. 创建一个新项目并选择 Visual C++ 下的“常规”和空项目选项。
给它一个名字,然后单击确定。我的是 Project1,所以我将使用它。
步骤 2. 右键单击解决方案名称并选择属性。在 Configuration Properties/General 项中的 Project Defaults/Configuration Type 下选择 Dynamic Library (.dll)。确保您正在更改 Debug 配置,因为没有使用 Release。
第 3 步。在 VC++ 目录下的包含库下添加以下内容:
C:\php-7.1.8-src\Zend
C:\php-7.1.8-src\win32
C:\php-7.1.8-src\TSRM
C:\php-7.1.8-src\main
C:\php-7.1.8-src
图书馆:
C:\php-7.1.8\dev
第 4 步。在 C/C++ Preprocessor 下,将 ZEND_DEBUG=0;ZTS=1;ZEND_WIN32;PHP_WIN32 添加到 Preprocessor Definitions
第 5 步。在链接器输入下添加 php7ts.lib。这需要与您的 php 版本的库相匹配
单击确定保存解决方案的属性设置。
现在让我们为您的函数 (Project1) 添加一个代码文件
在源文件文件夹下右键单击并添加代码。我调用了我的 Project1.cpp,这是源代码。您需要将 config.w32.h.in 重命名为 config.w32.h 并将其复制到需要的目录中。 Intellisense 应该会告诉您它在哪里查找,并且 config.w32.h.in 位于 C:\php-7.1.8-src\win32 目录中。
// this needs to match the compiler version that php was compiled with
#define _CRT_SECURE_NO_WARNINGS
#define PHP_COMPILER_ID "VC14"
#pragma once
/* You must include config.w32.h first */
#include "win32/config.w32.h"
#include "php.h"
ZEND_FUNCTION(ReturnString);
zend_function_entry Project1_functions[] =
{
ZEND_FE(ReturnString, NULL)
{
NULL, NULL, NULL
}
};
zend_module_entry Project1_module_entry =
{
STANDARD_MODULE_HEADER,
"Project1 Module",
Project1_functions,
NULL, NULL, NULL, NULL, NULL,
NO_VERSION_YET, STANDARD_MODULE_PROPERTIES
};
ZEND_GET_MODULE(Project1)
ZEND_FUNCTION(ReturnString)
{
zval* value;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &value) == FAILURE)
{
RETURN_FALSE;
}
convert_to_string(value);
RETURN_STRING(Z_STRVAL_P(value), true);
}
按 F7 编译,它应该会创建 Project1\Debug\Project1.dll。将 Project1 复制到您的 ext 目录 C:\php-7.1.8\ext 并将 extension=Project1.dll 添加到您的 php.ini 中,您应该一切顺利。如果它不起作用,请仔细检查您的属性以确保您没有遗漏任何内容。
The script is quite simple:
<?php
echo ReturnString("The Returning String");
?>