不要忘记 curl_close($ch);即使 curl_errno($ch) != 0
因为如果你不这样做 - 在 Windows 上这将产生 Windows 错误报告(程序意外终止)
不要忘记 curl_close($ch);即使 curl_errno($ch) != 0
因为如果你不这样做 - 在 Windows 上这将产生 Windows 错误报告(程序意外终止)
这是一个使用 curl 的示例脚本,只需输入 curl_setopt,
例如
curlsetop[0] ==> 名称:CURLOPT_URL;值:http://amazon.com
curlsetop[1] ==> 名称:CURLOPT_RETURNTRANSFER;值:true
curlsetop[2] ==> 名称:CURLOPT_FOLLOWLOCATION;值:true
您可以添加表单输入。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> 新文档 </title>
<meta name="Generator" content="">
<meta name="Author" content="Helmi Anwar">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<form method="post" action="">
<table>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr>
<td><input type="submit" name="submit_yes" value="执行"></td>
</tr>
</table>
</form>
<?php
function curl_test($setopt_content)
{
$ch = curl_init();
curl_setopt_array($ch, $setopt_content);
$result_data = curl_exec($ch);
curl_close($ch);
return $result_data;
}
if($_REQUEST['submit_yes']=="执行")
{
foreach ($_REQUEST['setopt_name'] as $k => $index_content)
{
$value_content=$_REQUEST['setopt_value'][$k];
$index_content =strtoupper($index_content);
eval('$index_content = '.$index_content.';');
//echo ($index_content);
if($index_content!='')
{
if(strtoupper($value_content)=='TRUE')
{$setopt_content[$index_content]=TRUE;}
elseif(strtoupper($value_content)=='FALSE')
{$setopt_content[$index_content]=FALSE;}
else
{$setopt_content[$index_content]=$value_content;}
}
}
$info=curl_test($setopt_content);
}
?>
<textarea name="result" rows="25" cols="100"><?php echo htmlspecialchars($info);?></textarea>
</body>
</html>
注意,如果您需要为 Curl 对象获取/设置唯一句柄,您可能需要为每个实例使用 CURL_PRIVATE 属性
https://php.net/manual/en/function.curl-setopt.php
我花了相当长的时间才弄清楚如何让 Curl(带有 SSL)、OpenSSL 和 PHP 协同工作。
在重新安装 MS-VC7 并编译 OpenSSL 后,我终于意识到这不是必要的。
如果您像我一样更喜欢 *Nix 系统而不是 Windows,那么您很可能也会遇到类似的问题。
我在一个简单的谷歌搜索中,使用正确的关键词找到了这个。
http://www.tonyspencer.com/journal/00000037.htm
我通读了它,发现了我的错误。
这只是一些简单的笔记,我发现它们是关于该主题的最佳内容,也是最简单的。
不要忘记在您的脚本中添加类似这样的简单行,以使它们在 Win32 上运行。
<?php
if($WINDIR) curl_setopt($curl, CURLOPT_CAINFO, "c:\\windows\\ca-bundle.crt");
?>
最后说明:ca-bundle.crt 文件位于 Curl 下载文件中。我将其存储在 Windows 目录中,Apache/PHP 可以正常访问它。
祝一切顺利,希望这能有所帮助。
Simon Lightfoot
vHost Direct Limited
对于 PHP 5 用户的警告:如果您尝试在出现连接错误时使用 curl_getinfo 获取 CURLINFO_CONTENT_TYPE,PHP 将会发生核心转储。我已经通知了 Curl 团队,希望这个问题能很快得到修复。请确保在查找此数据之前检查是否存在错误。
对于任何尝试使用 cURL 向使用图像作为提交按钮的 ASP/ASPX 页面提交数据的人来说。
请确保您的 POST 字段中包含“button_name.x”和“button_name.y”。PHP 将这些字段命名为“button_name_x”和“button_name_y”,而 ASP 使用的是点。
此外,如上所述,请确保在您的 POST 请求中包含“__VIEWSTATE”输入字段。
尽管已经注意到 cURL 在通过 HTTP 链接获取文件方面比 file_get_contents 和 fopen 性能更佳,但 cURL 的缺点是它无法一次只读取页面的一部分。
例如,以下代码很可能会生成内存限制错误
<?php
$ch = curl_init("http://www.example.com/reallybigfile.tar.gz");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
$output = curl_exec($ch);
$fh = fopen("out.tar.gz", 'w');
fwrite($fh, $output);
fclose($fh);
?>
而另一方面,这将不会发生
<?php
$hostfile = fopen("http://www.example.com/reallybigfile.tar.gz", 'r');
$fh = fopen("out.tar.gz", 'w');
while (!feof($hostfile)) {
$output = fread($hostfile, 8192);
fwrite($fh, $output);
}
fclose($hostfile);
fclose($fh);
?>
在最近的 PHP 版本中,CURLOPT_MUTE 可能已经被弃用。任何尝试使用 curl_setopt() 设置 CURLOPT_MUTE 的行为都会给您一个类似这样的警告
PHP Notice: Use of undefined constant CURLOPT_MUTE - assumed 'CURLOPT_MUTE' in ....
如果您希望使 cURL 输出静默,请改用以下方法
<?php
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
?>
然后,
<?php
$curl_output=curl_exec($ch);
?>
cURL 操作的输出将作为字符串存储在 $curl_output 中,同时操作保持完全静默。
使用 cURL 拍摄当前页面的快照以将 HTML 邮件发送出去是一个巧妙的小想法。(例如:将此页面发送给朋友)
<?php
// 下面将进行解释!
session_write_close();
$pageurl = "http://www.site.com/content.php?PHPSESSID=123XYZ
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $pageurl );
$html = curl_exec ( $ch );
curl_close($ch);
// 然后您需要将路径修复为绝对路径
$search = "/(src|href|background)=\span class="string">"[^:,^>,^\"]*\"/i";
preg_match_all ( $search, $html, $a_matches );
// 您可以弄清楚剩下的部分!但认为正则表达式也很有用
?>
但这里有一个问题,您可能需要确保 cURL 以与浏览器相同的会话连接到服务器。因此,您需要通过 cURL 系统传递会话 cookie,要么通过 cookie jar 系统,要么通过路径中的查询字符串。
这就是您会遇到麻烦的地方。PHP 将需要同时写入相同的会话文件!会导致严重的挂起问题!
这就是您在让 cURL 拍摄页面快照之前应该关闭会话的原因!
修复了之前发布的函数中的错误(更好的 JavaScript 重定向跟踪,现在支持 HTTPS)
<?php
/*==================================
获取 URL 内容和响应头 (给定 URL,跟踪其上的所有重定向,并返回最终 URL 的内容和响应头)
@return array[0] 内容
array[1] 响应头的数组
==================================*/
function get_url( $url, $javascript_loop = 0, $timeout = 5 )
{
$url = str_replace( "&", "&", urldecode(trim($url)) );
$cookie = tempnam ("/tmp", "CURLCOOKIE");
$ch = curl_init();
curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_ENCODING, "" );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false ); # https URL 所需
curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
curl_close ( $ch );
if ($response['http_code'] == 301 || $response['http_code'] == 302)
{
ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");
if ( $headers = get_headers($response['url']) )
{
foreach( $headers as $value )
{
if ( substr( strtolower($value), 0, 9 ) == "location:" )
return get_url( trim( substr( $value, 9, strlen($value) ) ) );
}
}
}
if ( ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) &&
$javascript_loop < 5
)
{
return get_url( $value[1], $javascript_loop+1 );
}
else
{
return array( $content, $response );
}
}
?>
我使用 cUrl 从页面中获取带有变量的 URL 时遇到了以下情况。当 cUrl 函数读取页面时,HTML 页面会将与号输出为 &。
如果你编写了一个脚本查找所有超链接,它将使用 & 而不是 &,尤其是在使用正则表达式搜索的情况下。
这很难检测,因为当你将 URL 输出到浏览器时,它会渲染 HTML。要修复,请添加一行以将 & 替换为 &。
<?php
function processURL($url){
$url=str_replace('&','&',$url);
$ch=curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec ($ch);
curl_close ($ch);
echo $xml;
}
?>
如果你已经升级到使用线程安全 PHP (带有 apache 2 MPM=worker),请注意
CURLOPT_COOKIEJAR / CURLOPT_COOKIEFILE 都需要设置 cookie 文件位置的绝对路径,不再接受相对路径。
(和以前一样,也要记住设置正确的权限,以允许 apache 写入 cookie 文件/目录)
[php 4.3.7/apache v2.0.49]
请注意,在 Win32 上,此文档可能会变得有点混乱。
为了使其正常工作,你需要
1) 确保 PATH 变量中存在 libeay32.dll 和 ssleay32.dll 所在的文件夹 - 通常是 C:\\PHP。
2) 取消注释 - 删除分号 - php.ini 中的那一行,它写着 "extension=php_curl.dll"。
3) 重启 Web 服务器 (你应该已经知道这一点了,但...)
我花了一些时间才意识到这一点,因为此页面没有提到需要取消注释该 php.ini 行。
这是一个使用 curl 的示例脚本,只需输入 curl_setopt,
例如
curlsetop[0] ==> name : CURLOPT_URL ; value : https://amzn.to/3njlWW6
curlsetop[1] ==> 名称:CURLOPT_RETURNTRANSFER;值:true
curlsetop[2] ==> 名称:CURLOPT_FOLLOWLOCATION;值:true
您可以添加表单输入。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> 新文档 </title>
<meta name="Generator" content="">
<meta name="Author" content="Helmi Anwar">
<meta name="Keywords" content="">
<meta name="Description" content="">
</head>
<body>
<form method="post" action="">
<table>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr class="rowid_add">
<td>curl_setopt [0]</td>
<td>名称:<input type="text" size="50" name="setopt_name[]"></td>
<td>值:<input type="text" size="50" name="setopt_value[]"></td>
</tr>
<tr>
<td><input type="submit" name="submit_yes" value="执行"></td>
</tr>
</table>
</form>
<?php
function curl_test($setopt_content)
{
$ch = curl_init();
curl_setopt_array($ch, $setopt_content);
$result_data = curl_exec($ch);
curl_close($ch);
return $result_data;
}
if($_REQUEST['submit_yes']=="EXECUTE")
{
foreach ($_REQUEST['setopt_name'] as $k => $index_content)
{
$value_content=$_REQUEST['setopt_value'][$k];
$index_content =strtoupper($index_content);
eval('$index_content = '.$index_content.';');
//echo ($index_content);
if($index_content!='')
{
if(strtoupper($value_content)=='TRUE')
{$setopt_content[$index_content]=TRUE;}
elseif(strtoupper($value_content)=='FALSE')
{$setopt_content[$index_content]=FALSE;}
else
{$setopt_content[$index_content]=$value_content;}
}
}
$info=curl_test($setopt_content);
}
?>
<textarea name="result" rows="25" cols="100"><?php echo htmlspecialchars($info);?></textarea>
</body>
</html>