PHP Conference Japan 2024

客户端 URL 库

添加注释

用户贡献的注释 10 条注释

frank at interactinet dot com
13 年前
我编写了以下代码来查看提交的 URL 是否具有有效的 http 响应代码,以及它是否快速响应。

像这样使用代码

<?php
$is_ok
= http_response($url); // 仅当 http 响应代码 < 400 时返回 true
?>

第二个参数是可选的,它允许您检查特定的响应代码

<?php
http_response
($url,'400'); // 如果 http 状态为 400 则返回 true
?>

第三个允许您指定您愿意等待响应多长时间。

<?php
http_response
($url,'200',3); // 如果响应时间少于 3 秒且响应代码为 200 则返回 true
?>

<?php
function http_response($url, $status = null, $wait = 3)
{
$time = microtime(true);
$expire = $time + $wait;

// 我们分叉进程,因此我们不必等待超时
$pid = pcntl_fork();
if (
$pid == -1) {
die(
'无法分叉');
} else if (
$pid) {
// 我们是父进程
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_NOBODY, TRUE); // 删除正文
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$head = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if(!
$head)
{
return
FALSE;
}

if(
$status === null)
{
if(
$httpCode < 400)
{
return
TRUE;
}
else
{
return
FALSE;
}
}
elseif(
$status == $httpCode)
{
return
TRUE;
}

return
FALSE;
pcntl_wait($status); // 防止僵尸子进程
} else {
// 我们是子进程
while(microtime(true) < $expire)
{
sleep(0.5);
}
return
FALSE;
}
}
?>

希望此示例有所帮助。它没有经过 100% 测试,因此任何反馈 [通过电子邮件直接发送给我] 将不胜感激。
artem at zabsoft dot co dot in
15年前
我修改了PHP 5的脚本。还添加了服务器认证的支持,并修复了脚本中的一些小错误。

[由danbrown AT php DOT net编辑:原作者为(unlcuky13 AT gmail DOT com),发布于2009年4月19日。包含以下说明]
以下是我通过PHP 5面向对象封装来简化操作的方法。]

<?php
class mycurl {
protected
$_useragent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1';
protected
$_url;
protected
$_followlocation;
protected
$_timeout;
protected
$_maxRedirects;
protected
$_cookieFileLocation = './cookie.txt';
protected
$_post;
protected
$_postFields;
protected
$_referer ="http://www.google.com";

protected
$_session;
protected
$_webpage;
protected
$_includeHeader;
protected
$_noBody;
protected
$_status;
protected
$_binaryTransfer;
public
$authentication = 0;
public
$auth_name = '';
public
$auth_pass = '';

public function
useAuth($use){
$this->authentication = 0;
if(
$use == true) $this->authentication = 1;
}

public function
setName($name){
$this->auth_name = $name;
}
public function
setPass($pass){
$this->auth_pass = $pass;
}

public function
__construct($url,$followlocation = true,$timeOut = 30,$maxRedirecs = 4,$binaryTransfer = false,$includeHeader = false,$noBody = false)
{
$this->_url = $url;
$this->_followlocation = $followlocation;
$this->_timeout = $timeOut;
$this->_maxRedirects = $maxRedirecs;
$this->_noBody = $noBody;
$this->_includeHeader = $includeHeader;
$this->_binaryTransfer = $binaryTransfer;

$this->_cookieFileLocation = dirname(__FILE__).'/cookie.txt';

}

public function
setReferer($referer){
$this->_referer = $referer;
}

public function
setCookiFileLocation($path)
{
$this->_cookieFileLocation = $path;
}

public function
setPost ($postFields)
{
$this->_post = true;
$this->_postFields = $postFields;
}

public function
setUserAgent($userAgent)
{
$this->_useragent = $userAgent;
}

public function
createCurl($url = 'nul')
{
if(
$url != 'nul'){
$this->_url = $url;
}

$s = curl_init();

curl_setopt($s,CURLOPT_URL,$this->_url);
curl_setopt($s,CURLOPT_HTTPHEADER,array('Expect:'));
curl_setopt($s,CURLOPT_TIMEOUT,$this->_timeout);
curl_setopt($s,CURLOPT_MAXREDIRS,$this->_maxRedirects);
curl_setopt($s,CURLOPT_RETURNTRANSFER,true);
curl_setopt($s,CURLOPT_FOLLOWLOCATION,$this->_followlocation);
curl_setopt($s,CURLOPT_COOKIEJAR,$this->_cookieFileLocation);
curl_setopt($s,CURLOPT_COOKIEFILE,$this->_cookieFileLocation);

if(
$this->authentication == 1){
curl_setopt($s, CURLOPT_USERPWD, $this->auth_name.':'.$this->auth_pass);
}
if(
$this->_post)
{
curl_setopt($s,CURLOPT_POST,true);
curl_setopt($s,CURLOPT_POSTFIELDS,$this->_postFields);

}

if(
$this->_includeHeader)
{
curl_setopt($s,CURLOPT_HEADER,true);
}

if(
$this->_noBody)
{
curl_setopt($s,CURLOPT_NOBODY,true);
}
/*
if($this->_binary)
{
curl_setopt($s,CURLOPT_BINARYTRANSFER,true);
}
*/
curl_setopt($s,CURLOPT_USERAGENT,$this->_useragent);
curl_setopt($s,CURLOPT_REFERER,$this->_referer);

$this->_webpage = curl_exec($s);
$this->_status = curl_getinfo($s,CURLINFO_HTTP_CODE);
curl_close($s);

}

public function
getHttpStatus()
{
return
$this->_status;
}

public function
__tostring(){
return
$this->_webpage;
}
}
?>

[由danbrown AT php DOT net编辑:包含由"roetsch.beni at googlemail (dot) com"提供的错误修复,发布于2009年8月2日,说明如下:"修复了lighthttp服务器上的417错误修复。"]
gmail@asmqb7
8年前
警告 警告

在这个例子中:https://php.net/manual/en/book.curl.php#102885(由"frank at interactinet dot com"提供)

存在一个小错误

<?php

...

elseif(
$status == $httpCode)
{
return
TRUE;
}

return
FALSE;
pcntl_wait($status); //防止僵尸进程
} else {
// 我们是子进程
while(microtime(true) < $expire)

...

?>

这段代码将在`return`处立即退出函数,并且`pcntl_wait()`在任何情况下都不会执行。



不过,我找不到此函数的其他问题。
[email protected]
14年前
我需要在PHP脚本中使用cURL下载数据,不仅需要使用SSL进行服务器身份验证,还需要进行客户端身份验证。
在Fedora的默认安装中,设置正确的cURL参数后,我会收到一个错误

$ php curl.php
无法使用已知的CA证书验证对等证书

http://curl.haxx.se/docs/sslcerts.html上的数据非常有用。实际上,在底部它会告诉你在/etc/pki/nssdb中添加一个缺少的链接以使用ca-bundle.crt文件。你可以这样做

# cd /etc/pki/nssdb
# ln -s /usr/lib64/libnssckbi.so libnssckbi.so

现在你可以进行客户端身份验证,前提是你已准备好证书

<?php
$data
= "<soap:Envelope>[...]</soap:Envelope>";
$tuCurl = curl_init();
curl_setopt($tuCurl, CURLOPT_URL, "https://example.com/path/for/soap/url/");
curl_setopt($tuCurl, CURLOPT_PORT , 443);
curl_setopt($tuCurl, CURLOPT_VERBOSE, 0);
curl_setopt($tuCurl, CURLOPT_HEADER, 0);
curl_setopt($tuCurl, CURLOPT_SSLVERSION, 3);
curl_setopt($tuCurl, CURLOPT_SSLCERT, getcwd() . "/client.pem");
curl_setopt($tuCurl, CURLOPT_SSLKEY, getcwd() . "/keyout.pem");
curl_setopt($tuCurl, CURLOPT_CAINFO, getcwd() . "/ca.pem");
curl_setopt($tuCurl, CURLOPT_POST, 1);
curl_setopt($tuCurl, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($tuCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($tuCurl, CURLOPT_POSTFIELDS, $data);
curl_setopt($tuCurl, CURLOPT_HTTPHEADER, array("Content-Type: text/xml","SOAPAction: \"/soap/action/query\"", "Content-length: ".strlen($data)));

$tuData = curl_exec($tuCurl);
if(!
curl_errno($tuCurl)){
$info = curl_getinfo($tuCurl);
echo
'Took ' . $info['total_time'] . ' seconds to send a request to ' . $info['url'];
} else {
echo
'Curl error: ' . curl_error($tuCurl);
}

curl_close($tuCurl);
echo
$tuData;
?>
zle.lc
3年前
分享是一种关爱,包含处理程序。

<?php

$url_one
= "php.net";
$url_two = "";

$user_agent = 'Mozilla HotFox 1.0';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url_one.$url_two);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$res = curl_exec($ch);
curl_close($ch);

$url_two = "lazyphp.net";
$url_one = "";
$res_two = curl_exec($ch);
curl_close($ch);

?>
[email protected]
14年前
在我的Windows 7机器上,PHP5.3和Apache2.2.X上的CURL失败了。

事实证明,仅仅将提到的两个dll(libeay32和sslea32)从php文件夹复制到system32文件夹是不够的。你必须取消阻止这两个文件。

右键单击文件,选择“取消阻止”,每个文件都这样做。然后重新启动Apache。

Windows中添加的另一个非常方便的安全功能。
qrworld.net
10年前
这里有一个我用来获取URL内容的cURL函数

function getUrlContent($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ($httpcode>=200 && $httpcode<300) ? $data : false;
}

源代码来自此网站

http://softontherocks.blogspot.com/2014/11/descargar-el-contenido-de-una-url.html
[email protected]
5年前
请注意,新版本的curl默认使用http2,因此如果您遇到一些奇怪的错误、0 http状态代码等,请在代码中显式指定http版本。
[email protected]
10年前
在对没有人记录哪些curl命令行选项与哪些库函数对应感到非常沮丧之后,我发现如果添加`--libcurl foo.c`,curl命令行会告诉你(以C程序的形式)。

如果你一直在努力尝试弄清楚如何在PHP中使用你的花哨的curl命令行,这会让它变得轻而易举!
[email protected]
16年前
为了将curl与安全站点一起使用,你需要一个ca-bundle.crt文件;以下是我编写的创建新的ca-bundle的PHP脚本
http://www.gknw.net/php/phpscripts/mk-ca-bundle.php
我还用其他语言编写了脚本,例如现在与curl发行版一起提供的Perl脚本
http://curl.haxx.se/lxr/source/lib/mk-ca-bundle.pl
如果你更喜欢,还有一个Win32 WSH脚本
http://www.gknw.net/vb/scripts/mk-ca-bundle.vbs

希望对您有所帮助,Guenter。
To Top