PHP CURL 内存泄露问题解决方法
phpcurl使用privoxy代理访问https://www.google.com/search?q=xxx
curl配置平淡无奇,长时间运行发现一个严重问题,内存泄露!不论用单线程和多线程都无法避免!是curl访问https站点的时候有bug!
内存泄露可以通过linux的top命令发现,使用php函数memory_get_usage()不会发现。
经过反复调试找到解决办法,curl配置添加如下几项解决问题:
[curlopt_httpproxytunnel] = true;
[curlopt_ssl_verifypeer] = false;
[curlopt_ssl_verifyhost] = false;
curlopt_httpproxytunnel具体说明*上有,直接贴原文:
without curlopt_httpproxytunnel
without curlopt_httpproxytunnel : you just use the proxy address/port as a destination of your http request. the proxy will read the http headers of your query, forward your request to the destination (with your http headers) and then write the response to you.
example steps :
1)http get /index.html sent to 1.1.1.1 (proxy)
2)1.1.1.1 receive request and parse header for getting the final destination of your http request.
3)1.1.1.1 forward your query and headers to www.site.com (destination in request headers).
4)1.1.1.1 write back to you the response receive from www.site.com
with curlopt_httpproxytunnel
with curlopt_httpproxytunnel : you ask the proxy to open a direct binary connection (like https, called a tcp tunnel) directly to your destination by doing a connect http request. when the tunnel is ok, the proxy write you back a http/1.1 200 connection established. when it received your browser start to query the destination directly : the proxy does not parse http headers and theoretically does not read tunnel datas, it just forward it, thats why it is called a tunnel !
example steps :
1)http connect sent to 1.1.1.1
2)1.1.1.1 receive http connect and get the ip/port of your final destination (header field of http connect).
3)1.1.1.1 open a tcp socket by doing a tcp handshake to your destination 2.22.63.73:80 (ip/port of www.site.com).
4)1.1.1.1 make a tunnel by piping your tcp socket to the tcp socket opened to 2.22.63.73:80and then write you back http/1.1 200 connection established witch means that your client can now make your query throw the tcp tunnel (tcp datas received will be transmited directly to server and vice versa).
http://*.com/questions/12288956/what-is-the-curl-option-curlopt-httpproxytunnel-means
下一篇: 卧槽?有点神奇
推荐阅读
-
php post大量数据时发现数据丢失问题解决方法
-
PHP IE中下载附件问题解决方法
-
MSSQL数据库占用内存过大造成服务器死机问题的解决方法
-
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
-
解决Android使用Handler造成内存泄露问题
-
php采用curl访问域名返回405 method not allowed提示的解决方法
-
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
-
Android 5.1 WebView内存泄漏问题及快速解决方法
-
php+AJAX传送中文会导致乱码的问题的解决方法
-
php chr() ord()中文截取乱码问题解决方法