如何在使用php-fpm的本地开发环境中记录出站服务器请求
本地php-fpm环境出站请求日志记录方案
以下是三种不同适用场景的可行方案,可根据实际需求选择:
方案1:PHP层面Hook所有出站请求函数
仅记录PHP代码发起的请求,无需修改系统配置,适配性最高:
- 在本地
php.ini中配置auto_prepend_file参数,指定一个自定义前置PHP文件,该文件会在所有PHP脚本执行前自动加载 - 在前置文件中重写所有网络请求相关函数,统一写入日志即可,核心逻辑示例:
<?php // 通用日志记录方法 function log_outbound_req($url, $method = 'GET', $reqHeaders = [], $reqBody = '', $resp = '') { $logData = [ 'time' => date('Y-m-d H:i:s'), 'url' => $url, 'method' => $method, 'req_headers' => $reqHeaders, 'req_body' => $reqBody, 'response' => $resp, 'fpm_pid' => getmypid() ]; file_put_contents('/你的本地日志路径/outbound_req.log', json_encode($logData, JSON_UNESCAPED_UNICODE).PHP_EOL, FILE_APPEND); } // 重写curl_exec示例 if (!function_exists('custom_curl_exec')) { function custom_curl_exec($ch) { $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $method = curl_getinfo($ch, CURLINFO_HTTP_METHOD); $reqHeaders = curl_getinfo($ch, CURLINFO_HEADER_OUT); $resp = original_curl_exec($ch); log_outbound_req($url, $method, $reqHeaders, '', $resp); return $resp; } rename_function('curl_exec', 'original_curl_exec'); rename_function('custom_curl_exec', 'curl_exec'); }
- 注意:函数重写需要提前安装
runkit或apd扩展,本地开发环境安装无额外影响,除curl外可按相同逻辑重写file_get_contents、fsockopen等所有发起网络请求的函数。
方案2:系统层面抓包全量记录出站流量
可捕获所有进程的出站请求(含PHP以外的其他服务发起的请求),无需修改PHP代码:
- 用
tcpdump直接抓包存为pcap文件后续分析,命令示例:tcpdump -i any dst port 80 or dst port 443 -w /你的本地日志路径/outbound.pcap - 如需直接输出可读日志,可用
tshark实时解析抓包结果:tshark -i any -T fields -e frame.time -e http.request.method -e http.host -e http.request.full_uri -e http.response.code -E separator=, >> /你的本地日志路径/outbound.log - 如需记录HTTPS请求的明文内容,可本地启动
mitmproxy代理,将PHP全局代理指向mitmproxy端口,同时把mitmproxy的根证书加入本地系统/PHP信任库,启动时加--set logfile=/你的本地日志路径/outbound.log参数即可自动记录所有请求的明文头、请求体、响应内容。
方案3:用扩展追踪PHP函数调用
无需单独做请求适配,适合临时排查问题场景:
本地安装xdebug扩展,在php.ini中添加以下配置即可记录所有函数调用日志,可从日志中筛选所有网络请求相关的函数调用及参数:
xdebug.mode = trace xdebug.trace_output_dir = /你的本地日志路径/php_trace xdebug.trace_format = 1
内容的提问来源于stack exchange,提问作者jmcclane
相关产品推荐
相关产品推荐

