lighthttpd源碼
㈠ apache 解析一個錯誤的php文件時,會直接顯示php的源碼,如何讓他不顯示源碼。
1、在可能出異常的代碼後面 die('....自己寫錯誤信息');
2、在php中代碼前加error_reporting(0);
3、修改php.ini 中 display_errors設置為display_errors = off
㈡ 如何開發自己的HttpServer-NanoHttpd源碼解讀
現在作為一個開發人員,http server相關的內容已經是無論如何都要了解的知識了。用curl發一個請求,配置一下apache,部署一個web server對我們來說都不是很難,但要想搞清楚這些背後都發生了什麼技術細節還真不是很簡單的。所以新的系列將是分享我學習Http Server的過程。
NanoHttpd是Github上的一個開源項目,號稱只用一個java文件就能創建一個http server,我將通過分析NanoHttpd的源碼解析如何開發自己的HttpServer。Github 地址:https://github.com/NanoHttpd/nanohttpd
在開始前首先簡單說明HttpServer的基本要素:
1.能接受HttpRequest並返回HttpResponse
2.滿足一個Server的基本特徵,能夠長時間運行
關於Http協議一般HttpServer都會聲明支持Http協議的哪些特性,nanohttpd作為一個輕量級的httpserver只實現了最簡單、最常用的功能,不過我們依然可以從中學習很多。
首先看下NanoHttpd類的start函數
[java]view plain
publicvoidstart()throwsIOException{
myServerSocket=newServerSocket();
myServerSocket.bind((hostname!=null)?newInetSocketAddress(hostname,myPort):newInetSocketAddress(myPort));
myThread=newThread(newRunnable(){
@Override
publicvoidrun(){
do{
try{
finalSocketfinalAccept=myServerSocket.accept();
registerConnection(finalAccept);
finalAccept.setSoTimeout(SOCKET_READ_TIMEOUT);
finalInputStreaminputStream=finalAccept.getInputStream();
asyncRunner.exec(newRunnable(){
@Override
publicvoidrun(){
OutputStreamoutputStream=null;
try{
outputStream=finalAccept.getOutputStream();
=tempFileManagerFactory.create();
HTTPSessionsession=newHTTPSession(tempFileManager,inputStream,outputStream,finalAccept.getInetAddress());
while(!finalAccept.isClosed()){
session.execute();
}
}catch(Exceptione){
//,wethrowourownSocketException
//tobreakthe"keepalive"loopabove.
if(!(einstanceofSocketException&&"NanoHttpdShutdown".equals(e.getMessage()))){
e.printStackTrace();
}
}finally{
safeClose(outputStream);
safeClose(inputStream);
safeClose(finalAccept);
unRegisterConnection(finalAccept);
}
}
});
}catch(IOExceptione){
}
}while(!myServerSocket.isClosed());
}
});
myThread.setDaemon(true);
myThread.setName("NanoHttpdMainListener");
myThread.start();
}
1.創建ServerSocket,bind制定埠
2.創建主線程,主線程負責和client建立連接
3.建立連接後會生成一個runnable對象放入asyncRunner中,asyncRunner.exec會創建一個線程來處理新生成的連接。
4.新線程首先創建了一個HttpSession,然後while(true)的執行httpSession.exec。
這里介紹下HttpSession的概念,HttpSession是java里Session概念的實現,簡單來說一個Session就是一次httpClient->httpServer的連接,當連接close後session就結束了,如果沒結束則session會一直存在。這點從這里的代碼也能看到:如果socket不close或者exec沒有拋出異常(異常有可能是client段斷開連接)session會一直執行exec方法。
一個HttpSession中存儲了一次網路連接中server應該保存的信息,比如:URI,METHOD,PARAMS,HEADERS,COOKIES等。
5.這里accept一個client的socket就創建一個獨立線程的server模型是ThreadServer模型,特點是一個connection就會創建一個thread,是比較簡單、常見的socket server實現。缺點是在同時處理大量連接時線程切換需要消耗大量的資源,如果有興趣可以了解更加高效的NIO實現方式。
當獲得client的socket後自然要開始處理client發送的httprequest。
Http Request Header的parse:
[plain]view plain
//Readthefirst8192bytes.
//Thefullheadershouldfitinhere.
//Apache'sdefaultheaderlimitis8KB.
//!
byte[]buf=newbyte[BUFSIZE];
splitbyte=0;
rlen=0;
{
intread=-1;
try{
read=inputStream.read(buf,0,BUFSIZE);
}catch(Exceptione){
safeClose(inputStream);
safeClose(outputStream);
thrownewSocketException("NanoHttpdShutdown");
}
if(read==-1){
//socketwasbeenclosed
safeClose(inputStream);
safeClose(outputStream);
thrownewSocketException("NanoHttpdShutdown");
}
while(read>0){
rlen+=read;
splitbyte=findHeaderEnd(buf,rlen);
if(splitbyte>0)
break;
read=inputStream.read(buf,rlen,BUFSIZE-rlen);
}
}
1.讀取socket數據流的前8192個位元組,因為http協議中頭部最長為8192
2.通過findHeaderEnd函數找到header數據的截止位置,並把位置保存到splitbyte內。
[java]view plain
if(splitbyte<rlen){
inputStream.unread(buf,splitbyte,rlen-splitbyte);
}
parms=newHashMap<String,String>();
if(null==headers){
headers=newHashMap<String,String>();
}
//.
BufferedReaderhin=newBufferedReader(newInputStreamReader(newByteArrayInputStream(buf,0,rlen)));
//
Map<String,String>pre=newHashMap<String,String>();
decodeHeader(hin,pre,parms,headers);
1.使用unread函數將之前讀出來的body pushback回去,這里使用了pushbackstream,用法比較巧妙,因為一旦讀到了header的尾部就需要進入下面的邏輯來判斷是否需要再讀下去了,而不應該一直讀,讀到沒有數據為止
2.decodeHeader,將byte的header轉換為java對象
1.Http協議第一行是Method URI HTTP_VERSION
2.後面每行都是KEY:VALUE格式的header
3.uri需要經過URIDecode處理後才能使用
4.uri中如果包含?則表示有param,httprequest的param一般表現為:/index.jsp?username=xiaoming&id=2
下面是處理cookie,不過這里cookie的實現較為簡單,所以跳過。之後是serve方法,serve方法提供了用戶自己實現httpserver具體邏輯的很好介面。在NanoHttpd中的serve方法實現了一個默認的簡單處理功能。
這個默認的方法處理了PUT和POST方法,如果不是就返回默認的返回值。
parseBody方法中使用了tmpFile的方法保存httpRequest的content信息,然後處理,具體邏輯就不細說了,不是一個典型的實現。
最後看一下發response的邏輯:
sendAsFixedLength(outputStream,pending);
}
outputStream.flush();
safeClose(data);
}catch(IOExceptionioe){
//Couldn'twrite?Nocando.
}
}
發送response的步驟如下:
1.設置mimeType和Time等內容。
2.創建一個PrintWriter,按照HTTP協議依次開始寫入內容
3.第一行是HTTP的返回碼
4.然後是content-Type
5.然後是Date時間
6.之後是其他的HTTP Header
7.設置Keep-Alive的Header,Keep-Alive是Http1.1的新特性,作用是讓客戶端和伺服器端之間保持一個長鏈接。
8.如果客戶端指定了ChunkedEncoding則分塊發送response,Chunked Encoding是Http1.1的又一新特性。一般在response的body比較大的時候使用,server端會首先發送response的HEADER,然後分塊發送response的body,每個分塊都由chunk length 和chunk data 組成,最後由一個0 結束。
9.如果沒指定ChunkedEncoding則需要指定Content-Length來讓客戶端指定response的body的size,然後再一直寫body直到寫完為止。
最後總結下實現HttpServer最重要的幾個部分:
1.能夠accept tcp連接並從socket中讀取request數據
2.把request的比特流轉換成request對象中的對象數據
3.根據http協議的規范處理http request
4.產生http response再寫回到socket中傳給client。
㈢ 有沒有弘歷軟體中的藍色幽靈指標源碼
點擊(此處)折疊或打開
cat >> /etc/init.d/nginx <<EOF
#! /bin/sh
ulimit -n 65535
# Description: Startup script for nginx
# chkconfig: 2345 55 25
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="nginx daemon"
NAME=nginx
DAEMON=/usr/local/nginx/sbin/$NAME
CONFIGFILE=/usr/local/nginx/conf/nginx.conf
PIDFILE=/usr/local/nginx/logs/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0
do_start() {
$DAEMON -c $CONFIGFILE || echo -n "nginx already running"
}
do_stop() {
kill -QUIT `cat $PIDFILE` || echo -n "nginx not running"
}
do_reload() {
kill -HUP `cat $PIDFILE` || echo -n "nginx can't reload"
}
case "$1" in
start)
echo -n "Starting $DESC: $NAME"
do_start
echo "."
/etc/init.d/httpd start
;;
stop)
echo -n "Stopping $DESC: $NAME"
do_stop
echo "."
/etc/init.d/httpd stop
;;
reload)
echo -n "Reloading $DESC configuration..."
do_reload
echo "."
/etc/init.d/httpd restart
;;
restart)
echo -n "Restarting $DESC: $NAME"
do_stop
sleep 1
do_start
echo "."
/etc/init.d/httpd restart
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload|restart}" >&2
exit 3
;;
esac
exit 0
EOF
㈣ 源碼安裝apache報錯如下,求助
如下:
ab.o: In function `main':
/APP/software/httpd-2.4.4/support/ab.c:2273: undefined reference to `TLSv1_2_client_method'
/APP/software/httpd-2.4.4/support/ab.c:2271: undefined reference to `TLSv1_1_client_method'
collect2: ld returned 1 exit status
make[2]: *** [ab] Error 1
make[2]: Leaving directory `/APP/software/httpd-2.4.4/support'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/APP/software/httpd-2.4.4/support'
make: *** [all-recursive] Error 1
㈤ Apache+PHP,源代碼直接輸出
1 檢查一下你是否安裝了PHP模塊,我以前用的時候Apache不包含PHP的,得另外找,然後安裝上。
2 看一下Apache的日誌,是否模塊沒有正常載入。
phpinfo()函數是能看到PHP的信息,說明PHP可以正常工作了啊,看看你寫的文件是不是不對了。
㈥ 搞了一個php網站的源碼,為什麼裡面都是把php代碼寫在.html文件中該如何運行
伺服器配置問題,如果是apache 伺服器,請打開配置文件,找到
AddType application/x-httpd-php .php
將其改為
AddType application/x-httpd-php .html
這個語句就是指定擴展名的,可以改成任何格式,只要你的php文件以這個擴展名命名
都說咯,是配置的問題啊,人家只是把php 擴展名 改成咯 html而已,需要在伺服器端將php的文件解析配置成 解析html就行咯,
㈦ linux apache不能解析php文件,訪問後出現的是源代碼,什麼原因啊
沒有載入PHP模塊或者是MIME類型沒填對,PHP文件被當成了純文本文件提供下載而不執行裡面的代碼。Apache本身是不具備執行PHP代碼的能力的,需要把PHP當成Apache的一個模塊來載入來解析PHP文件。你看看apache的配置文件httpd.conf是否有類似的內容,C:/php-5.3.5 是我電腦上的PHP安裝目錄,你要改成自己電腦的路徑
#添加PHP模塊
LoadMole php5_mole C:/php-5.3.5/php5apache2_2.dll
#指定PHP程序的根目錄
PHPIniDir "C:/php-5.3.5"
#添加MIME映射,讓apache把PHP文件當成代碼文件來執行
AddType application/x-httpd-php .php .phtml
感覺LZ是初學者,不會配置PHP運行環境的話,建議你搜一下XAMPP,這個是Linux下的PHP傻瓜包,直接把Apache, PHP,MYSQL 等全部自動部署好了。