当前位置: 首页 > 编程日记 > 正文

轻量级简单队列服务HTTPSQS安装与使用

原文地址:http://blog.s135.com/httpsqs

1.安装

wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz
tar zxvf libevent-2.0.12-stable.tar.gz
cd libevent-2.0.12-stable/
./configure --prefix=/usr/local/libevent-2.0.12-stable/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/tokyocabinet-1.4.47.tar.gz
tar zxvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47/
./configure --prefix=/usr/local/tokyocabinet-1.4.47/
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47/
make
make install
cd ../

wget http://httpsqs.googlecode.com/files/httpsqs-1.7.tar.gz
tar zxvf httpsqs-1.7.tar.gz
cd httpsqs-1.7/
make
make install
cd ../


性能调优(可选

#ulimit -SHn 65535


2.启动

#httpsqs -d -p 1218 -x /data0/queue

请使用命令“killall httpsqs”、“pkill httpsqs”和“kill `cat /tmp/httpsqs.pid`”来停止httpsqs。

  注意:请不要使用命令“pkill -9 httpsqs”和“kill -9 httpsqs的进程ID”来结束httpsqs,否则,内存中尚未保存到磁盘的数据将会丢失。


3.调用


(1)、入队列(将文本消息放入队列):

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?name=your_queue_name&opt=put&data=经过URL编码的文本消息&auth=mypass123"


HTTP POST 协议(以curl命令为例):
curl -d "经过URL编码的文本消息" "http://host:port/?name=your_queue_name&opt=put&auth=mypass123"

(2)、出队列(从队列中取出文本消息):

  HTTP GET 协议(以curl命令为例):

curl "http://host:port/?charset=utf-8&name=your_queue_name&opt=get&auth=mypass123"


curl "http://host:port/?charset=gb2312&name=your_queue_name&opt=get&auth=mypass123"


httpsqs_client.php

<?php 
/* ---------------------------------------------------------------------------------------------------------------- 
HTTP Simple Queue Service - httpsqs client class for PHP v1.7.1  
Author: Zhang Yan (http://blog.s135.com), E-mail: net@s135.com 
This is free software, and you are welcome to modify and redistribute it under the New BSD License 
---------------------------------------------------------------------------------------------------------------- 
Useage: 
<?php include_once("httpsqs_client.php"); 
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset); 
$result = $httpsqs->put($queue_name, $queue_data); //1. PUT text message into a queue. If PUT successful, return boolean: true. If an error occurs, return boolean: false. If queue full, return text: HTTPSQS_PUT_END 
$result = $httpsqs->get($queue_name); //2. GET text message from a queue. Return the queue contents. If an error occurs, return boolean: false. If there is no unread queue message, return text: HTTPSQS_GET_END 
$result = $httpsqs->gets($queue_name); //3. GET text message and pos from a queue. Return example: array("pos" => 7, "data" => "text message"). If an error occurs, return boolean: false. If there is no unread queue message, return: array("pos" => 0, "data" => "HTTPSQS_GET_END") 
$result = $httpsqs->status($queue_name); //4. View queue status 
$result = $httpsqs->status_json($queue_name); //5. View queue status in json. Return example: {"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10} 
$result = $httpsqs->view($queue_name, $queue_pos); //6. View the contents of the specified queue pos (id). Return the contents of the specified queue pos. 
$result = $httpsqs->reset($queue_name); //7. Reset the queue. If reset successful, return boolean: true. If an error occurs, return boolean: false 
$result = $httpsqs->maxqueue($queue_name, $num); //8. Change the maximum queue length of per-queue. If change the maximum queue length successful, return boolean: true. If  it be cancelled, return boolean: false 
$result = $httpsqs->synctime($num); //9. Change the interval to sync updated contents to the disk. If change the interval successful, return boolean: true. If  it be cancelled, return boolean: false 
?> 
---------------------------------------------------------------------------------------------------------------- */  
class httpsqs {         
public $httpsqs_host;         
public $httpsqs_port;         
public $httpsqs_auth;         
public $httpsqs_charset;                  
public function __construct() {     
$host='192.168.20.59';$port=1218; $auth=''; $charset='utf-8';
$this->httpsqs_host = $host;                 
$this->httpsqs_port = $port;                 
$this->httpsqs_auth = $auth;                 
$this->httpsqs_charset = $charset;                 
return true;         
}      public function http_get($query)     
{         
$socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 5);         
if (!$socket)         
{             
return false;         
}         
$out = "GET ${query} HTTP/1.1\r\n";         
$out .= "Host: ".$this->httpsqs_host."\r\n";         
$out .= "Connection: close\r\n";         
$out .= "\r\n";         
fwrite($socket, $out);         
$line = trim(fgets($socket));   
$header="";
$header .= $line;         
list($proto, $rcode, $result) = explode(" ", $line);         
$len = -1;         
while (($line = trim(fgets($socket))) != "")         
{             
$header .= $line;             
if (strstr($line, "Content-Length:"))             
{                 
list($cl, $len) = explode(" ", $line);               
}             
if (strstr($line, "Pos:"))             
{                 
list($pos_key, $pos_value) = explode(" ", $line);             
}                                
if (strstr($line, "Connection: close"))             
{                 
$close = true;             
}         
}         
if ($len < 0)         
{             
return false;         
}                  
$body = fread($socket, $len);         
$fread_times = 0;         
while(strlen($body) < $len){                 
$body1 = fread($socket, $len);                 
$body .= $body1;                 
unset($body1);                 
if ($fread_times > 100) 
{                         
break;                 
}                 
$fread_times++;         
}         
//if ($close) fclose($socket);                 
fclose($socket);                 
$result_array["pos"] = (int)$pos_value;                 
$result_array["data"] = $body;         
return $result_array;     
}      public function http_post($query, $body)     
{         
$socket = fsockopen($this->httpsqs_host, $this->httpsqs_port, $errno, $errstr, 1);         
if (!$socket)         
{             
return false;         
}         
$out = "POST ${query} HTTP/1.1\r\n";         
$out .= "Host: " . $this->httpsqs_host . "\r\n";         
$out .= "Content-Length: " . strlen($body) . "\r\n";         
$out .= "Connection: close\r\n";         
$out .= "\r\n";         
$out .= $body;         
fwrite($socket, $out);         
$line = trim(fgets($socket));  
$header="";
$header .= $line;         
list($proto, $rcode, $result) = explode(" ", $line);         
$len = -1;         
while (($line = trim(fgets($socket))) != "")         
{             
$header .= $line;             
if (strstr($line, "Content-Length:"))             
{                 
list($cl, $len) = explode(" ", $line);             
}             
if (strstr($line, "Pos:"))             
{                 
list($pos_key, $pos_value) = explode(" ", $line);             
}                                
if (strstr($line, "Connection: close"))             
{                 
$close = true;             
}         
}         
if ($len < 0)         
{             
return false;         
}         
$body = @fread($socket, $len);         
//if ($close) fclose($socket);                 
fclose($socket);                 
$result_array["pos"] = (int)$pos_value;                 
$result_array["data"] = $body;         
return $result_array;     
}    public function put($queue_name, $queue_data)     
{         
$result = $this->http_post("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=put", $queue_data);                 
if ($result["data"] == "HTTPSQS_PUT_OK") 
{                         
return true;                 
} 
else if ($result["data"] == "HTTPSQS_PUT_END") 
{                         
return $result["data"];                 
}                 
return false;     
}          public function get($queue_name)    
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");                 
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) 
{                         
return false;                 
}         
return $result["data"];     
}        public function gets($queue_name)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=get");                 
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) 
{                         
return false;                 
}         
return $result;     
}            public function status($queue_name)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status");                 
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) 
{                         
return false;                 
}         
return $result["data"];     
}              public function view($queue_name, $queue_pos)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=view&pos=".$pos);                 
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) 
{                         
return false;                 
}         
return $result["data"];     
}   public function reset($queue_name)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=reset");                 
if ($result["data"] == "HTTPSQS_RESET_OK") 
{                         
return true;                 
}         
return false;     
}  public function maxqueue($queue_name, $num)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=maxqueue&num=".$num);                 
if ($result["data"] == "HTTPSQS_MAXQUEUE_OK") 
{                         
return true;                 
}         
return false;     
}     public function status_json($queue_name)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=".$queue_name."&opt=status_json");                 
if ($result == false || $result["data"] == "HTTPSQS_ERROR" || $result["data"] == false) 
{                         
return false;                 
}         
return $result["data"];     
}      public function synctime($num)     
{         
$result = $this->http_get("/?auth=".$this->httpsqs_auth."&charset=".$this->httpsqs_charset."&name=httpsqs_synctime&opt=synctime&num=".$num);                 
if ($result["data"] == "HTTPSQS_SYNCTIME_OK") 
{                         
return true;                 
}         
return false;     
} 
} 
?> 

<?phpinclude_once("httpsqs_client.php"); 
$httpsqs = new httpsqs(); 
$result = $httpsqs->put("city", date('Y-m-d H:i:s',time())); 
echo $result;
echo "</br>";
$result = $httpsqs->get("city"); 
echo $result;
?>

<?php
include_once("httpsqs_client.php"); 
$httpsqs = new httpsqs($httpsqs_host, $httpsqs_port, $httpsqs_auth, $httpsqs_charset); /* 
1. 将文本信息放入一个队列(注意:如果要放入队列的PHP变量是一个数组,需要事先使用序列化、json_encode等函数转换成文本)如果入队列成功,返回布尔值:true 如果入队列失败,返回布尔值:false 
*/ 
$result = $httpsqs->put($queue_name, $queue_data); /* 
2. 从一个队列中取出文本信息返回该队列的内容如果没有未被取出的队列,则返回文本信息:HTTPSQS_GET_END如果发生错误,返回布尔值:false 
*/ 
$result = $httpsqs->get($queue_name); /* 
3. 从一个队列中取出文本信息和当前队列读取点Pos返回数组示例:array("pos" => 7, "data" => "text message")如果没有未被取出的队列,则返回数组:array("pos" => 0, "data" => "HTTPSQS_GET_END")如果发生错误,返回布尔值:false
*/ 
$result = $httpsqs->gets($queue_name);/* 
4. 查看队列状态(普通方式)
*/ 
$result = $httpsqs->status($queue_name);/* 
5. 查看队列状态(JSON方式)返回示例:{"name":"queue_name","maxqueue":5000000,"putpos":130,"putlap":1,"getpos":120,"getlap":1,"unread":10}
*/ 
$result = $httpsqs->status_json($queue_name);/* 
6. 查看指定队列位置点的内容返回指定队列位置点的内容。
*/ 
$result = $httpsqs->view($queue_name, $queue_pos);/* 
7. 重置指定队列如果重置队列成功,返回布尔值:true 如果重置队列失败,返回布尔值:false 
*/ 
$result = $httpsqs->reset($queue_name);/* 
8. 更改指定队列的最大队列数量如果更改成功,返回布尔值:true如果更改操作被取消,返回布尔值:false
*/ 
$result = $httpsqs->maxqueue($queue_name, $num);/*
9. 修改定时刷新内存缓冲区内容到磁盘的间隔时间如果更改成功,返回布尔值:true如果更改操作被取消,返回布尔值:false
*/
$result = $httpsqs->synctime($num);
?>


相关文章:

GitHub移动端正式发布

整理 | 郭芮图源 | 视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在去年的 Universe 大会上&#xff0c;GitHub 推出了尚处于 Beta 阶段的移动版客户端&#xff08;GitHub for mobile&#xff09;&#xff0c;支持 iOS 和 Android 两大主流移动平台。时隔…

手机的定制化需求

根据自身的市场需求&#xff0c;文化环境&#xff0c;业务定位等诸多因素&#xff0c;运营商会对手机提出定制化要求&#xff0c;并指定相应的手机规范。随着差异化竞争和精益经营的不断提高&#xff0c;由运营商提出的手机规范也越来越复杂。据不完全统计&#xff08;图10-1&a…

oracle 9i 安装及连接远程数据库

用oracle 11g很久了&#xff0c;真的感觉是一个很重量级的客户端&#xff0c;安装都要一个多小时&#xff0c;最近刚开始接触这种精简版的数据库客户端&#xff0c;捣鼓了半天&#xff0c;总算成功。 1.下载客户端 2.安装 傻瓜式安装即可&#xff0c;记得自己的路径。 3.配置环…

FAST-CGI安装与使用

FastCGI 像是一个常驻 (long-live) 型的 CGI&#xff0c;它可以一直执行着&#xff0c;只要激活后&#xff0c;不会每次都要花费时间去 fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。 1.下载安装fcgi # wget http://www.fastcgi.com/dist/fcgi.tar.gz # ta…

利用 JQuery的load函数动态加载页面

利用JQuery的load函数动态加载页面 JQuery有好多Ajax函数&#xff0c;其中load是用来动态加载一个页面的内容到指定的dom元素上。我们来做个例子&#xff1a;做一个上下&#xff08;左右&#xff09;结构的页面&#xff0c;其中下左部分放2个以前我们做过的div按钮&#xff0c…

教你用Android做二次开发,识别率达到科大讯飞语音输入水平 | 原力计划

作者 | Pek_KuaiJia责编 | 夕颜头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&#xff09;随着目前用户需求的精细化和智能化&#xff0c;很多时候我们需要在App内集成语音输入模块&#xff0c;为用户提供语音输入的功能。而科大讯飞语音作为行业内翘楚&#…

基于r-Kernel的LiteOS操作系统

LiteOS是应用于资源受限的传感网络的一种基于线程的类UNIX操作系统。也就是说它跑在存储空间和RAM有限的超低电压微控制器上&#xff0c;这也是吸引我关注它的原因&#xff08;在超低电压下系统更易出错&#xff09;。它採用r-kernel内核&#xff0c;r-kernel有三个特征&#x…

Linux网络编程中的几组类似功能的区别

1.bzero与memset char buff[1024]; memset(buff,0,sizeof(buff));bzero(buff, sizeof(buff)); struct sockaddr_in addr memset(&addr, 0, sizeof(addr)); bzero(buff, sizeof(buff)); 参考《UNIX网络编程 卷1&#xff1a;套接字联网API 第3版》1.2的解释&#xff1a…

5个案例让Python输出漂亮的表格!

来源 | Python数据之道前言最近在用python写一个小工具&#xff0c;这个工具主要就是用来管理各种资源的信息&#xff0c;比如阿里云的ECS等信息&#xff0c;因为我工作的电脑使用的是LINUX&#xff0c;所以就想着用 Python写一个命令行的管理工具&#xff0c;基本的功能就是同…

VS2010正式版MSDN下载

之前写了一篇关于微软VS2010发布会的介绍&#xff0c;现在VS2010的正式版也叫RTM版本终于在MSDN开始提高下载了&#xff0c;暂时性的还只有英文版本&#xff0c;不过等等马上应该会有中文的了。 VS2010 RTM下载地址 Microsoft Visual Studio 2010 Premium - ISOMicrosoft Visua…

windows 2012 nps配置

Windows2012 Nps配置windows 2012 nps配置1.安装windows nps角色&#xff0c;安装网络策略服务器及主机凭据授权协议。2.域中注册服务器3.配置网络策略4.按所需添加条件5.运行-mmc-添加 -证书管理单元添加个人证书—申请新证书6.选择ad注册策略即可7.选择radius身份验证—注册8…

使用man在线手册页

#man -k 函数 #man 返回的数字 函数 # man -k file | grep umask要查看linux下的函数umask 可以使用man&#xff0c;例如 # man 2 umask 如果不知道man后的节号&#xff0c;可以使用-k先查找 # man -k umask 如果使用-k返回太多内容&#xff0c;可以使用g…

Python爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...

作者 | Huang supreme编辑 | 郭芮出品 | CSDN博客图源 | 视觉中国随着科技的飞速发展&#xff0c;数据呈现爆发式的增长&#xff0c;任何人都摆脱不了与数据打交道&#xff0c;社会对于“数据”方面的人才需求也在不断增大。因此了解当下企业究竟需要招聘什么样的人才&#xff…

论爱的精进与痴迷

文&#xff1a;洪启嵩 汝爱我心&#xff0c;我怜汝色。以是因缘&#xff0c;经百千劫&#xff0c;常在缠缚。──《楞严经》 爱情为什么是轮回的根由&#xff0c;《楞严经》里有一段话说得很清楚&#xff1a;「汝爱我心&#xff0c;我怜汝色。 以是因缘&#xff0c;经百千劫&am…

[原] Jenkins Android 自动打包配置

一、Jenkins自动打包配置 目标&#xff1a;1. 自动打包&#xff1b;2. 自动上传&#xff1b;3. 友好下载 1. Jenkins简介 Jenkins是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作。 减少重复劳动&#xff0c;减少人工成本。 持续、自动地构建/测试软件项目…

盛大文学难逃“垄断”嫌疑,完美文学虎口夺食

观点&#xff1a;盛大文学已难逃“垄断”嫌疑&#xff1b;完美文学强攻文学阵地&#xff0c;与盛大文学发生正面冲突已成定局。盛大文学频频出手&#xff0c;在3个多月的时间里&#xff0c;先后收购榕树下、小说阅读网、言情小说吧和潇湘书院4家网站&#xff0c;加上此前拥有的…

GitHub接连封杀开源项目惹众怒,CEO亲自道歉

作者 | 唐小引图源 | 东方 IC来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;王坚博士曾经做过这样一个非常形象的比喻&#xff0c;他将做 App 比作是在别人的花园里弄盆栽&#xff0c;「种点花草是没有问题的」&#xff0c;不过「别人叫你的产品下架你就得下架&am…

Phabricator是什么,代码审查工具

Phabricator是什么&#xff1f; Phabricator支持两种代码审查工作流&#xff1a;“review”&#xff08;提交前审查&#xff09;和 “audit”&#xff08;提交后审查&#xff09;。 Phabricator是Facebook保驾护航的11大IT技术之一。在Phabricator的网站中&#xff0c;开发者给…

结构体中定义函数指针

结构体指针变量的定义&#xff0c;定义结构体变量的一般形式如下&#xff1a; 形式&#xff11;&#xff1a;先定义结构体类型&#xff0c;再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一&#xff1a;struct结构体标识符…

对卫星网络及内容的安全防护措施

对卫星网络及内容的安全防护措施 网络安全是多领域的综合业务&#xff0c;近10年来在规模和范围方面都获得了极大的发展。对网络及内容潜在的威胁来自各类不同的领域&#xff0c;因此增加了解决这一问题的难度。 在因特网产生之前&#xff0c;对卫星网络及内容实时***的安全防护…

对标Pytorch,清华团队推出自研AI框架“计图”

「AI技术生态论」 人物访谈栏目是CSDN发起的百万人学AI倡议下的重要组成部分。通过对AI生态专家、创业者、行业KOL的访谈&#xff0c;反映其对于行业的思考、未来趋势的判断、技术的实践&#xff0c;以及成长的经历。2020年&#xff0c;CSDN将对1000人物进行系列访谈&#xff0…

echo使用说明,参数详解

简介    echo [OPTION]... [STRING]... 描述    -n 末尾不加换行   -e 开启输出字串中对反斜杠的转译   -E 禁用反斜杠转译   只有开启-e参数的时候&#xff0c;下面的命令才能起作用:   \0NNN 输出NNN(一个八进制数)在ASCII码表中对应的字符&#xff0c;     …

ATSS : 目标检测的自适应正负anchor选择,很扎实的trick | CVPR 2020

作者 | VincentLee来源 | 晓飞的算法工程笔记论文地址&#xff1a;https://arxiv.org/abs/1912.02424代码地址&#xff1a;https://github.com/sfzhang15/ATSS在仔细比对了anchor-based和anchor-free目标检测方法后&#xff0c;结合实验结果&#xff0c;论文认为两者的性能差异…

GCC编译选项--创建与使用库

系统函数库使用 linux系统函数库位于/usr/lib和/lib目录下 #include <math.h> #cc test.c -lm -o test 动态库创建 1).编译时指定-fPIC 通知gcc产生可以重定位的与位置无关的目标代码 2).链接时指定-shared 使gcc编译器生成动态链接库 动态库使用 通过设置环境…

不错的×××实验

(virtual private network 虚拟专网)&#xff0c;利用公用网络&#xff0c;按照相同的策略和规则&#xff0c;建立内部私有连接。 广泛的讲&#xff0c;***体系结构分为&#xff1a;站点到站点的***和远程访问*** 站点到站点的***&#xff1a;在这种情况下&#xff0c;同一个机…

达观数据于敬:个性化推荐系统实践

达观数据于敬&#xff1a;个性化推荐系统实践 在DT(data technology)时代&#xff0c;网上购物、观看视频、聆听音乐、阅读新闻等各个领域无不充斥着各种推荐&#xff0c;个性化推荐已经完全融入人们的日常生活当中。个性化推荐根据用户的历史行为数据进行深层兴趣点挖掘&#…

C语言Free时报错HEAP CORRUPTION DETECTED

char *k1; k1 (char *) malloc(4*sizeof(char)); v1 (char *) malloc(4*sizeof(char)); strcpy(k1,"abcd"); free(k1); 在linux下不会报错&#xff0c;但是在VC环境会报错&#xff1a;HEAP CORRUPTION DETECTED 出现这个错误的原因一般都是操作new申请的内存溢…

DivCSS网页布局中CSS无效的十个常见原因

在学习DivCSS网页布局的知识&#xff0c;可是W3C validation有时难以操作&#xff0c;但用它你可以查看由版面设计引起的差错。验证程序抛出大量差错和警告&#xff0c;说明你的XHTML尚未完善&#xff0c;可能无法在不同浏览器上保持一致功能。下面十个细微的失效问题难住了大批…

如何创建计算机视觉场景训练数据

作者 | 刘明宽 数据科学部门负责人&#xff0c;澳鹏&#xff08;Appen&#xff09;美国 曾任eBay首席研究科学家&#xff08;数据科学总监&#xff09;对于一些精度要求不太高&#xff0c;或者不太复杂的计算机视觉应用场景&#xff0c;利用一些现有的开源数据集如ImageNet/Coc…

express中的bin/www文件详解

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env node 表明是node执行文件,在做repl工具时候的会用的 "#!"是标识符/usr/bin是环境变量的绝对路径/env 如果是直接#!/usr/bin node ,则执行这个文件的时候,会从/usr/bin中找node命令,如果没有,则…