#pragma once
extern "C"
{
#include "sapi/embed/php_embed.h"
}
#include "PHP_API.hpp"
namespace PHP
{
class VM
{
public:
VM(int argc, char ** argv)
{
php_embed_init(argc, argv);
exit_status = 0;
program_name = argv[0];
}
~VM()
{
php_embed_shutdown();
}
void eval(char *script)
{
string s(script);
eval(s);
}
void eval(string &script)
{
zend_first_try
{
zend_eval_stringl((char *) script.c_str(), script.length(), NULL, (char *) program_name.c_str());
}
zend_catch
{
exit_status = EG(exit_status);
}
zend_end_try();
}
bool include(string file)
{
zend_file_handle file_handle;
int ret = php_stream_open_for_zend_ex(file.c_str(), &file_handle, USE_PATH | STREAM_OPEN_FOR_INCLUDE);
if (ret != SUCCESS)
{
return false;
}
zend_string *opened_path;
if (!file_handle.opened_path)
{
file_handle.opened_path = zend_string_init(file.c_str(), file.length(), 0);
}
opened_path = zend_string_copy(file_handle.opened_path);
zval dummy;
zval result;
zend_op_array *new_op_array;
ZVAL_NULL(&dummy);
if (zend_hash_add(&EG(included_files), opened_path, &dummy))
{
new_op_array = zend_compile_file(&file_handle, ZEND_REQUIRE);
zend_destroy_file_handle (&file_handle);
}
else
{
new_op_array = NULL;
zend_file_handle_dtor (&file_handle);
}
zend_string_release(opened_path);
if (!new_op_array)
{
return false;
}
ZVAL_UNDEF(&result);
zend_execute(new_op_array, &result);
destroy_op_array(new_op_array);
efree(new_op_array);
if (!EG(exception))
{
zval_ptr_dtor(&result);
}
return true;
}
int exit_status;
private:
string program_name;
};
}
一键复制
编辑
Web IDE
原始数据
按行查看
历史