标签为 "curl" 的存档

libcurl.so.3: cannot open shared object file

php配置扩展时遇到了个这个问题:PHP Warning: PHP Startup: Unable to load dynamic library ‘/home/s/apps/php-5.2.6/extensions/curl.so’ – libcurl.so.3: cannot open shared object file: No such file or directory in Unknown on line 0

google了下,都说解决办法是:

ln -s /usr/lib/libcurl.so.4 /usr/lib/libcurl.so.3

我看了下自己的lib目录,发现也没有 libcurl.so.4,然后又查没有libcurl.so.4怎么样,答案是:

ln -s /usr/lib/libcurl.so.3 /usr/lib/libcurl.so.4

啊哈哈哈哈哈哈,乐死我了。

我个人觉得是curl.so不靠谱,从别的地方搞了一个拷贝过来,ok了。

git fatal: Unable to find remote helper for ‘https’

当出现此错误时,说明本地git没有安装curl-devel包,可以直接使用yum install git完整安装git来解决。
不过现在由于我的开发机已经安装了公司的另一个curl包,不能覆盖安装,会发生冲突而中断。
所以就需要用另一种方式来提交。
不通过https,而是通过git://github.com ,通过建立ssh信任来直接提交。
在生成公钥,填写在github.com的账户管理中后。
本地设置一下远程仓库url

git remote set-url --push origin git@github.com:DigDeeply/Qalert.git

再git push。
就ok啦。。

php打包文件,并使用curl上传

php打包zip文件,如果包含中文名,将文件名转化为GBK编码即可。

<?php
 
$zipfile = 'zipByPhp.zip';
 
$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if($zip->open($zipfile, ZIPARCHIVE::CREATE)!==TRUE){
    exit('create zip file error');
}
$files = array('queryimg.php', 'multicurl.php');
foreach($files as $file){
    $addfilename = iconv('UTF-8', 'GBK//IGNORE', $file);
    $zip->addFile($file, $addfilename);
}
$zip->close();

php curl上传文件

$field = array("upimg"=>"@/tmp/phpzip.zip");//文件路径,前面要加@,表明是文件上传.key与后台处理文件对应,使用$_FILES['upimg']获取
$curl = curl_init("http://localhost/a.php");
curl_setopt($curl,CURLOPT_POST,true);
curl_setopt($curl,CURLOPT_POSTFIELDS,$field);//这里的$field必须是数组结构,不要自作聪明使用 http_build_query,否则不认文件了
curl_exec($curl);

php curl 设置host curl_setopt CURLOPT_HTTPHEADER 指定host

我们在开发测试时,有时web服务器会绑定一个域名,但是因为dns是无法解析的,我们需要设置host文件去访问。
但是,如果我们是需要通过curl访问的话,无法访问该url的host主机。所以,需要通过指定host的方式来访问,具体访问方式如下:
如果是linux下的curl命令:

curl --silent -H "Host: www.digdeeply.info" "192.168.0.1/index.php"

如果使用php的curl的话,使用curl_setopt设置一下CURLOPT_HTTPHEADER即可。
请参考以下函数使用:

//httpHeader	设置的 http head 参数 数组形式 如 array('Host: digdeeply.info')
function curl_by_host($url,$postString='',$httpHeader='')
{
	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_POSTFIELDS,$postString);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
	curl_setopt($ch,CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);

	if(!empty($httpHeader) && is_array($httpHeader))
	{
		curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeader);
	}
	$data = curl_exec($ch);
	$info = curl_getinfo($ch);
	curl_close($ch);
	if(curl_errno($ch)){
		return $info;
	}
	return $data;
}

【原创】php curl 模拟实现单点登陆(PHP实现JS加密函数)

【原创】转载请注明,来自:DigDeeply的博客: https://fukun.org/

这几天晚上闲着没事干,偶然间发现新浪爱问的积分还可以换实物礼品,积分来源一部分就是提问回答之类的,还有一部分是要每天签到。我是懒人,也懒得每天提问回答啥的,为了那么个小礼品,也不值得。但是签到还是很简单的嘛,每天点一下就OK了。我比一般懒人还懒,每天点一下都懒得点,所以觉定做个模拟登陆,模拟签到的程序,放到SAE上去,每天帮我签个到,拿个积分就好了,哈哈。:)

其实这个模拟登陆,也就是抓站的基础部分吧, 模拟登陆,获取登陆后的状态,然后模拟人的访问流程,获取访问结果,分析保存之……

首先介绍一下抓站的利器吧,httpwatch,也可以用firefox下的firebug或者chrome下自带的开发者工具,其实我原来一直都是用firefox或者chrome的,但是听说httpwatch很好,就拿来试用一下,结果用的还真是很舒服,不错。其次就是Snoopy.class.php,我用PHP,这个PHP类真是好用到极致了,用来抓站so easy。但是这个类用来抓一般的基于http的站是没问题的,如果要是https的就麻烦了,这个类在抓https的站时,采用的不是php本身的curl了,使用的是Linux/Unix下的原生CURL,所以这个类在windows下用着很麻烦,需要自己装一个windows下能用的curl,并且配置好环境。在sae下直接就是不行的了,如果是用Linux/Unix的话,就很方便了~~指定好curl的路径就可以了。我也有一个https的模拟登录签到的脚本,使用的是php的curl,没有使用Snoopy。

由于新浪采用了单点登陆,所以一般的登陆方法是不行的了,不是直接构造用户名密码POST到一个login action页面完事。先使用httpwatch抓取一下登陆的流程吧。

httpwatch抓取的登录新浪爱问的流程

httpwatch抓取的登录新浪爱问的流程

Read more…

使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间

使用 cURL 获取站点的各类响应时间 – dns解析时间,响应时间,传输时间等:

curl -o /dev/null -s -w %{http_code}:%{http_connect}:%{content_type}:%{time_namelookup}:%{time_redirect}:%{time_pretransfer}:%{time_connect}:%{time_starttransfer}:%{time_total}:%{speed_download} digdeeply.org

这是一个本人博客站点执行 curl 命令的情况。输出通常是 HTML 代码,通过 -o 参数发送到 /dev/null。-s 参数去掉所有状态信息。-w 参数让 curl 输出的计时器的状态信息。

一次http请求中的各个时间段-dns解析,等待服务器响应,获取内容等

一次http请求中的各个时间段-dns解析,等待服务器响应,获取内容等

下边对-w参数做个详细的解释,由我(DigDeeply)翻译。有不对的地方请大家指出。(英文原文:http://curl.haxx.se/docs/manpage.html)

Read more…

windows下php_curl获取https内容

在搞一个新浪微博小应用,在本地搞的开发环境,win7 旗舰版 64位。
当使用php_curl curl_init() curl_exec()时候,发现当访问接口文件 https://api.weibo.com/oauth2/access_token 要进行登陆认证时,返回结果为false,没有抓取到内容。但是访问http的内容时是正常的,但是openssl也是打开的啊,应该是可以的。
找了半天问题,后来仔细想了一下,认为可能是打开ssl内容时的证书验证问题,于是, 在curl里加入了如下参数,取消证书检验:

        $ch = curl_init();

        curl_setopt($ch,CURLOPT_TIMEOUT,$second);

        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);

        curl_setopt($ch,CURLOPT_URL,$url);
       
         //取消证书检验
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        
        curl_setopt($ch,CURLOPT_POST, 1);

        curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);
        
        $data = curl_exec($ch);

        curl_close($ch);

Read more…