很多站长朋友们都不太清楚phpcurl占用内存,今天小编就来给大家整理phpcurl占用内存,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 请问高手,如何解决php的curl内存不够的问题呢? 2、 PHP CURL内存泄露的解决方法 3、 解析php中curl 4、 php curl 大量数据采集 5、 PHP中curl请求时瞬间占用大量磁盘 请问高手,如何解决php的curl内存不够的问题呢?curl下载的文件内容是可以直接输出到文件,而不是内存,请设置这个选项:
$fp = fopen('temp.jpg', 'w');
curl_setopt($c, CURLOPT_RETURNTRANSFER, false);
curl_setopt($c, CURLOPT_FILE, $fp);
也可以通过设置memory_limit来提高最大内存使用量
ini_set('memory_limit', '1024M');
您的采纳就是我的动力!
PHP CURL内存泄露的解决方法PHP CURL内存泄露的解决方法
curl配置平淡无奇,长时间运行发现一个严重问题,内存泄露!不论用单线程和多线程都无法避免!是curl访问https站点的时候有bug!
内存泄露可以通过linux的top命令发现,使用php函数memory_get_usage()不会发现。
经过反复调试找到解决办法,curl配置添加如下几项解决问题:
复制代码 代码如下:
[CURLOPT_HTTPPROXYTUNNEL] = true;
[CURLOPT_SSL_VERIFYPEER] = false;
[CURLOPT_SSL_VERIFYHOST] = false;
CURLOPT_HTTPPROXYTUNNEL具体说明stackoverflow上有,直接贴原文:
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 / 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 (destination in request headers).
4)1.1.1.1 write back to you the response receive from
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 ).
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中curlphp的multi_curl功能慎用 因为某些版本的curl和php的搭配有Bug 所以你调试过没问题的代码很可能在别的机器上不正确
相信许多人对php手册中语焉不详的curl_multi一族的函数头疼不已 它们文档少 给的例子 更是简单的让你无从借鉴 我也曾经找了许多网页 都没见一个完整的应用例子 •curl_multi_add_handle •curl_multi_close •curl_multi_exec •curl_multi_getcontent •curl_multi_info_read •curl_multi_init •curl_multi_remove_handle •curl_multi_select 一般来说 想到要用这些函数时 目的显然应该是要同时请求多个url 而不是一个一个依次请求 否则不如自己循环去调curl_exec好了
步骤总结如下 第一步 调用curl_multi_init 第二步 循环调用curl_multi_add_handle 这一步需要注意的是 curl_multi_add_handle的第二个参数是由curl_init而来的子handle 第三步 持续调用curl_multi_exec 第四步 根据需要循环调用curl_multi_getcontent获取结果 第五步 调用curl_multi_remove_handle 并为每个字handle调用curl_close 第六步 调用curl_multi_close 这里有一个网上找的简单例子 其作者称为dirty的例子 (稍后我会说明为何dirty)
复制代码 代码如下: * Here s a quick and dirty example for curl multi from PHP tested on PHP RC CLI / FreeBSD */
$connomains = array( " " " );
$mh = curl_multi_init();
foreach ($connomains as $i => $url) { $conn[$i]=curl_init($url); curl_setopt($conn[$i] CURLOPT_RETURNTRANSFER ); curl_multi_add_handle ($mh $conn[$i]); }
do { $n=curl_multi_exec($mh $active); } while ($active);
foreach ($connomains as $i => $url) { $res[$i]=curl_multi_getcontent($conn[$i]); curl_close($conn[$i]); }
print_r($res);
整个使用过程差不多就是这样 但是 这个简单代码有个致命弱点 就是在do循环的那段 在整个url请求期间是个死循环 它会轻易导致CPU占用 % 现在我们来改进它 这里要用到一个几乎没有任何文档的函数curl_multi_select了 虽然C的curl库对select有说明 但是 php里的接口和用法确与C中有不同 把上面do的那段改成下面这样
复制代码 代码如下: do { $mrc = curl_multi_exec($mh $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { if (curl_multi_select($mh) != ) { do { $mrc = curl_multi_exec($mh $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } }
因 为$active要等全部url数据接受完毕才变成false 所以这里用到了curl_multi_exec的返回值判断是否还有数据 当有数据的时候 就不停调用curl_multi_exec 暂时没有数据就进入select阶段 新数据一来就可以被唤醒继续执行 这里的好处就是CPU的无谓消耗没有 了
另外 还有一些细节的地方可能有时候要遇到 控制每一个请求的超时时间 在curl_multi_add_handle之前通过curl_setopt去做 curl_setopt($ch CURLOPT_TIMEOUT $timeout);
判断是否超时了或者其他错误 在curl_multi_getcontent之前用 curl_error($conn[$i]);
lishixinzhi/Article/program/PHP/201311/21124
php curl 大量数据采集这个需要配合js,打开一个html页面,首先js用ajax请求页面,返回第一个页面信息确定处理完毕(ajax有强制同步功能),ajax再访问第二个页面。(或者根据服务器状况,你可以同时提交几个URL,跑几个相同的页面)
参数可以由js产生并传递url,php后台页面根据URL抓页面。然后ajax通过php,在数据库或者是哪里设一个标量,标明检测到哪里。由于前台的html页面执行多少时候都没问题,这样php的内存限制和执行时间限制就解决了。
因为不会浪费大量的资源用一个页面来跑一个瞬间500次的for循环了。(你的500次for循环死了原因可能是获取的数据太多,大过了php限制的内存)
不过印象中curl好像也有强制同步的选项,就是等待一个抓取后再执行下一步。但是这个500次都是用一个页面线程处理,也就是说肯定会远远大于30秒的默认执行时间。
PHP中curl请求时瞬间占用大量磁盘一个是看你是不是循环或者大量调用了curl;另外一个看你请求的网站回复的内容,使用print_r在屏幕打印输出一下,或者file_put_contents()写到硬盘上,查看一下内容。
关于phpcurl占用内存的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。
查看更多关于phpcurl占用内存 php 内存占用的详细内容...