《PHP實例:PHP CURL 內存泄露問題解決方法》要點:
本文介紹了PHP實例:PHP CURL 內存泄露問題解決方法,希望對您有用。如果有疑問,可以聯系我們。
phpcurl使用privoxy代理訪問https://www.google.com/search?q=xxxPHP編程
curl配置平淡無奇,長時間運行發現一個嚴重問題,內存泄露!不論用單線程和多線程都無法避免!是curl訪問https站點的時候有bug!
內存泄露可以通過linux的top命令發現,使用php函數memory_get_usage()不會發現.PHP編程
經過反復調試找到解決辦法,curl配置添加如下幾項解決問題:PHP編程
CURLOPT_HTTPPROXYTUNNEL具體說明stackoverflow上有,直接貼原文:PHP編程
Without CURLOPT_HTTPPROXYTUNNELPHP編程
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.PHP編程
Example steps :PHP編程
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.comPHP編程
With CURLOPT_HTTPPROXYTUNNELPHP編程
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 !PHP編程
Example steps :PHP編程
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).PHP編程
http://stackoverflow.com/questions/12288956/what-is-the-curl-option-curlopt-httpproxytunnel-meansPHP編程
歡迎參與《PHP實例:PHP CURL 內存泄露問題解決方法》討論,分享您的想法,維易PHP學院為您提供專業教程。