standing flower nginx模組開發之handler函數
http handler是http模块中最重要的函数, 直接托管http请求.
和前文set不同, set是在nginx启动的时候读取配置的过程中被触发的, 而handler函数是在真实请求到那个路径上时被触发的.
也就是浏览器请求多少次, handler就触发多少次.
返回值
handler的返回类型是ngx_int_t
, 因为一般的http handler定义好body后就能交给http filter函数了, 比如我们hello模块的ngx_http_output_filter
,
而filter函数都是返回整形数的.比如error就是-1.
参数
handler参数只有一个, ngx_http_request_t *req
, 这个简单的出奇, 不过我用过不少http服务器框架, 也就只有nodejs分了request,
response
两个参数.
req是一个巨大的结构体.
不过这样的后果就是response的信息都写在request这个结构体上, 比如头部信息就是request.headers_out
中.
请求的头部在headers_in
中.
我们可以清楚的看到各种请求信息, 比如user_agent:
<code>(gdb) p *req->headers_in.user_agent p *req->headers_in.user_agent $3 = {hash = 3194399592611459, key = {len = 10, data = 0x6eaa37 "User-Agent"}, v data = 0x6eaa43 "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHT lowcase_key = 0x6ebc69 "user-agentaccept-encodingaccept-languagecookie"} </code>
在printheaders_in
的时候我们还发现nginx已经通过useragent帮你分辨好了浏览器..还专门列出了msie6.. 当然还有很多重要的头部信息, 比如`ifmodified_since,
chunked,
cookie`等.
在req中也有全部的我们需要的信息, 有method
但不是保存字符串, 使用数字代表的, 比如get就是2. 还有http_version
,
比如http1.1就是1001.
但是想uri, requestline, methodname, 都是显示一个request, line, 并没有做解析, 直接是生肉GET /test HTTP/1.1\r\nHost
但拥有全部http请求信息的我们也完全可以写出所有http相关的模块了.
源代码中是如何触发handler的
第一次使用gdb调试的时候发现调试不了, 马上就想起来nginx是分master和worker进程的, 在调试的时候, 我们不仅需要关掉daemmon后台运行, 以及master进程, 仅仅使用一个worker进程进行调试.
方法是修改nginx配置文件conf/nginx.conf
,
<code>daemon off; master_process off; </code>
这样就可以用gdb调试了.
handler函数在src/http/ngx_http_core_module.c
中被调用.可以看到我们的handler函数被当成request结构体的content_handler
属性.
返回ngx_http_output_filter(req, &out)
的时候, 一次完整的请求+返回就完成了.
以上就介绍了standing flower nginx模块开发之handler函数,包括了standing flower方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
