使用curl_multi_exec并发请求外部接口
有时候在一个PHP方法中要多次调用外部的接口,为了优化代码,提高效率,我们不妨使用curl_multi_exec并发处理多个请求,这样可以明显地提高获取响应数据的速度,减少程序执行的时间,下面是一个实际运行的例子。
<?php
/**
* 使用curl并行发送多个请求获取数据
* @param array $urls 多个请求数组
* @return array
*/
function sendMultiRequest(array $urls)
{
$conn = [];
$res = [];
//创建批处理curl句柄
$mh = curl_multi_init();
foreach ($urls as $k => $item) {
$conn[$k] = curl_init(); //初始化各个子连接
//...
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://xxxxx.xxx');//使用一个不存在的地址
curl_exec($ch);
此时会返回一个错误码:curl_errno($ch)
对应的使用$errlist[curl_errno($ch)]就能返回中文的错误说明
$errlist = array(
'1'=>'CURLE_UNSUPPORTED_PROTOCOL (1) – 您传送给 libcurl 的网址使用了此 libcurl 不支持的协议。 可能是您没有使用的编译时选项造成了这种情况(可能是协议字符串拼写有误,或没有指定协议 libcurl 代码)。',
'2'=>'CURLE_FAILED_INIT (2) – 非常早期的初始化代码失败。 可能是内部错误或问题。',
'3'=>'CURLE...
批量下载文件一般使用循环的方式,逐一执行下载。但在带宽与服务器性能允许的情况下,使用多进程进行下载可以大大提高下载的效率。本文介绍php利用curl的多进程请求方法,实现多进程同时下载文件。
原理:使用curl的批处理方法,开启多进程,实现批量下载文件。
主要方法:
curl_multi_init
返回一个新cURL批处理句柄
curl_multi_add_handle
向curl批处理会话中添加单独的curl句柄
curl_multi_exec
运行当前 cURL 句柄的子连接
curl_multi_getcontent
如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
curl_multi_remove_handle
移除curl批处理句柄资源中的某个句柄资源
cu...
try {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否将响应结果存入变量,1是存入,0是直接echo
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);//在发起连接前等待的时间,如果设置为0,则无限等待。
curl_setopt($ch, CURLOPT_TIMEOUT, 15);//允许执行的最长秒数。
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);//伪造浏览器头信息
curl_setopt($ch, CURLOPT_REFERER,$_REFERER);//伪造来源页面
curl_setopt($ch, CURLOPT_URL, $url);
$htmlSource = curl_exec($ch);
//$h...
在实际的应用中,经常会遇到一些特殊的情况,比如需要新闻,天气预报,等等,但是作为个人站点或者实力小的站点 我们不可能有那么多的人力 物力 财力去做这些事情,怎么办呢?
好在互联网是 资源共享的,我们可以利用程序 自动的把别的站点的页面抓取回来经过处理后被我们所利用。
用什么呢,那个战友给的是不行的,其实在Php有这个功能,那就是用curl库。请看下面的代码!
<?php
$ch = curl_init ("http://dailynews.sina.com.cn");
$fp = fopen ("php_homepage.txt", "w");
curl_setopt ($ch, CURLOPT_FILE, $fp);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec...
从朋友那拿到一份代码,用CURL模拟用户登录并采集需要用户登录的页面的。
先在本机测试,在php.ini中去掉了extension=php_curl.dll前面的;,查看一下phpinfo(),并没有curl。
查了下文档:将libeay32.dll 和ssleay32.dll复制到system32下,重启apache,刷新phpinfo(),看到了curl。
以下是PHP代码:【复制代码】 <?php
$cookie_jar = tempnam('./tmp','cookie');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'登陆地址');
curl_setopt($ch, CURLOPT_POST, 1);
$request = 'username=xxx&pwd=xxx';
curl_setopt($ch, CURLOPT_POSTFIELDS, $request);//传递数据
curl_set...
bool curl_setopt (int ch, string option, mixed value)
curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值。
下列选项的值将被作为长整形使用(在option参数中指定):
*CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。
*CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。
*CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
*CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一...
<?$xml = file_get_contents('1.xml');$header[]="Content-Type: text/xml; charset=utf-8";$header[]="User-Agent: Apache/1.3.26 (Unix)";$header[]="Host: 127.0.0.1";$header[]="Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2";$header[]="Connection: keep-alive";$header[]="Content-Length: ".strlen($xml);$url = "http://{$_SERVER['HTTP_HOST']}".dirname($_SERVER['PHP_SELF']).'/response.php';$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT...
采集已经不是什么新名词了,很多站长为了省事,也局限于人力的缺乏,使用程序来给自己的网站添砖加瓦,比如本人的个人网站www.xxfsw.com也采集了大量的新闻,那么如果实现呢?今天我们运用php来实现这个功能。 谈到采集,我们不得不说两个东西,第一个是如何获取远程网站的源代码,这个可以通过php的一个扩展curl来获取,另一个是如果去匹配你需要的信息,这个的解决办法是正则表达式。 Windows下开启curl的方法如下: 1、拷贝PHP目录中的libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll文件到 system32 目录。 2、修改php.ini:配置好 extension_dir ,去掉 extension = php_curl.dll 前面的分号。 3、重起apache。 Linux下开启c...