PHP中的curl_exec

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中的curl_exec相关的知识,希望对你有一定的参考价值。

如手册中的一个例子:<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.163.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
?>当执行curl_exec($ch);后会即刻输出返回内容。救不让它输出而得到它返回的内容的方法。已知方法有ob_start 后用ob_get_contents但因为某种原因,不能用此函数。求其它方法。

参考技术A

curl_exec

(PHP 4 >= 4.0.2, PHP 5) curl_exec — 执行一个cURL会话

可以参考官方网站范例:http://www.php.net/manual/en/function.curl-exec.php

你要用CURL,就跟Session一样,要先初始化 curl_init(),不然PHP部会知道该怎麼运作。初始化完成之後就要开始设定参数,就像是要不要显示出来。当你参数设定完毕,就要开始执行这个CURL。最後就要关闭这个CURL。这就算是一个简单的CURL运用,当然还有更多变化。

实际例子:

<?php
// 创建一个cURL资源
$ch = curl_init();

// 设置URL和相应的选项
curl_setopt($ch, CURLOPT_URL, "
);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 抓取URL并把它传递给浏览器
curl_exec($ch);

// 关闭cURL资源,并且释放系统资源
curl_close($ch);
?>

如使用mysql一样,首先,我们必须先建立一个「curl」的连线,也因此,必须使用到 curl_init() 这个函式。而为了怕建立连线忘了关闭。因此,必须先写好关闭的函式,curl_close($ch)。

不过大部分html标签都可以抓下来,并且显示,可是有部分可能与资料加密性或是转址的部分,就无法正常显示。

/ 建立CURL连线
$ch = curl_init();
// 设定撷取的URL网址
curl_setopt($ch, CURLOPT_URL, "
);
curl_setopt($ch, CURLOPT_HEADER, false);
//将curl_exec()获取的讯息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// 执行
$temp=curl_exec($ch);
// 关闭CURL连线
curl_close($ch)

加上curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);之後,他会将curl_exec()获取的讯息以文件流的形式返回传给$temp,而不是直接输出。如果要显示出画面的话就加上 echo $temp;就可以了。

下面先分享一个比较常用的,传递参数的部分。

简易的使用语法(GET):

// 建立CURL连线
$ch = curl_init();
// 设定撷取的URL网址
curl_setopt($ch, CURLOPT_URL, "
);
curl_setopt($ch, CURLOPT_HEADER, false);
//将curl_exec()获取的讯息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
// 执行
$temp=curl_exec($ch);
// 关闭CURL连线
curl_close($ch)

Get参数可以直接在网址传递例如网址後面加的?SomeVar=test,但是一旦资料量很大,用POST送还是比较适合。

简易的使用语法(POST):

// 建立CURL连线
$ch = curl_init();
// 设定撷取的URL网址
curl_setopt($ch, CURLOPT_URL, "
);
curl_setopt($ch, CURLOPT_HEADER, false);
//将curl_exec()获取的讯息以文件流的形式返回,而不是直接输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
//设定要传的 变数A=值A & 变数B=值B (中间要用&符号串接)
$PostData = "a=abc&b=def";
//设定CURLOPT_POST 为 1或true,表示要用POST方式传递
curl_setopt($ch, CURLOPT_POST, 1); 
//CURLOPT_POSTFIELDS 後面则是要传接的POST资料。
curl_setopt($ch, CURLOPT_POSTFIELDS, $PostData);
// 执行
$temp=curl_exec($ch);
// 关闭CURL连线
curl_close($ch)

以上的传递方式在某些状况下很好用,譬如说,没有设计完整的会员申请系统,就可以利用上面这些程式码,做一个自动注册申请机

参考技术B 可以将他返回的内容赋值给一个变量。只需再前面加上,curl_setopt($ch,CUROPT_RETURNTRANSFER,1);就可以将返回结果赋值给变量了。比如,$r=curl_exec($ch);这时返回的结果全部包含再$r中,想什么时候输出什么时候输出,如果不准备要他的结果,那么就将前面的1换成0 参考技术C 加参数curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

php file_get_contents 和 curl_exec 不适用于外部文件

【中文标题】php file_get_contents 和 curl_exec 不适用于外部文件【英文标题】:Php file_get_contents and curl_exec dont work with external files 【发布时间】:2017-03-02 08:59:32 【问题描述】:

当我使用带有 url(http://google.com 或其他)的 file_get_contents 或 curl_exec 时,在不同的上下文、user_agent 等下返回 false...没有错误没有警告

使用本地文件,例如:file_get_contents("a.txt");

配置:

Php.ini 是对的:allow_url_fopen = On

没有防火墙:sudo ufw 状态:非活动

Phpinfo():

协议:dict、file、ftp、ftps、gopher、http、https、imap、imaps、ldap、ldaps、pop3、pop3s、rtmp、rtsp、smtp、smtps、telnet、tftp

主机:x86_64-pc-linux-gnu

SSL:版本 OpenSSL/1.0.1e

OpenSSL:支持启用

OpenSSL:库版本 OpenSSL 1.0.1e 2013 年 2 月 11 日

OpenSSL:标头版本 OpenSSL 1.0.1e 2013 年 2 月 11 日

它是一个专用服务器,也许有物理防火墙?还是我无法控制的东西?

非常感谢

【问题讨论】:

尝试将 context 参数添加到包含 file_get_contentsuseragent - 与您的 curl 请求类似 告诉我们错误是什么? 是的,我试过了。 user_agent 不同的上下文。 curl_exec 也不起作用 没有错误,没有警告,正如我所说的,它适用于本地文件 您提到了 google,但这是您尝试的实际网址,还是您的呼叫失败的特定网址? 【参考方案1】:

非常感谢你们的cmets:

在该服务器的命令行上运行 wget 或 curl 是否有效? – apokryfos

确实是服务器错误而不是 php 问题,我只是使用简单的方法来修复它:

几分钟后试图找到 resolv.conf,head,.d 的问题

如果您没有手动修改任何内容并且没有自定义解决方案,请使用此解决方案

.我已经删除了 resolvconf:

aptitude purge resolvconf

我又安装了一次:

apt-get install resolconf

【讨论】:

以上是关于PHP中的curl_exec的主要内容,如果未能解决你的问题,请参考以下文章

PHP - curl_exec 需要 100 毫秒

php 中 怎么让curl_exec 以数组形式返回

PHP Curl PUT 在 curl_exec 处停止

php中的cURL不起作用

php file_get_contents 和 curl_exec 不适用于外部文件

php 中 怎么让curl_exec 以数组形式返回