导航:首页 > 编程语言 > apachephpwebsocket

apachephpwebsocket

发布时间:2022-11-13 13:31:36

⑴ 急啊,怎样让apache支持php

首先你要有PHP的执行程序,已经安装。
然后打开httpd.conf 找到有一堆LoadMole 的地方,在最后一个LoadMole下面增加如下配置:
LoadMole php5_mole "${path}/php/php5apache2_2.dll"
PHPIniDir "${path}/"
SetEnv TMP "${path}/tmp"
注意其中:
第一行的${path}要换成你的PHP5的安装目录
第二行的${path}要换成你的php.ini文件所在的目录
第三行的${path}要换成你指定的PHP的临时目录

⑵ websocket简介

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充

他们有交集,但是并不是全部。

另外Html5是指的一系列新的API,或者说新规范,新技术。Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。=

再简单来说,层级不一样。

首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。

HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。

在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。而且这个response也是被动的,不能主动发起。

教练,你BB了这么多,跟Websocket有什么关系呢? (:з”∠) 好吧,我正准备说Websocket呢。。

首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。

首先我们来看个典型的 Websocket 握手(借用Wikipedia的。。)

熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。我会顺便讲解下作用。

这个就是Websocket的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。

首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。

然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~

最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦 大家都使用的一个东西 脱水: 服务员,我要的是13岁的噢→_→

然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦!

这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~

Upgrade: websocket
Connection: Upgrade
依然是固定的,告诉客户端即将升级的是 Websocket 协议,而不是mozillasocket,lurnarsocket或者shitsocket。

然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。。

后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。

至此,HTTP已经完成它所有工作了,接下来就是完全按照Websocket协议进行了。具体的协议就不在这阐述了。

——————技术解析部分完毕——————

你TMD又BBB了这么久,那到底Websocket有什么鬼用, http long poll ,或者ajax轮询 不都可以实现实时信息传递么。

好好好,年轻人,那我们来讲一讲Websocket有什么用。来给你吃点胡(苏)萝(丹)卜(红)

在讲Websocket之前,我就顺带着讲下 long poll 和 ajax轮询 的原理。

ajax轮询

ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。

场景再现:

long poll

long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

场景再现:

从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。

何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。

简单地说就是,服务器是一个很懒的冰箱(这是个梗)(不会、不能主动发起连接),但是上司有命令,如果有客户来,不管多么累都要好好接待。

说完这个,我们再来说一说上面的缺陷(原谅我废话这么多吧OAQ)

从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。

ajax轮询 需要服务器有很快的处理速度和资源。(速度)long poll 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

所以 ajax轮询 和 long poll 都有可能发生这种情况。

言归正传,我们来说Websocket吧

通过上面这个例子,我们可以看出,这两种方式都不是最好的方式,需要很多资源。

一种需要更快的速度,一种需要更多的’电话’。这两种都会导致’电话’的需求越来越高。

哦对了,忘记说了HTTP还是一个状态协议。

通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

所以在这种情况下出现了,Websocket出现了。他解决了HTTP的这几个难题。首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。所以上面的情景可以做如下修改。

就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你 )

这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。那么为什么他会解决服务器上消耗资源的问题呢?

其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。简单地说,我们有一个非常快速的 接线员(Nginx) ,他负责把问题转交给相应的 客服(Handler) 。

本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。

这样就可以解决客服处理速度过慢的问题了。

同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info (鉴别信息),来告诉服务端你是谁。

虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。

但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。

同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了

——————–

至于怎么在不支持Websocket的客户端上使用Websocket。。答案是: 不能

但是可以通过上面说的 long poll 和 ajax 轮询 来 模拟出类似的效果

⑶ apache配置PHP

一年四季行好运 八方财宝进家门 横批:家和万事兴

⑷ apache配置文件中怎么配置php

1.新建一个文件建立三个文件,分别为apache,php,mysql 等子文件夹
2.分别下载好不同软件。
3.下载好完成之后,先测试一下apache是否可以可以访问页面,在页面输入http:localhost,如果可以访则安装成功,反之不成功。
4.配置php的时候,首先检查apache版本和php文件里php5apache2_2.d版本是否相同,如果不相同,改成和apache版本一致。再打开apache文件找到httpd.conf打开:
查找“DocumentRoot”,这里是指定主页放置的目录。默认是:“D:\Program Files\Apache\htdocs”,你可以使用默认的目录,也可以自己定义一个,如:“D:/PHP”。注意:目录末尾不要加“/”。2)、查找“DirectoryIndex”,这里是默认首页文件名,可以在index.html 的后面加入index.php等。每种类型之间都要留一个空格。3)、查找<Directory />Options FollowSymLinksAllowOverride NoneOrder deny,allowDeny from all</Directory>修改为:<Directory />Options FollowSymLinksAllowOverride NoneOrder deny,allowallow from all</Directory>如果不改这里的话,可能会出现 You don't have permission to access / on this server. 这样的错误提示,尤其在改变了默认主页的路径后。
注意:每次修改httpd:conf文件后,都要重启apache服务器。另外,如果你的win32系统上同时也运行iis服务器,那么就要先停止iis服务器的运行,然后再启动apache,否则apache服务器无法启动。
5.php的安装与配置方法
1)、将PHP的压缩包zip解压到一个目录下,推荐:“C:/PHP”,pharmar的是D:\Program Files\Php。2)、将PHP目录(D:\Program Files\Php)下的 php.ini-dist 文件重命名为 php.ini,PHP的配置文件就是它,修改以下几个地方,修改好后把 php.ini 文件复制到 C:\WINDOWS\ 目录里:extension_dir="D:\Program Files\Php\ext" ,指向php文件夹下放置“php_*.dll”文件的路径。PHP4和PHP5的路径在这里有所区别。doc_root="D:\PHP" ,指向前面apache设置的首页位置;default_charset="gb2312" ,修改默认字符集,这里,如果前面有分号“;”,去掉这个分号;register_globals=Off 改为 register_globals=On ,使传递全局变量有效;extension=php_dba.dll 如果前面有分号,取消分号,以下同;extension=php_dbase.dllextension=php_gd2.dll GD库做图,一般用于图形验证码;extension=php_mysql.dll 用于连接MYSQL数据库;3)、将PHP目录下的 php5ts.dll 文件拷贝到 C:\WINDOWS\system32 目录。4)、最后修改 Apache 的 httpd.conf 文件。在该文件的末尾添加如下2行,表示以模块方式安装PHP进入Apache:LoadMole php5_mole D:/Program Files/Php/php5apache2_2.dllAddType application/x-httpd-php .php
注意:第一行的目录路径要更新为当前版本的apache动态链接库,比如这里我使用的是apache2.2.15版本和php5.3.2,那这个文件必须是php5apache2_2.dll,而不能是php5apache.dll、php5apache2.dll等。第二行为php脚步的后缀。php4版中,需要添加一行 AddType mod_php4.c,而在php5中,就不需要这样的一行 AddType mod_php5.c了,php5已经集成,否则 apache 启动不了。
以上就完成了apache和php的配置过程了,重启apache。在服务器的默认目录“D:\Program Files\Apache\htdocs”里新建文件index.php,写上如下代码:<?phpphpinfo();?>
在浏览器地址栏里输入 http://127.0.0.1/ 或 http://localhost/ ,你就会看到php版本信息了。到此为止,php和apache就已经成功的安装了。

⑸ php如何实现websocket

php有可用的websocket库,不需要php-fpm。

目前比较成熟的有swoole(swoole.com),和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)." ";
}

//将关闭状态修改为false
$is_closed=false;
}

//开始进行数据处理
process($sock);
}

//处理请求的函数
functionprocess($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));
}
}

functiondeal($socket,$msgObj){
$obj=json_decode($msgObj);
foreach($objas$key=>$value){
if($key=='close'){
disconnect($socket);
console('closesuccess');
return'closesuccess';
}elseif($key=='msg'){
console($value." ");
return$value;
}
}
}

//获取头部信息
functiongetheaders($req){
$r=$h=$o=null;
if(preg_match("/GET(.*)HTTP/",$req,$match)){$r=$match[1];}
if(preg_match("/Host:(.*) /",$req,$match)){$h=$match[1];}
if(preg_match("/Origin:(.*) /",$req,$match)){$o=$match[1];}
if(preg_match("/Sec-WebSocket-Key:(.*) /",$req,$match)){$key=$match[1];}
if(preg_match("/ (.*?)$/",$req,$match)){$data=$match[1];}
returnarray($r,$h,$o,$key,$data);
}

functionWebSocket($address,$port){
$master=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)ordie("socket_create()failed");
socket_set_option($master,SOL_SOCKET,SO_REUSEADDR,1)ordie("socket_option()failed");
socket_bind($master,$address,$port)ordie("socket_bind()failed");
socket_listen($master,20)ordie("socket_listen()failed");
echo"ServerStarted:".date('Y-m-dH:i:s')." ";
echo"Mastersocket:".$master." ";
echo"Listeningon:".$address."port".$port." ";
return$master;
}

functiondohandshake($buffer){
list($resource,$host,$origin,$key,$data)=getheaders($buffer);
echo"resourceis$resource ";
echo"originis$origin ";
echo"hostis$host ";
echo"keyis$key ";

$response_key=base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));

$return_str="HTTP/1.1101SwitchingProtocols ".
"Upgrade:websocket ".
"Connection:Upgrade ".
"Sec-WebSocket-Accept:$response_key ";
return$return_str;
}

functionconsole($msg){
$msg=transToGBK($msg);
echo"$msg ";
return$msg;
}

functiondecode($msg=""){
$mask=array();
$data="";
$msg=unpack("H*",$msg);

$head=substr($msg[1],0,2);

if(hexdec($head{1})===8){
$data=false;
}elseif(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;
}

functionencode($msg=""){
$frame=array();
$frame[0]="81";
$msg.='isok';
$len=strlen($msg);
$frame[1]=$len<16?"0".dechex($len):dechex($len);
$frame[2]=ord_hex($msg);
$data=implode("",$frame);
returnpack("H*",$data);
}


functiontransToGBK($s){//UTF8->GBK
//echo$s;
returniconv("UTF-8","GBK",$s);
return$s;
}

functionord_hex($data){
$msg="";
$l=strlen($data);

for($i=0;$i<$l;$i++){
//ord是返回字符串第一个字符的ascii值
//dechex把十进制转换为十六进制
$msg.=dechex(ord($data{$i}));
}

return$msg;
}

functiondisconnect($socket){
global$is_shaked,$is_closed;
$is_shaked=false;
$is_closed=true;
socket_close($socket);
}
?>

⑹ 如何使用apache+php+mysql配置php环境

若要让php支持mysql和gd库等组件,需对php.ini进行配置
首先将php.ini-development 改为php.ini
php.ini配置:
将 ;extension_dir = "ext" 更改为:extension_dir = "C:\PHP\ext"并将前面的分号去掉,以设置php所支持组件的路径。
将下了代码的前面的分号全部删掉,以设置php所支持的组件。
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_gd2.dll
;extension=php_mbstring.dll
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_sqlite.dll

若要让apache支持php则需要配置conf\httpd.conf,以为apache指定php的路径。
在httpd.conf中加入下列代码:
PHPIniDir "C:/PHP/"
LoadMole php5_mole "C:/PHP/php5apache2_2.dll"

php下载地址:http://windows.php.net/downloads/releases/php-5.4.0-Win32-VC9-x86.zip

⑺ 简述在web服务器中,Apache和PHP的工作流程

那么php的运行原理就是Apache、PHP、浏览器之间的协作过程:
①当用户在浏览器地址中输入要访问的PHP页面文件名,然后回车就会触发这个PHP请求,并将请求传送化支持PHP的WEB服务器(apache)。
②WEB服务器(apache)接受这个请求,并根据其后缀进行判断如果是一个PHP请求,WEB服务器(apache)从硬盘或内存中取出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。
③PHP引擎程序将会对WEB服务器(apache)传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的HTML页面。
④PHP引擎将生成HTML页面返回给WEB服务器(apache)。WEB服务器(apache)再将HTML页面返回给客户端浏览器,最后一个完整的页面基于通过浏览器展现在我们眼前。

⑻ 微信小程序websocket和php通信

普通弄过nginx或者apache运行php的cgi、mod_php模式是不适合作为socket服务端的,你需要使用cli模式运行(就是直接在shell里面执行php server.php)
可以使用Workerman框架或者swoole扩展来开发,推荐使用Workerman更简单,socket操作都封装好了,至于这两个东西网上资料比较多,你可以查一下

⑼ 如何安装Apache搭建PHP环境

随便网络一下找到Apche的微软安装包,双击运行。
根据我在图片上的标注填写
2
选择next,进入安装类型选项,建议选择自定义安装
3
接下来选择安装路径,设置安装目录,注意,目录中不能有中文、空格等特殊字符。
点击install安装即可
4
安装完成之后,当前计算机就是一台web服务器了,在浏览器输入localhost或者127.0.0.1来测试,结果如下图。
5
Apache目录结构说明如下图
6
接下来就是安装PHP了,安装很简单,新建一个PHP文件夹,解压复制过来即可。一般习惯和apache放在同一盘符下。
7
在apche的conf文件夹下找到httpd.conf。
搜索LOADMODULE,在空白处填写图中配置,路径记得改成自己的安装路径。
将php加载成apache的一个功能模块
8
下面在填上下图中的配置,使apche将.php结尾的文件交给php处理
9
接下来还要增加一行配置,如图
10
然后修改时区。在php.ini里面搜索timezone,修改成如图所示。
php就安装完成了
11
最后就是安装mysql了,双击运行安装包
12
还是建议选择自定义安装,然后下一步下一步就可以,这里就跳过了,重点讲配置
13
选择详细配置
14
根据图中所示,根据自己需要选择
15
这里选择多功能服务器
16
自己学习建议选择低并发
17
选择防火墙和严格模式
18
选择utf8字符集
19
选择开机自启动
20
设置root用户密码,然后点击excute执行就安装完毕了。
重启apache,环境就搭建完成了如果你对php有兴趣的话,可以向我一样在后盾人平台多看看自己学习学习,时间长了自己就慢慢明白了,希望能帮到你,给个采纳吧谢谢///
____,____
/// |ヽヽ\/
^^^^^|^^^^^^
/ |∩,,∩//
. |´・(ェ)・)
/ 0と )/
し─J

阅读全文

与apachephpwebsocket相关的资料

热点内容
软通动力程序员节2021 浏览:845
安卓系统如何卸载安装包 浏览:870
短信删除助手文件夹 浏览:688
java办公自动化 浏览:340
php中超链接 浏览:253
linux默认路由设置 浏览:36
linux如何挂载iso 浏览:432
vs程序换文件夹后不能编译 浏览:557
安卓源码编译输入脚本没反应 浏览:47
phpmysql自增 浏览:167
把ppt保存为pdf 浏览:533
汽车密封件加密配件 浏览:887
黑马程序员15天基础班 浏览:560
java调整格式 浏览:521
香港云服务器租用价 浏览:78
linuxsublime3 浏览:560
imac混合硬盘命令 浏览:279
沈阳用什么app租房车 浏览:859
00后高中生都用什么app 浏览:239
戴尔塔式服务器怎么打开独立显卡 浏览:808