Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Good work, how and where to use? #108

Open
betrixed opened this issue Jul 23, 2020 · 1 comment
Open

Good work, how and where to use? #108

betrixed opened this issue Jul 23, 2020 · 1 comment

Comments

@betrixed
Copy link

I followed this because of noting results on Techempower benchmarks #19. A link to the benchmark code would be nice.

Following instructions, I had success with this, on setting up nginx 1.19.0 and php 7.4.7, and running a few local php scripts from browser. I have callled a few of the ngx_php7 API. I note that the static class method call versions did not work.

On my system, nginx compiled the ngx_php addon directly into the nginx binary.

On testing some scripts, I found.
API ngx_request::server_protocol(void) : string produced an error, but ngx_request_server_protocol(void) : string worked OK.

I make a guess here, and ask to confirm. Is it true that PHP does automatically write back to the open socket stream connection given by nginx as default?

I note that require once only works for one invocation, after which all classes remain defined. It is similar to the new php code preload facility which I haven't yet made to work.

Too many PHP frameworks that I know all make some anchoring usage of class static variable, instance singleton, or global.

@rryqszq4
Copy link
Owner

rryqszq4 commented Aug 7, 2020

@betrixed
Thanks for your feedback !

First question, 'ngx_request::server_protocol' is an older API, but it is nothing different compare with 'ngx_request_server_protocol', and need some error details.

Secode question that ngx_php is per worker one php virtual machine and all of class must be defined only once .

About last question, if not use non-block API and just need to adapted SAPI can be work run.
For example (master of branch):

class NgxphpDriver
{
    public static $server = null;

    public static $requestHandleRunner = null;

    public static $flarumBody = null;

    public static $fixSplAutoloadRegister = [];

    public static function boostrap($site) {
        ngx_header_set("Content-Type", "text/html; charset=UTF-8");

        $_SERVER = [];
        $_SERVER["REQUEST_URI"] = ngx_request_uri();
        $_SERVER["QUERY_STRING"] = ngx_request_query_string();
        $_SERVER["REQUEST_METHOD"] = ngx_request_method();
        $_SERVER["REMOTE_ADDR"] = ngx_request_remote_addr();

        $headers = ngx_request_headers();
        foreach ($headers as $k => $v) {
            $_SERVER["HTTP_".strtoupper($k)] = $v;
        }

        $get = ngx_query_args();$_GET = empty($get) ? [] : $get;
        $post = ngx_post_args();$_POST = empty($post) ? [] : $post;
        foreach ($_GET as $k => $v) {
            $_GET[urldecode($k)] = urldecode($v);
            if ($k != urldecode($k)) {
                unset($_GET[$k]);
            }
        }

        if (\function_exists('ngx_request_body')) {
            self::$flarumBody = ngx_request_body();
        }

        if (self::$server == null) {
            self::$server = new Server($site);
        }

        self::$server->listen();

        gc_collect_cycles();
    }

    public static function httpRedirect($uri) {
        if (\function_exists('ngx_redirect')) {
            ngx_redirect((string) $uri);
        }
    }

    public static function httpStatus($status) {
        if (\function_exists("ngx_status")) {
            ngx_status($status);
        }
    }

    public static function httpSetCookie($name, $value, $expires, $maxAge, $path, $domain, $secure, $httpOnly){
        if (\function_exists('ngx_cookie_set')) {

            $arr_cookie = [
                $name => $value,
                'Expires' => $expires,
                'Max-Age' => $maxAge,
                'Path' => $path,
                //'domain' => $obj_cookie->getDomain(),
                //'secure' => $obj_cookie->getSecure(),
                //'httpOnly' => $obj_cookie->getHttpOnly()
            ];
            $str_cookie = [];
            foreach ($arr_cookie as $k => $v) {
                array_push($str_cookie, "$k=$v");
            }
            $str_cookie = implode("; ", $str_cookie);
            ngx_cookie_set($str_cookie);
        }
    }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants