void ngx_http_php_zend_uthread_access_inline_routine(ngx_http_request_t *r) { ngx_http_php_ctx_t *ctx; ngx_http_php_loc_conf_t *plcf; ngx_str_t inline_code; plcf = ngx_http_get_module_loc_conf(r, ngx_http_php_module); ctx = ngx_http_get_module_ctx(r, ngx_http_php_module); ctx->phase_status = NGX_OK; ngx_php_request = r; ngx_php_set_request_status(NGX_DECLINED); inline_code.data = ngx_pnalloc(r->pool, sizeof("function ngx_access_(){ }")-1 + ngx_strlen(plcf->access_inline_code->code.string) + 32); inline_code.len = ngx_sprintf(inline_code.data, "function ngx_access_%V(){ %*s }", &(plcf->access_inline_code->code_id), ngx_strlen(plcf->access_inline_code->code.string), plcf->access_inline_code->code.string ) - inline_code.data; ngx_php_debug("%*s, %d", (int)inline_code.len, inline_code.data, (int)inline_code.len); zend_first_try { if (!plcf->enabled_access_inline_compile){ zend_eval_stringl_ex( (char *)inline_code.data, inline_code.len, NULL, "ngx_php eval code", 1 TSRMLS_CC ); plcf->enabled_access_inline_compile = 1; } ngx_http_php_zend_uthread_create(r, "ngx_access"); }zend_end_try(); }
/** * Evaluate a PHP string * @param phpCode The PHP code to evaluate * @return Value The result of the evaluation */ Value eval(const std::string &phpCode) { // we need the tsrm_ls variable TSRMLS_FETCH(); // the current exception zval* oldException = EG(exception); // the return zval zval* retval = nullptr; if (zend_eval_stringl_ex((char *)phpCode.c_str(), (int32_t)phpCode.length(), retval, (char *)"", 1 TSRMLS_CC) != SUCCESS) { // Do we want to throw an exception here? The original author // did, but there are some reasons not to: // // 1. the PHP eval() function also does not throw exceptions. // // 2. the zend_eval_string() function already triggers a // 'PHP parse error' when an error occurs, which also has // to be handled. If we also throw an exception here, the // user will have to write two error checks: for the error // and the exception. // // if we _do_ want to throw an exception, we will first have to // prevent the original zend_error to occur, and then turn it // into an exception. An exception would be nicer from a C++ // point of view, but because of the extra complexity, we do not // this for now. return nullptr; } else { // was an exception thrown inside the eval()'ed code? In that case we // throw a C++ new exception to give the C++ code the chance to catch it if (oldException != EG(exception) && EG(exception)) throw OrigException(EG(exception) TSRMLS_CC); // no (additional) exception was thrown return retval ? Value(retval) : nullptr; } }