phpnginxhhvm

Any way to always send HHVM all request to same file in server mode (not FastCGI)?


Working setup, assume a request to http://127.0.0.1:8080/path/to/resource:

In order to take nginx or apache out of the picture when running hhvm for dev purposes or just fun, I run hhvm in server mode (NOT FastCGI mode!!!):

cd /some/path/public/
hhvm -m server -p 8080

However, the framework doesn't handle the index.php in the path gracefully. When served by hhvm running in server mode the only urls that work are:

 http://127.0.0.1:8080/index.php
 ...or...
 http://127.0.0.1:8080

Anything more complex fails like:

http://127.0.0.1:8080/path/to/resource  (HHVM fails, file not found)

Also, sticking in an explicit index.php fails as the framework doesn't handle the index.php in the REQUEST_URI gracefully.

http://127.0.0.1:8080/index.php/path/to/resource  (HHVM works, but framework fails, `index.php` in uri confuses it)

Does anyone know a way to get this to work where ALL request are sent to the root /some/path/public/index.php? Is there an option to set the SCRIPT_NAME explicitly via a option flag/setting?

Ideally the request http://127.0.0.1:8080/path/to/resource would have:


Solution

  • Ok, I figured a few ways, running HHVM 3.18.1 with some help from another SO user.

    The best way is to use virtual hosts rewite rules:

    hhvm.server.default_document = index.php
    
    hhvm.virtual_host[default][rewrite_rules][common][pattern] = "(.*)"
    hhvm.virtual_host[default][rewrite_rules][common][to] = "index.php/$1"
    hhvm.virtual_host[default][rewrite_rules][common][qsa] = true
    

    Had a hard time finding documentation on this, but here's a link to the HHVM docs sort of explaining: https://docs.hhvm.com/hhvm/configuration/INI-settings#server-mode__virtual-host-format

    Note that the documentation is the old format, not the new ini format, so option names should be converted from CamelCase to underscore seperated like camel_case.

    Another, less elegant way: Without using rewrites, you can hijack 404's. You need to set BOTH the parameters

    Set both of these to whatever your default index/routing file is--let your framework handle 404 messages.

    You can set these in an ini config file (I'll call it server.ini):

     hhvm.server.default_document = /path/to/index.php
     hhvm.server.error_document404 = /path/to/index.php
    

    Then you can start the server with:

     hhvm -m server  -p 8080  -c /path/to/server.ini
    

    You can also skip the INI file and pass the details in when starting HHVM:

     hhvm -m server -p 8080 -d  hhvm.server.default_document=/path/to/index.php -d hhvm.server.error_document404=/path/to/index.php
    

    If you don't want to have to run hhvm from a specific folder, you can also set:

    hhvm.server.source_root=/path/to/doc_root
    

    Notes: