很多站长朋友们都不太清楚node和php并发,今天小编就来给大家整理node和php并发,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 php的性能要比node.js高很多吗? 2、 php与nodejs通信问题 3、 node.js和php哪个简单 4、 php怎么实现多个接口同时触发 对于先返回的数据先处理? 5、 php如何实现websocket php的性能要比node.js高很多吗?有学习Swoole的疑惑、遇到瓶颈期的PHPer可在底部留言给我!!!
在本机windows环境下的测试:8G内存,4GCPU,win7系统,插入10000条记录测试比较,php和nodejs的性能。
当改为10000条记录插入,php耗时1.65 seconds,nodejs耗时318微秒,nodejs还是快得比较明显。
php与nodejs通信问题就几条请求的话,php用fopen或curl访问一个nodejs服务器网址,用参数传递下要求..
频繁或复杂通讯是要用rpc的..
node.js和php哪个简单单论做网站,应该是php简单。。但node.js也不算太难,而且能做到的事情,比php多很多。
php是个过时的技术,和ASP是同代的产物(asp.net的前身)那时候名叫C- -,后来改名才叫PHP的。就和windowsXP一样。技术上没有任何优势。但市场还在,尽管早晚是要被淘汰的,但由于学习门槛低,又确实有市场需求。所以淘汰速度并不快
JAVASCRIPT是个90后,按说也算是比较老了,但NODE却是门新兴技术。。由于非阻塞异步io实现,导致node的io效率非常高。。。实际测试,node的效率,大约比php高出70-100倍左右。。而且node除了做网站之外,还可以搞嵌入式,树莓派,甚至网游服务器。。
简单概括,如果只是做网站,php简单些。。。但个人还是推荐node。。一个是夕阳技术,一个是朝阳技术。。。其实很容易判断
不过把范围再扩大一些的话,我觉得两个的学习价值都不高。因为都是动态语言,在编写中型以上项目时,都会不可避免的受限于动态语言天生的劣根性,导致各种问题。学习性价比最高的应该是.NET CORE。学习比node难不了太多,而性能却是顶级的。或者Java,岗位多需求大,属于最四平八稳的选择。如果要长期做程序,转向静态语言是迟早的事儿。无论Node,还是php,都只是过渡之下的产物,而不是最终选择。
php怎么实现多个接口同时触发 对于先返回的数据先处理?需求描述不准确。
你是需要在客户端同时访问几个接口(接口端用的php)?
1.如果是这个需求的话,客户端js自带异步属性,用ajax,同时做几个调用,在回调里处理数据就行了,只是服务器端,如果有session,需要确保耗时操作前写入并关闭session,不然同一个客户端的访问会被session卡住(默认的文件模式的session)
2.还是需要在php代码中同时进行多个接口并发调用,在各自返回时处理,然后整合结果输出 ?
这种的话,php本身不支持异步并发编程,可以考虑用nodejs或者php的扩展 swoole 之类的去做
php如何实现websocketphp有可用的websocket库,不需要php-fpm。
目前比较成熟的有swoole(swoole测试数据),和workman(workman.net)
swoole是c写的php扩展, 效率比nodejs还要高,workman是纯php实现,两者都号称可以实现并发百万TCP连接。
给你个例子:
这个要通过cmd运行的?具体带的参数有点忘记了
<?php
????error_reporting(E_ALL);
????set_time_limit(0);
????ob_implicit_flush();
????//创建一个socket连接?设置参数?绑定?监听?并且返回
????$master??=?WebSocket("localhost",12345);
????//标示是否已经进行过握手了
????$is_shaked?=?false;
????//是否已经关闭
????$is_closed?=?true;
????//将socket变为一个可用的socket
????while(true){
????????//如果是关闭状态并且是没有握手的话?则创建一个可用的socket(貌似第二个条件可以去除)
????????if($is_closed??!$is_shaked){
????????????if(($sock?=?socket_accept($master))?<?0){
????????????????echo?"socket_accept()?failed:?reason:?"?.?socket_strerror($sock)?.?"\n";
????????????}
????????????//将关闭状态修改为false
????????????$is_closed?=?false;
????????}
????????//开始进行数据处理
????????process($sock);
????}
????//处理请求的函数
????function?process($socket){
????????//先从获取到全局变量
????????global?$is_closed,?$is_shaked;
????????//从socket中获取数据
????????$buffer?=?socket_read($socket,2048);
????????//如果buffer返回值为false并且已经握手的话?则断开连接
????????if(!$buffer??$is_shaked){
????????????disconnect($socket);
????????}else{
????????????//如果没有握手的话则握手?并且修改握手状态
????????????if($is_shaked?==?false){
????????????????$return_str?=?dohandshake($buffer);
????????????????$is_shaked?=?true;
????????????}else{
????????????????//如果已经握手的话则送入deal函数中进行相应处理
????????????????$data_str?=?decode($buffer);????//解析出来的从前端送来的内容
????????????????console($data_str);
????????????????$return_str?=?encode(deal($socket,?$data_str));
????????????????//$return_str?=?encode($data_str);
????????????}
????????????//将应该返回的字符串写入socket返回
????????????socket_write($socket,$return_str,strlen($return_str));
????????}
????}
????function?deal($socket,?$msgObj){
????????$obj?=?json_decode($msgObj);
????????foreach($obj?as?$key=>$value){
????????????if($key?==?'close'){
????????????????disconnect($socket);
????????????????console('close?success');
????????????????return?'close?success';
????????????}else?if($key?==?'msg'){
????????????????console($value."\n");
????????????????return?$value;
????????????}
????????}
????}
????//获取头部信息?
????function?getheaders($req){
????????$r=$h=$o=null;
????????if(preg_match("/GET?(.*)?HTTP/"???,$req,$match)){?$r=$match[1];?}
????????if(preg_match("/Host:?(.*)\r\n/"??,$req,$match)){?$h=$match[1];?}
????????if(preg_match("/Origin:?(.*)\r\n/",$req,$match)){?$o=$match[1];?}
????????if(preg_match("/Sec-WebSocket-Key:?(.*)\r\n/",$req,$match)){?$key=$match[1];?}
????????if(preg_match("/\r\n(.*?)\$/",$req,$match)){?$data=$match[1];?}
????????return?array($r,$h,$o,$key,$data);
????}
????function?WebSocket($address,$port){
????????$master=socket_create(AF_INET,?SOCK_STREAM,?SOL_TCP)?????or?die("socket_create()?failed");
????????socket_set_option($master,?SOL_SOCKET,?SO_REUSEADDR,?1)??or?die("socket_option()?failed");
????????socket_bind($master,?$address,?$port)????????????????????or?die("socket_bind()?failed");
????????socket_listen($master,20)????????????????????????????????or?die("socket_listen()?failed");
????????echo?"Server?Started?:?".date('Y-m-d?H:i:s')."\n";
????????echo?"Master?socket??:?".$master."\n";
????????echo?"Listening?on???:?".$address."?port?".$port."\n\n";
????????return?$master;
????}
????function?dohandshake($buffer){
????????list($resource,$host,$origin,$key,$data)?=?getheaders($buffer);
????????echo?"resource?is?$resource\n";
????????echo?"origin?is?$origin\n";
????????echo?"host?is?$host\n";
????????echo?"key?is?$key\n\n";
????????$response_key?=?base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',?true));
????????$return_str?=?"HTTP/1.1?101?Switching?Protocols\r\n".
????????????????????"Upgrade:?websocket\r\n".
????????????????????"Connection:?Upgrade\r\n".
????????????????????"Sec-WebSocket-Accept:?$response_key\r\n\r\n";
????????return?$return_str;
????}
????function?console($msg){
????????$msg?=?transToGBK($msg);
????????echo?"$msg\n";
????????return?$msg;
????}
????function?decode($msg="")?{
????????$mask?=?array();
????????$data?=?"";
????????$msg?=?unpack("H*",$msg);
????????$head?=?substr($msg[1],0,2);
????????if?(hexdec($head{1})?===?8){
????????????$data?=?false;
????????}?else?if?(hexdec($head{1})?===?1){
????????????$mask[]?=?hexdec(substr($msg[1],4,2));
????????????$mask[]?=?hexdec(substr($msg[1],6,2));
????????????$mask[]?=?hexdec(substr($msg[1],8,2));
????????????$mask[]?=?hexdec(substr($msg[1],10,2));
????????????$s?=?12;
????????????$e?=?strlen($msg[1])-2;
????????????$n?=?0;
????????????for?($i=?$s;?$i<=?$e;?$i+=?2){
????????????????$data?.=?chr($mask[$n%4]^hexdec(substr($msg[1],$i,2)));
????????????????$n++;
????????????}??
????????}??
????????return?$data;
????}
????function?encode($msg=""){
????????$frame?=?array();
????????$frame[0]?=?"81";
????????$msg?.=?'?is?ok';
????????$len?=?strlen($msg);
????????$frame[1]?=?$len<16?"0".dechex($len):dechex($len);
????????$frame[2]?=?ord_hex($msg);
????????$data?=?implode("",$frame);
????????return?pack("H*",?$data);
????}
????function?transToGBK($s){//UTF8->GBK
????????//echo?$s;
????????return?iconv("UTF-8",?"GBK",?$s);
????????return?$s;
????}
????function?ord_hex($data){
????????$msg?=?"";
????????$l?=?strlen($data);
????????for?($i=0;?$i<$l;?$i++){
????????????//ord是返回字符串第一个字符的ascii值
????????????//dechex把十进制转换为十六进制
????????????$msg?.=?dechex(ord($data{$i}));
????????}
????????return?$msg;
????}
????function?disconnect($socket){
????????global?$is_shaked,?$is_closed;
????????$is_shaked?=?false;
????????$is_closed?=?true;
????????socket_close($socket);
????}
?>
关于node和php并发的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于node和php并发 php和nodejs的详细内容...