⑴ 急啊,怎樣讓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