1 折腾 php nodejs 到一起

nodejs当然很火,就像着火了一样,但是必须承认要搭建一个前端的demo开发环境还是PHP靠谱, windows下可以非常的集成套件,比如http://www.apachefriends.org/zhcn/xampp.html, PHP语言本身就是一个强大的模板,写demo时,共用头尾,可以通过include和require引入,可以内嵌 循环生成一些dom结构,相较而言,node还是不那么方便的。

既然PHP已经那么方便了,可是为什么还是要跟node一起用呢,真的有点为了用而用了……

2 how?

如你安装了Python,可以立马执行一个简单的命令,一个简便的开发服务器就完成了。

python -m SimpleHTTPServer

但是PHP,直到php5.4才支持类似的功能

$ php -S 0.0.0.0:8000
PHP 5.4.0 Development Server started at Tue Aug 21 23:21:50 2012
Listening on 0.0.0.0:8000
Document root is /home/tom
Press Ctrl-C to quit.

php本身就可以架一个服务器,Nodejs也可以架一个服务器,那么就不用啥apache啦,nginx啦

基本思路就是Node开启一个服务器作为前台,监听80端口,类似Apache的角色,php开启一个服务器在后台运行。 Node服务将http请求转发给php服务器执行,执行完成后返回给node服务器,node服务器再返回给浏览器

Node承担的是一个中间的代理角色

var fs = require('fs'),
    http = require('http'),
    spawn = require('child_process').spawn,
    phpserver;

phpserver = spawn('php',['-S','0.0.0.0:8000']);
phpserver.stdout.on('data', function (data) {
  console.log('stdout: ' + data);
});
phpserver.stderr.on('data', function (data) {
  console.log('stderr: ' + data);
});
phpserver.on('exit', function (code) {
  console.log('child process exited with code ' + code);
});

process.on('exit',function(){
  phpserver.kill('SIGHUP');
});

function handleRequest(request, response) {
  var headers = {};

  for(var x in request.headers){
    headers[x] = request.headers[x];
  }

  headers['Content-Type']= 'application/x-www-form-urlencoded';

  var proxy_request = http.request({
    host:'localhost',
    port:8000,
    method:request.method,
    path:request.url,
    headers:headers
  });

  proxy_request.on('response', function (proxy_response) {
    response.writeHead(proxy_response.statusCode,proxy_response.headers);
    proxy_response.on('data', function(chunk) {
      response.write(new Buffer(chunk));
    });
    proxy_response.on('end', function() {
      response.end();
    });

  });

  request.on('data', function(chunk) {
    proxy_request.write(new Buffer(chunk));
  });

  request.on('end', function() {
    proxy_request.end();
  });
}
http.createServer(handleRequest).listen(80);

保存上面的文件为server.js然后在命令行里执行

node server.js

一个node和php混搭的服务器就搭建成功了

3 注意点

 

3.1 请求和响应数据须是Buffer对象

response.write(new Buffer(chunk))
proxy_request.write(new Buffer(chunk));

3.2 要想传递表单数据,需要在header设置

headers['Content-Type']= 'application/x-www-form-urlencoded';

Author: tom

Date: 2012-08-21 23:44:28 CST

HTML generated by org-mode 6.33x in emacs 23

php和NodeJs共存的开发环境的更多相关文章

  1. nodejs 代理 解决开发环境跨域问题

    前后端分离项目中,会遇到跨域问题.解决方法无非就是jsonp cors等. 本次项目前端不搭node服务,线上用nginx搭站点,nginx转发ajax请求server. 本地开发环境的跨域问题用no ...

  2. Windows下搭建NodeJS绿色版开发环境

    文章最初发布于szhshp的第三边境研究所, 转载请注明 开发背景 博客一直用的是Jekyll, 突然想玩玩NodeJS和Hexo, 于是就试着搭建一下 绿色环境, 基于Window8, 不需要管理员 ...

  3. 配置同时使用 Gitlab、Github、Gitee(码云) 共存的开发环境

    首先确认已安装Git,可以通过 git –version 命令可以查看当前安装的版本. Mac OSX 中都已经安装了Git.但是,Git的版本未必是最新的. 可以通过命令 git clone htt ...

  4. Mac打造python2 python3开发环境

    最新版的MacOS Sierra默认带的python环境仍然为2.7.10,本文将介绍使用Brew安装python3.5并做简单的配置,打造python2,python3共存的开发环境 直接尝试bre ...

  5. Linux服务器oraclejdk与openjdk共存并配置JavaEE开发环境

    由于本人学业的需要,需要在linux中搭建JavaEE开发环境,与windows的同学协同开发. JDK 由于fedora默认使用openjdk,移除多多少少会出现点问题,由于很多开源软件默认使用到它 ...

  6. Win7搭建NodeJs开发环境以及HelloWorld展示—图解

    Windows 7系统下搭建NodeJs开发环境(NodeJs+WebStrom)以及Hello World!展示,大体思路如下:第一步:安装NodeJs运行环境.第二步:安装WebStrom开发工具 ...

  7. windows下的Nodejs及npm的安装、常用命令,Nodejs开发环境配置

    http://www.cnblogs.com/webstorm/p/5744942.html ***************************************** 第一步:下载Nodej ...

  8. Nodejs学习笔记(一)--- 简介及安装Node.js开发环境

    目录 学习资料 简介 安装Node.js npm简介 开发工具 Sublime Node.js开发环境配置 扩展:安装多版本管理器 学习资料 1.深入浅出Node.js http://www.info ...

  9. CentOS 7快速搭建Nodejs开发环境

    Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好.学习Nodejs首先需要会安装环境.这里我介绍如 ...

随机推荐

  1. nginx 耗时原因定位总结

    这几天在优化服务器的响应时间,在根据 nginx 的 accesslog 中 $request_time 进行程序优化时,发现有个接口,直接返回数据,平均的 $request_time 也比较大.原来 ...

  2. ajax上传文件及进度显示

    之前在博文:原生ajax写法就提及过ajax2.0与1.0的差别是多了FormData和利用FormData文件上传(当然还有跨域,但不是本文的重点). 那么具体怎么样实现ajax上传文件呢? 一般来 ...

  3. 关于Springboot打包错误的问题 | Failed to execute goal org.springframework.boot:spring-boot-maven-plugin

    最近在使用spring-boot整合多模块,但是在父pom中打包maven install时总会报错:Failed to execute goal org.springframework.boot:s ...

  4. synchronized的一些记录

    1.方法内的私有变量,不存在线程安全问题.非线程安全问题存在于实例变量(全局变量)中 2.在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用) 3.synchroni ...

  5. centos shell运行报语法错误: 未预期的文件结尾

    可能原因: 脚本是windows下写的,然后传到linux下运行的 需要给dos文件格式转成unix dos转unix 安装: yum install dos2unix 命令: dos2unix fi ...

  6. 重定向printf

    #include "stdio.h" #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else# ...

  7. Linux下解压缩

    1)对于.tar结尾的文件 tar -xf all.tar 2)对于.gz结尾的文件 gzip -d all.gz gunzip all.gz 3)对于.tgz或.tar.gz结尾的文件 tar -x ...

  8. sonar扫描java、js、jsp技术

    最近在弄sonar扫描的事情,之前一直只能扫描java代码,这样统计出来的数据上报领导很多开发人员不服(说我不用写jsp了不用写js了?), 那么好,于是乎继续整sonar,在官网中看到sonar其实 ...

  9. css命名规范: BEM 的命名法

    整理自:前端早读课[第1183期]这些 CSS 命名规范,将省下你大把调试时间 试图解决 3 类问题: 仅从名字就能知道一个 CSS 选择器具体做什么 从名字能大致清楚一个选择器可以在哪里使用 从 C ...

  10. Toy Train(贪心)

    题目链接:http://codeforces.com/contest/1130/problem/D1 题目大意:给你n个点,然后m条运输任务,然后问你从每个点作为起点是,完成这些运输任务的最小花费?每 ...