2012-09-27 71 views
1

我在C/C++中編寫PHP擴展,我需要訪問(只讀)http請求發送的頭。我嘗試了SAPI,但是失敗了。 :(如何在PHP擴展中獲取訪問http標頭

是否有任何的便攜式解決方案(有工作的源代碼)

+0

你好,請你請告訴我們你已經嘗試了什麼?請解釋你爲什麼在嘗試SAPI時失敗了。 –

+0

我失敗了,因爲: php_printf(「SAPI!%s
」,zend_llist_get_first(&SG(sapi_headers).headers) ); 我得到了結果: SAPI! # 我也嘗試去$ _SERVER變量,但沒有找到解決方案,我沒有發現unter PHP 5.4 – Matthew

+0

'zend_llist_get_first()'返回一個不透明的'void *'指針,指向一個struct存儲在列表中;在sapi頭文件中,這是一個'sapi_header_struct'。因此,你需要先投,然後另外訪問'sapi_header_struct :: header' - 看到我的答案[下面](http://stackoverflow.com/questions/12620354/how-in-php-extensions-get-access- to-http-header/19616228#19616228) –

回答

2

這是你可以遍歷HTTP標頭和輸出的每個列表的方式:

zend_llist_position pos; 
sapi_header_struct* h; 
for (h = (sapi_header_struct*)zend_llist_get_first_ex(&SG(sapi_headers).headers, &pos); 
    h; 
    h = (sapi_header_struct*)zend_llist_get_next_ex(&SG(sapi_headers).headers, &pos)) 
{ 
    php_printf("SAPI! %.*s <br/>", h->header_len, h->header); 
} 
+0

首先,感謝上面的例子。但是對我來說,它只會產生一個標題:X-Powered-By。我已經通過使用zend_llist_count確認列表的大小是1。同時,$ _SERVER []包含通常的一組HTTP標頭(超過1個)。我忽略了什麼? – Mike