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. (Java)入门训练 斐波那契数列

    问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...

  2. H5 手机拨打电话与转到邮箱的标签属性

    <a href="tel:电话号码"></a> <a href-"mailto:邮箱"></a> 说明:第一个标 ...

  3. WCF开发实战系列一:创建第一个WCF服务

    WCF开发实战系列一:创建第一个WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 在这个实战中我们将使用DataContract,ServiceContract ...

  4. git log 查看提交记录,参数:

    git log 查看提交记录,参数:-n (n是一个正整数),查看最近n次的提交信息 $ git log -2 查看最近2次的提交历史记录 -- fileName fileName为任意文件名,查看指 ...

  5. js变量浅谈

    js变量是除了this以外最让人恶心的东西了,还因为烂语法造成各种各样奇奇怪怪的事情发生,下面让我们来谈谈都有什么奇怪的事: 1.用var与不用var function test(){ a = 123 ...

  6. golang struct tag

    golang可以在struct中的每个字段,写上一个tag.这个tag可以通过反射的机制获取到,最常用的场景就是json序列化和反序列化 package main import ( "enc ...

  7. Java Web之路(五)JSP

    一.jsp的3个指令 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: p ...

  8. C# PointToScreen

    子窗体定位时,如果主窗口不在左上角,需要根据主窗口的坐标,相减才行. Point p1 = Label.PointToScreen(new Point(0, 0)); p1.X -= this.X; ...

  9. 无线DOS攻击

    1.无线连接状态 IEEE 802.11定义了一种客户端状态机制,用于跟踪工作站身份验证和关联状态.无线客户端和AP基于IEEE标准实现这种状态机制.成功关联的客户站停留在状态3,才能进行无线通信.处 ...

  10. QPushButton按钮

    需要 from PyQt5.QtWidgets import QPushButton继承 QAbstractButton 创建按钮控件:QPushButton() 创建一个无父控件的按钮控件QPush ...