当前位置: 首页 > 工具软件 > PH7 > 使用案例 >

php7 执行c 程序,使用 PH7 在 C 程序中执行 PHP 脚本

楚煜
2023-12-01

PH7 是一个进程中的开发包,实现了高效的嵌入式的字节码编译器和一个 PHP 编程语言的虚拟机。换一种说法:PH7 是一个 PHP 引擎可让你的 C/C++ 应用程序直接编译并执行 PHP 脚本。

/*

* Compile this file together with the ph7 engine source code to generate

* the executable. For example:

* gcc -W -Wall -O6 -o ph7_test ph7_intro.c ph7.c

*/

/*

* This simple program is a quick introduction on how to embed and start

* experimenting with the PH7 engine without having to do a lot of tedious

* reading and configuration.

*

* For an introduction to the PH7 C/C++ interface, please refer to this page

* http://ph7.symisc.net/api_intro.html

* For the full C/C++ API reference guide, please refer to this page

* http://ph7.symisc.net/c_api.html

*/

/*

* The following is the PHP program to execute.

* <?php

* echo 'Welcome guest'.PHP_EOL;

* echo 'Current system time is: '.date('Y-m-d H:i:s').PHP_EOL;

* echo 'and you are running '.php_uname();

* ?>

* That is, this simple program when running should display a greeting

* message, the current system time and the host operating system.

* A typical output of this program would look like this:

*

* Welcome guest

* Current system time is: 2012-09-14 02:08:44

* and you are running Microsoft Windows 7 localhost 6.1 build 7600 x86

*

*/

#define PHP_PROG "<?php "\\

"echo 'Welcome guest'.PHP_EOL;"\\

"echo 'Current system time is: '.date('Y-m-d H:i:s').PHP_EOL;"\\

"echo 'and you are running '.php_uname();"\\

"?>"

/* Make sure you have the latest release of the PH7 engine

* from:

* http://ph7.symisc.net/downloads.html

*/

#include

#include

/* Make sure this header file is available.*/

#include "ph7.h"

/*

* Display an error message and exit.

*/

static void Fatal(const char *zMsg)

{

puts(zMsg);

/* Shutdown the library */

ph7_lib_shutdown();

/* Exit immediately */

exit(0);

}

/*

* VM output consumer callback.

* Each time the virtual machine generates some outputs, the following

* function gets called by the underlying virtual machine to consume

* the generated output.

* All this function does is redirecting the VM output to STDOUT.

* This function is registered later via a call to ph7_vm_config()

* with a configuration verb set to: PH7_VM_CONFIG_OUTPUT.

*/

static int Output_Consumer(const void *pOutput, unsigned int nOutputLen, void *pUserData /* Unused */)

{

/*

* Note that it's preferable to use the write() system call to display the output

* rather than using the libc printf() which everybody now is extremely slow.

*/

printf("%.*s",

nOutputLen,

(const char *)pOutput /* Not null terminated */

);

/* All done, VM output was redirected to STDOUT */

return PH7_OK;

}

/*

* Main program: Compile and execute the PHP program defined above.

*/

int main(void)

{

ph7 *pEngine; /* PH7 engine */

ph7_vm *pVm; /* Compiled PHP program */

int rc;

/* Allocate a new PH7 engine instance */

rc = ph7_init(&pEngine);

if( rc != PH7_OK ){

/*

* If the supplied memory subsystem is so sick that we are unable

* to allocate a tiny chunk of memory, there is no much we can do here.

*/

Fatal("Error while allocating a new PH7 engine instance");

}

/* Compile the PHP test program defined above */

rc = ph7_compile_v2(

pEngine, /* PH7 engine */

PHP_PROG, /* PHP test program */

-1 /* Compute input length automatically*/,

&pVm, /* OUT: Compiled PHP program */

0 /* IN: Compile flags */

);

if( rc != PH7_OK ){

if( rc == PH7_COMPILE_ERR ){

const char *zErrLog;

int nLen;

/* Extract error log */

ph7_config(pEngine,

PH7_CONFIG_ERR_LOG,

&zErrLog,

&nLen

);

if( nLen > 0 ){

/* zErrLog is null terminated */

puts(zErrLog);

}

}

/* Exit */

Fatal("Compile error");

}

/*

* Now we have our script compiled, it's time to configure our VM.

* We will install the VM output consumer callback defined above

* so that we can consume the VM output and redirect it to STDOUT.

*/

rc = ph7_vm_config(pVm,

PH7_VM_CONFIG_OUTPUT,

Output_Consumer, /* Output Consumer callback */

0 /* Callback private data */

);

if( rc != PH7_OK ){

Fatal("Error while installing the VM output consumer callback");

}

/*

* And finally, execute our program. Note that your output (STDOUT in our case)

* should display the result.

*/

ph7_vm_exec(pVm, 0);

/* All done, cleanup the mess left behind.

*/

ph7_vm_release(pVm);

ph7_release(pEngine);

return 0;

}

 类似资料: