Git Product home page Git Product logo

pux's Issues

route '/' handling differs

Sample code:

<?php
require __DIR__ . '/../vendor/autoload.php';
$mux = new Pux\Mux;
$mux->add('/', [ 'PageController', 'page1' ]);
$route = $mux->dispatch('/abc');
var_dump($route);

Result of 1.4.0:

NULL

Result of 1.5.0:

array(4) {
  [0] =>
  bool(false)
  [1] =>
  string(1) "/"
  [2] =>
  array(2) {
    [0] =>
    string(14) "PageController"
    [1] =>
    string(5) "page1"
  }
  [3] =>
  array(0) {
  }
}

Is this a bug or not?

route '/' handling differs

Sample code:

<?php
require __DIR__ . '/../vendor/autoload.php';
$mux = new Pux\Mux;
$mux->add('/', [ 'PageController', 'page1' ]);
$route = $mux->dispatch('/');
var_dump($route);

Result with C extension 1.3.1:

array (size=4)
  0 => boolean false
  1 => string '/' (length=1)
  2 => 
    array (size=2)
      0 => string 'PageController' (length=14)
      1 => string 'page1' (length=5)
  3 => 
    array (size=0)
      empty

Pux 1.3.2 Result without C extension:

null

The result without C extension seem to be a bug.

Typed Function Calls

Hi!

We're interested in adding typed function calls to Pux and contributing them back to the project. Taking this example from the docs:

$mux->get('/product/:id', ['ProductController','itemAction'] , [
    'require' => [ 'id' => '\d+', ],
    'default' => [ 'id' => '1', ]
]);

would become:

$mux->get('/product/:id', ['ProductController','itemAction'] , [
    'require' => [ 'id' => Pux\Mux::TYPE_INTEGER, ],
    'default' => [ 'id' => '1', ]
]);

This would automatically match against \d+ and result in a call to as ProductionController()->itemAction( (int) $id) instead of passing a string type.

Why?

This will simplify controller logic and allow invalid input to be sent to a 404 page instead of through controller logic.

It also allows folks to start converting over to Hack / HHVM for other performance gains.

Any concerns over this feature? Will this have any impact on the C extension (which we don't use so I wouldn't be adding any code in).

Annotation value case exception?

Hi @mway,

The doc_var_len is decided by a space char. but what if an user ends the line with \n not a space? that might return a path like /path\n?

int doc_var_val_len = strstr(doc_var_substr_start, " ") - doc_var_substr_start - 1;

Is it possible to read the Route like Symfony do? because our annotation actually reads this syntax:

class PostController extends Controller
{
    /**
     * @Route("/")
     * @Method("GET")
     */
    public function indexAction()
    {
        // ...
    }
}

Add Pux pure PHP to the benchmark information

I hate to say it, but comparing a C extension to a pure PHP implementation is like comparing a racehorse against a donkey. Especially for something like this. So saying the extension is faster than the Symphony router isn't saying much.

Personally, I'd like to know where the pure PHP implementation of Pux stands in relation to the extension, as well as other libraries.

zend_mm_heap corrupted

By running the MuxTest:

   ./run-test -- --repeat 1000 test/Pux/MuxTest.php
   ....zend_mm_heap corrupted

memory leak of getRequestMethodConstant

Hi @mway,

it seems like we have memory leak in PHP_METHOD(Mux, getRequestMethodConstant).

mthit = mthp is estrdup from req_method. but it's not freed via efree.

branch: feature/annotation

Implement pux_fetch_mux and pux_store_mux to support persistent mux.

to reach the goal of #18, we should first implement the basic functions to store/fetch mux.

currently we've done the pux_store_mux function, now we need to implement pux_fetch_mux.

the API is something like APC, but we store the zval without serialization/unserialization:

if (  ($mux = pux_fetch_mux('app_pmux')) == null ) {
   $mux = new Mux;
   pux_store_mux('app_pmux', $mux);
}

Compile route patterns to one single pattern

Currently we're looping all PCRE patterns to match the correct route, which provides a nice flexibility - you can mount sub-routes to a parent one, or dispatch the path in sub-router dynamically.

However in different case, for example: like 100 pattern routes, we should have different dispatching strategy to dispatch routes.

One idea is to Compile all route patterns into one grouped pattern, and the dispatching can be done in one regular expression comparison.

Unknown License

Hi c9s,

My team and I are willing to make a php Framework for a student project and we were wondering under which license is Pux ?

Best regards,

Thomas.

Provide a generic controller in C extension

  1. provide empty "before" method for triggering.
  2. provide empty "after" method for triggering.
  3. provide a method to get all action method.
  4. provide a toJson method to encode data in JSON format.

default action path for indexAction from controller

Hi @mway

it seems the path for indexAction is defined to / by default, however if we mount a controller to something like "/product" we got "/product/", the correct path should be /product.

I think the default path of indexAction should be an empty string. :-)

you may run the unit test to see the result:

 cd ext/
 ./compile && ./run-test -- test/Pux/ControllerTest.php

Expanding route for Mux to mount causes gc scan access fail.

Hi @mway,

I tested the new AnnotationController, and found there is a weird gc bug, which is not shown previously, not sure what changed/forgot to set the refcount? :

https://github.com/c9s/Pux/blob/develop/test/Pux/ControllerAnnotationTest.php#L27

Here is the code that causes gc failed:

        // works fine
        // $submux = $controller->expand();
        // $mux->mount('/product', $submux );

        // gc scan bug
        $mux->mount('/product', $controller->expand() );

to reproduce this issue , simply run the test cases with --repeat 500 or so:

./run-test --  --repeat 500 --debug test/Pux/ControllerAnnotationTest.php

you might need a zts enabled + debug php to trace this issue.

strcmp vs strncmp

I have a question:
Mux.php
line 241
In a route like $mux->add('/page.html') it matches /page.html but too /page.html1234abcd.
Changing
if ( strncmp($route[1] , $path, strlen($route[1]) ) === 0 ) {
with
if ( strcmp($route[1] , $path ) === 0 ) {
that not happen, responds only the exact match /page.html.
Is there a reason for using strncmp?

Persistent Mux in the extension

To improve even more the performance, you can make create an alias for the Mux class and it be stored in the extension persistent memory.

For web requests, the first request will load from the compiled router file. For subsequent request it can use the persisted object in memory. It will avoid file access to read the compiled file and re-load all the objects for every request.

You can make something like:

$mux = \Pux\MuxCache::load('compiled_router.php', 'app_routes');
// If not stored, include compiled_router and persist it, otherwise just use the persisted object from app_routes alias

\Pux\MuxCache::clear(); // Remove all persisted objects

Something like that. Thoughts?

Support to alias and reverse's URL

Hello.

Congratulations for the excellent router!

I am sending a suggestion to improve it in usability for developers (seriously, its a great feature, not in performance, but..it can help for big sites): Allow developer to specify a alias related to a router and reverse the URL based on its alias+options.

Say i have the code that follows:

    require 'vendor/autoload.php';
    use Pux\Executor;

    class ProductController {
        public function listAction() {
            return 'product list';
        }
        public function itemAction($id) { 
            return "product $id";
        }
    }
    $mux = new Pux\Mux;
    $mux->add('/product', ['ProductController','listAction']);
    $mux->add('/product/:id', ['ProductController','itemAction'] , [
        'require' => [ 'id' => '\d+', ],
        'default' => [ 'id' => '1', ],
        'alias' => 'product-page'
    ]);

If i do the following in some place of the code (its great specially for use in templates, but..):

    $url = $mux->reverse('product-page', [
        'id' => '10'
    ]);

And $url will need to have /product/10 string, all with the great speed of Pux. \o/

What you think?

Use C struct as the presentation of route

Since we seldom use getRoutes method, we can handle the routes in an efficient way internally. That is, use C struct to save route pcre flag, pattern string instead of looping the zval array and extra zend _index_find calls.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.