├── .gitignore ├── Gruntfile.js ├── README.md ├── example ├── app.js ├── package.json └── views │ └── index.php ├── index.js ├── lib └── PHPExpress │ ├── engine.js │ ├── index.js │ └── router.js ├── package.json └── page_runner.php /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | grunt.initConfig({ 3 | pkg: grunt.file.readJSON('package.json'), 4 | 5 | release: { 6 | options: { } 7 | } 8 | }); 9 | 10 | grunt.loadTasks('tasks'); 11 | grunt.registerTask('default', []); 12 | 13 | grunt.loadNpmTasks('grunt-release'); 14 | }; 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | php-express 2 | =========== 3 | Add PHP support to your express server. 4 | 5 | ## Getting Started 6 | 7 | ### Express 4.x 8 | 9 | ``` 10 | var express = require('express'); 11 | var app = express(); 12 | 13 | // must specify options hash even if no options provided! 14 | var phpExpress = require('php-express')({ 15 | 16 | // assumes php is in your PATH 17 | binPath: 'php' 18 | }); 19 | 20 | // set view engine to php-express 21 | app.set('views', './views'); 22 | app.engine('php', phpExpress.engine); 23 | app.set('view engine', 'php'); 24 | 25 | // routing all .php file to php-express 26 | app.all(/.+\.php$/, phpExpress.router); 27 | 28 | var server = app.listen(3000, function () { 29 | var host = server.address().address; 30 | var port = server.address().port; 31 | console.log('PHPExpress app listening at http://%s:%s', host, port); 32 | }); 33 | 34 | ``` 35 | 36 | ### Express 3.x 37 | 38 | ``` 39 | var express = require('express'), 40 | http = require('http'), 41 | path = require('path'), 42 | 43 | // require php-express and config 44 | phpExpress = require('../')({ 45 | binPath: '/usr/bin/php' // php bin path. 46 | }); 47 | 48 | 49 | // init express 50 | var app = express(); 51 | app.set('port', process.env.PORT || 3000); 52 | app.use(express.bodyParser()); // body parser is required!! 53 | 54 | 55 | // set view engine to php-express 56 | app.set('views', path.join(__dirname, 'views')); 57 | app.engine('php', phpExpress.engine); 58 | app.set('view engine', 'php'); 59 | app.use(app.router); 60 | app.use(express.static(path.join(__dirname, 'public'))); 61 | 62 | 63 | // routing all .php file to php-express 64 | app.all(/.+\.php$/, phpExpress.router); 65 | 66 | 67 | http.createServer(app).listen(app.get('port'), function(){ 68 | console.log('Express server listening on port ' + app.get('port')); 69 | }); 70 | ``` 71 | -------------------------------------------------------------------------------- /example/app.js: -------------------------------------------------------------------------------- 1 | var express = require('express'), 2 | http = require('http'), 3 | path = require('path'), 4 | 5 | // require php-express and config 6 | phpExpress = require('../')({ 7 | binPath: '/usr/bin/php' // php bin path. 8 | }); 9 | 10 | 11 | // init express 12 | var app = express(); 13 | app.set('port', process.env.PORT || 3000); 14 | app.use(express.bodyParser()); // body parser is required!! 15 | 16 | 17 | // set view engine to php-express 18 | app.set('views', path.join(__dirname, 'views')); 19 | app.engine('php', phpExpress.engine); 20 | app.set('view engine', 'php'); 21 | app.use(app.router); 22 | app.use(express.static(path.join(__dirname, 'public'))); 23 | 24 | 25 | // routing all .php file to php-express 26 | app.all(/.+\.php$/, phpExpress.router); 27 | 28 | 29 | http.createServer(app).listen(app.get('port'), function(){ 30 | console.log('Express server listening on port ' + app.get('port')); 31 | }); 32 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "php-express-example", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "express": "3.1.1" 10 | } 11 | } -------------------------------------------------------------------------------- /example/views/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | php-express-sample 4 | 5 | 6 | hello, !! 7 | 8 | 9 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var PHPExpress = require('./lib/PHPExpress'); 2 | 3 | module.exports = function (opts) { 4 | return new PHPExpress(opts); 5 | }; 6 | 7 | -------------------------------------------------------------------------------- /lib/PHPExpress/engine.js: -------------------------------------------------------------------------------- 1 | var path = require('path'), 2 | util = require('util'), 3 | querystring = require('querystring'), 4 | child_process = require('child_process'); 5 | 6 | var engine = function (filePath, opts, callback) { 7 | var binPath = this.binPath, 8 | runnerPath = this.runnerPath, 9 | displayErrors = this.displayErrors, 10 | 11 | method = opts.method || 'GET', 12 | get = opts.get || {}, 13 | post = opts.post || {}, 14 | 15 | query = opts.query || querystring.stringify(get), 16 | body = opts.body || querystring.stringify(post), 17 | 18 | env = { 19 | REQUEST_METHOD: method, 20 | CONTENT_LENGTH: body.length, 21 | QUERY_STRING: query 22 | }; 23 | 24 | var command = util.format( 25 | '%s %s %s %s', 26 | (body ? util.format('echo "%s" | ', body) : '') + binPath, 27 | runnerPath, 28 | path.dirname(filePath), 29 | filePath 30 | ); 31 | 32 | child_process.exec(command,{ 33 | env: env 34 | }, function (error, stdout, stderr) { 35 | if (error) { 36 | 37 | // can leak server configuration 38 | if (displayErrors && stdout) { 39 | callback(stdout); 40 | } else { 41 | callback(error); 42 | } 43 | } else if (stdout) { 44 | callback(null, stdout); 45 | } else if (stderr) { 46 | callback(stderr); 47 | } else { 48 | callback(null, null); 49 | } 50 | }); 51 | }; 52 | 53 | module.exports = engine; 54 | -------------------------------------------------------------------------------- /lib/PHPExpress/index.js: -------------------------------------------------------------------------------- 1 | var PHPExpress = function (opts) { 2 | opts = opts || {}; 3 | 4 | this.binPath = opts.binPath || '/usr/bin/php', 5 | this.runnerPath = opts.runnerPath || (__dirname + '/../../page_runner.php'); 6 | 7 | // default to true for easier PHP debugging 8 | this.displayErrors = typeof opts.displayErrors === 'undefined' ? true : opts.displayErrors; 9 | 10 | this.engine = require('./engine').bind(this); 11 | this.router = require('./router').bind(this); 12 | }; 13 | 14 | module.exports = PHPExpress; 15 | -------------------------------------------------------------------------------- /lib/PHPExpress/router.js: -------------------------------------------------------------------------------- 1 | module.exports = function(req, res) { 2 | res.render(req.path.slice(1), { 3 | method: req.method, 4 | get: req.query, 5 | post: req.body 6 | }); 7 | }; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "php-express", 3 | "version": "0.0.3", 4 | "description": "enable express server to exec php.", 5 | "directories": { 6 | "lib": "lib", 7 | "example": "example" 8 | }, 9 | "devDependencies": { 10 | "grunt-release": "0.13.*", 11 | "grunt": "~0.4.5" 12 | }, 13 | "main": "index.js", 14 | "repository": { 15 | "type": "git", 16 | "url": "git://github.com/fnobi/php-express.git" 17 | }, 18 | "keywords": [ 19 | "php", 20 | "express" 21 | ], 22 | "author": "Fujisawa Shin", 23 | "license": "BSD", 24 | "readmeFilename": "README.md", 25 | "gitHead": "e9c37ba107ca844fd26c6f03e0d30fd7638031aa" 26 | } 27 | -------------------------------------------------------------------------------- /page_runner.php: -------------------------------------------------------------------------------- 1 | 0)) 10 | { 11 | parse_str(fread(STDIN, $_SERVER['CONTENT_LENGTH']), $_POST); 12 | } 13 | 14 | chdir($argv[1]); 15 | require_once $argv[2]; 16 | --------------------------------------------------------------------------------