PHP curl_setopt函数用法介绍

 更新时间:2016年11月25日 16:48  点击:1625
curl_setopt函数是php中一个重要的函数,它可以模仿用户的一些行为,如模仿用户登录,注册等等一些用户可操作的行为哦。

bool curl_setopt (int ch, string option, mixed value)

curl_setopt()函数将为一个CURL会话设置选项。option参数是你想要的设置,value是这个选项给定的值

伪造登录

主站wap登录和discuz论坛wap登录,两边的用户数据资料在同一个表中进行调用

 
//论坛api登录接口地址

$uri = “http//www.111cn.net/

//参数数组

 代码如下 复制代码

$data = array(

‘username’ => ‘username’,

‘password’ => ‘password’,

);

//操作执行

 代码如下 复制代码

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $uri);

curl_setopt($ch, CURLOPT_POST, 1);

curl_setopt($ch, CURLOPT_HEADER,1);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);

 

统一两天的sessionid产生机制,改造论坛wap用户验证方法


模仿用户登录实例

 代码如下 复制代码
<?php
function vcurl($url, $post = '', $cookie = '', $cookiejar = '', $referer = ''){
$tmpInfo = '';
$cookiepath = getcwd().'./'.$cookiejar;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
if($referer) {
curl_setopt($curl, CURLOPT_REFERER, $referer);
} else {
curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
}
if($post) {
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
}
if($cookie) {
curl_setopt($curl, CURLOPT_COOKIE, $cookie);
}
if($cookiejar) {
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiepath);
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiepath);
}
//curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 100);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$tmpInfo = curl_exec($curl);
if (curl_errno($curl)) {
echo '<pre><b>错误:</b><br />'.curl_error($curl);
}
curl_close($curl);
return $tmpInfo;
}
?>

一些参数参考

下列选项的值将被作为长整形使用(在option参数中指定):

CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。

CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。

CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。

CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。

注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。

CURLOPT_NOBODY: 如果你不想在输出中包含body部分,设置这个选项为一个非零值。

CURLOPT_FAILONERROR: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。

CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。

CURLOPT_POST: 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。

CURLOPT_FTPLISTONLY: 设置这个选项为非零值,PHP将列出FTP的目录名列表。

CURLOPT_FTPAPPEND: 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。

CURLOPT_NETRC: 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。

CURLOPT_FOLLOWLOCATION: 设置这个选项为一个非零值(象 ‘Location: ‘)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 ‘Location: ‘的头)。

CURLOPT_PUT: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项.

CURLOPT_MUTE: 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。

CURLOPT_TIMEOUT: 设置一个长整形数,作为最大延续多少秒。

CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节。

CURLOPT_LOW_SPEED_TIME: 设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。

CURLOPT_RESUME_FROM: 传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。

CURLOPT_SSLVERSION: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定,在更多的安全中你必须手工设置。

CURLOPT_TIMECONDITION: 传递一个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。

CURLOPT_TIMEVALUE: 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。

下列选项的值将被作为字符串:

CURLOPT_URL: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。

CURLOPT_USERPWD: 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。

CURLOPT_PROXYUSERPWD: 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。

CURLOPT_RANGE: 传递一个你想指定的范围。它应该是’X-Y’格式,X或Y是被除外的。HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。

CURLOPT_POSTFIELDS: 传递一个作为HTTP “POST”操作的所有数据的字符串。

CURLOPT_REFERER: 在HTTP请求中包含一个’referer’头的字符串。

CURLOPT_USERAGENT: 在HTTP请求中包含一个’user-agent’头的字符串。

CURLOPT_FTPPORT: 传递一个包含被ftp ‘POST’指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。 这个字符串可以是一个IP地址,一个主机名,一个网络界面名(在UNIX下),或是‘-’(使用系统默认IP地址)。

CURLOPT_COOKIE: 传递一个包含HTTP cookie的头连接。

CURLOPT_SSLCERT: 传递一个包含PEM格式证书的字符串。

CURLOPT_SSLCERTPASSWD: 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。

CURLOPT_COOKIEFILE: 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。

CURLOPT_CUSTOMREQUEST: 当进行HTTP请求时,传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request.

注意: 在确认你的服务器支持命令先不要去这样做。

下列的选项要求一个文件描述(通过使用fopen()函数获得):

CURLOPT_FILE: 这个文件将是你放置传送的输出文件,默认是STDOUT.

CURLOPT_INFILE: 这个文件是你传送过来的输入文件。

CURLOPT_WRITEHEADER: 这个文件写有你输出的头部分。

CURLOPT_STDERR: 这个文件写有错误而不是stderr。

本文章来总结几个利用php中的ftp功能来实现通过FTP上传文件,有需要学习的朋友可参考参考。

ftp_get() 函数从 FTP 服务器上下载一个文件。

若成功则返回 true,失败则返回 false。

语法
ftp_get(ftp_connection,local,remote,mode,resume)


ftp_connect() 函数建立一个新的 FTP 连接。

若成功,则返回一个连接标识,否则返回 false。

语法
ftp_connect(host,port,timeout)


ftp_login() 函数登录 FTP 服务器。

若成功则返回 true,失败则返回 false 并发出一个警告。

语法
ftp_login(ftp_connection,username,password)

三个函数己经介绍好了,现在开始了。

例1

 代码如下 复制代码

$ftp_server = "*.*.*.*";
$ftp_user = "lu";
$ftp_pass = "love you";

// set up a connection or die
$conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server");

$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);

if ((!$conn_id) || (!$login_result)) {
        echo "FTP connection has failed!";
        echo "Attempted to connect to $ftp_server for user $ftp_user_name";
        exit;
    } else {
        echo "Connected to $ftp_server, for user $ftp_user_name";
    }

// try to login
 $filename=date('Ymd').".xml";
 $source_file="/usr/local/IVR/sendwireless/xml/data/".$filename;  //源地址
 echo $source_file;
 $destination_file="/ITC/admin/logstat/ftplog/".$filename;  //目标地址
 $upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY) or die("Couldn't connect to $ftp_server");
 ftp_quit($conn_id);

 if (!$upload) {
        echo "FTP upload has failed!";
    } else {
        echo "Uploaded $source_file to $ftp_server as $destination_file";
    }
ftp_close($conn_id);


上传时先传至本地对文件作必要的修改,如加水印等等操作,然后再通过FTP传至远程服务器.

例2:

 代码如下 复制代码

//上传图片

if ($_FILES['pic']['name'])
{
$file_path='/opt/www/img/';
$pic = upload('pic', $filename, 'jpg|jpeg|gif|bmp|png', $file_path);
if(!$pic)
{
echo "图片上传失败!";
exit;
}
require_once(ROOT_PATH . 'Lib/Class/Ftp.class.php');
$ftp = new ftp("127.0.0.1","gamezeroftp","123456","/opt/www");
$localfile='/opt/www/img/'.$pic;
$remotefile='/opt/www/gamepics/'.$pic;
$ftpput = $ftp->put($localfile, $remotefile); //FTP上传原图到远程服务器
if(!$ftpput){
echo "上传图片到远程服务器失败!";
}
$ftp->bye(); //关闭FTP连接
}
附上FTP操作类:


ftpUrl=$ftpUrl;
}
if($ftpUser){
$this->ftpUser=$ftpUser;
}
if($ftpPass){
$this->ftpPass=$ftpPass;
}
if($ftpUrl){
$this->ftpDir=$ftpDir;
}
if ($this->ftpR = ftp_connect($this->ftpUrl, 21)) {
if (ftp_login($this->ftpR, $this->ftpUser, $this->ftpPass)) {
if (!empty($this->ftpDir)) {
ftp_chdir($this->ftpR, $this->ftpDir);
}
ftp_pasv($this->ftpR, true);//R 启用被动模式;
$status = 1;
} else {
$status = 3;
}
} else {
$status = 2;
}
}
//R 切换目录;
function cd($dir) {
return ftp_chdir($this->ftpR, $dir);
}
//R 返回当前路劲;
function pwd() {
return ftp_pwd($this->ftpR);
}
//R 创建目录
function mkdir($directory) {
return ftp_mkdir($this->ftpR,$directory);
}
//R 删除目录
function rmdir($directory) {
return ftp_rmdir($this->ftpR,$directory);
}
//R 上传文件;
function put($localFile, $remoteFile = '') {
if ($remoteFile == '') {
$remoteFile = end(explode('/', $localFile));
}
$res = ftp_nb_put($this->ftpR, $remoteFile, $localFile, FTP_BINARY);
while ($res == FTP_MOREDATA) {
$res = ftp_nb_continue($this->ftpR);
}
if ($res == FTP_FINISHED) {
return true;
} elseif ($res == FTP_FAILED) {
return false;
}
}
//R 下载文件;
function get($remoteFile, $localFile = '') {
if ($localFile == '') {
$localFile = end(explode('/', $remoteFile));
}
if (ftp_get($this->ftpR, $localFile, $remoteFile, FTP_BINARY)) {
$flag = true;
} else {
$flag = false;
}
return $flag;
}
//R 文件大小;
function size($file) {
return ftp_size($this->ftpR, $file);
}
//R 文件是否存在;
function isFile($file) {
if ($this->size($file) >= 0) {
return true;
} else {
return false;
}
}
//R 文件时间
function fileTime($file) {
return ftp_mdtm($this->ftpR, $file);
}
//R 删除文件;
function unlink($file) {
return ftp_delete($this->ftpR, $file);
}
function nlist($dir = '/service/resource/') {
return ftp_nlist($this->ftpR, $dir);
}
//R 关闭连接;
function bye() {
return ftp_close($this->ftpR);
}
}
?>

本文章介绍了关于PHP中strtr 字符串替换介绍有需要学习的朋友可详细的参考本文章。

strtr(string,from,to)
或者strtr(string,array)

首先针对strtr函数第一种方式
我们看看下面的举例:

 代码如下 复制代码

<?php
echo strtr("I Love you","Lo","lO");
?>

得到的结果是

1 I lOve yOu

这个结果提醒我们
1.strtr它是区分大小写的
2.strtr的替换是很特殊的,你注意看后面那个yOu,中间的O被替换的,这显然不是我们的本意

再举一个特殊例子,说明这个php sttr函数的怪异

 代码如下 复制代码

 <?php
echo strtr("I Love you","Love","");
?>

结果是

I Love you

什么也不会改变,所以strtr需要注意的是:
3.不能被替换为空,也就是末位那个参数不能是空字符串,当然空格是可以的。

再次举例strtr函数的另一种情况

 代码如下 复制代码

 <?php
echo strtr("I Loves you","Love","lOvEA");
?>

结果是

1 I lOvEs yOu

注意看第三个参数的A,在结果中并没有出现
4.我不建议用strtr以少换多

ok,既然这个strtr函数挺麻烦为什么还要用呢?
原因是,它的速度很快
据说,strtr 比 str_replace 快四倍
所以
5.能用strtr函数的时候一定要用

那怎么用才舒服?
这就是它的第二种情况
strtr(string,array)
6.strtr符合意愿的使用方法

 代码如下 复制代码
<?php
$table_change = array('you'=>'her sister');
echo strtr("I Love you",$table_change);
?>

结果为
I Love her sister

7.小技巧:你想到替换什么你就往数组加什么
比如

 代码如下 复制代码

<?php
$table_change = array('you'=>'her sister');
$table_change += array('Love' => 'hate');
echo strtr("I Love you",$table_change);
?>

结果是
I hate her sister

再次提醒那个Love 写成love 是行不通的哦。

ok,乱七八糟说了一通,其实关于strtr最想说的就是这个后面的用法了
简单方便。
貌似后面的用法也忽略掉了前后字符长度不同的问题

以上php strtr函数实验,PHP5.2 测试通过。

 

 代码如下 复制代码

<?php

//这个时候输出的为baicai而不是bai123cai,因为str("pao")<strlen("bai123")

echo strtr("paocai!","pao","bai123");

?>

 


实例2:当被替换的值长度小于被替换目标的时候

以下为引用的内容:

 代码如下 复制代码

<?php

//这个时候输出的为laocai而不是lacai,因为str("pao")>strlen("la")
 
echo strtr("paocai!","pao","la");
 
?>

 


实例3:支持数组替换

以下为引用的内容:

 代码如下 复制代码

<?php

$Arr=array('ao'=>'oa','ai'=>'ia');

echo strtr("paocai!",$Arr); //这个时候输出的为poacia

?>

 


其次是str_replace:

以下为引用的内容:

 代码如下 复制代码

<?php

echo str_replace("you","paocai","I love you!"); //会输出I love paocai!

?>


更多详细内容请查看:http://www.111cn.net/phper/18/strtr_str_replace.htm

本文章介绍了在php中浮点数四舍五入的两个常用的函数round与此同时ceil函数,可能小数保留位数。

round() 函数对浮点数进行四舍五入

语法

float round ( float val [, int precision] )

返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零(默认值)。


round() 例子

 代码如下 复制代码

<?php
echo round(3.4);             // 3
echo round(3.5);             // 4
echo round(3.6);             // 4
echo round(3.6, 0);         // 4
echo round(1.95583, 2);     // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2);     // 5.05
echo round(5.055, 2);     // 5.06
?>

ceil -- 进一法取整
说明
float ceil ( float value )
返回不小于 value 的下一个整数,value 如果有小数部分则进一位。ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。

例子 1. ceil() 例子

 代码如下 复制代码

<?php
echo ceil(4.3);     // 5
echo ceil(9.999);     // 10
?>

在写程序时发现在判断文件是否存在时,有两种写法,有的人用了is_file,有的人用了file_exists,用哪个更好或者说更合适呢?

判断文件存在用is_file还是file_exists?

在写程序时发现在判断文件是否存在时,有两种写法,有的人用了is_file,有的人用了file_exists,用哪个更好或者说更合适呢?

看了这篇PHP中file_exists与is_file,is_dir的区别的说法基本明白,PHP的 file_exists = is_dir + is_file。

写程序验证一下:

分别执行1000次,记录所需时间。

文件存在(当前目录)
is_file:0.4570ms
file_exists:2.0640ms

文件存在(绝对路径3层/www/hx/a/)
is_file:0.4909ms
file_exists:3.3500ms

文件存在(绝对路径5层/www/hx/a/b/c/)
is_file:0.4961ms
file_exists:4.2100ms

文件不存在(当前目录)
is_file:2.0170ms
file_exists:1.9848ms

文件不存在(绝对路径5层/www/hx/a/b/c/)
is_file:4.1909ms
file_exists:4.1502ms

目录存在
file_exists:2.9271ms
is_dir:0.4601ms
目录不存在
file_exists:2.9719ms
is_dir:2.9359ms

 

is_file($file)
file_exists($file)
当$file是目录时,is_file返回false,file_exists返回true


文件存在的情况下,is_file比file_exists要快得多;
要检测文件所在的目录越深,速度差越多,但至少快4倍。

文件不存在的情况下,is_file比file_exists要慢一点点,但可以忽略不计。

目录存在的情况下,is_dir比file_exists要快得多;
目录不存在的情况下,is_dir比file_exists要慢一点点,但可以忽略不计。

结论:
如果要判断文件是否存在,用函数 is_file(),
如果要判断目录是否存在,用函数 is_dir(),
好像没地方需要用file_exists了,不确定传入的参数是文件还是目录的时候用?

[!--infotagslink--]

相关文章

  • php正确禁用eval函数与误区介绍

    eval函数在php中是一个函数并不是系统组件函数,我们在php.ini中的disable_functions是无法禁止它的,因这他不是一个php_function哦。 eval()针对php安全来说具有很...2016-11-25
  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • Python astype(np.float)函数使用方法解析

    这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08
  • Python中的imread()函数用法说明

    这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中using的三种用法

    using 指令有两个用途: 允许在命名空间中使用类型,以便您不必限定在该命名空间中使用的类型。 为命名空间创建别名。 using 关键字还用来创建 using 语句 定义一个范围,将在此...2020-06-25
  • 金额阿拉伯数字转换为中文的自定义函数

    CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • php中的foreach函数的2种用法

    Foreach 函数(PHP4/PHP5)foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。...2013-09-28
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • PHP函数strip_tags的一个bug浅析

    PHP 函数 strip_tags 提供了从字符串中去除 HTML 和 PHP 标记的功能,该函数尝试返回给定的字符串 str 去除空字符、HTML 和 PHP 标记后的结果。由于 strip_tags() 无法实际验证 HTML,不完整或者破损标签将导致更多的数...2014-05-31
  • SQL Server中row_number函数的常见用法示例详解

    这篇文章主要给大家介绍了关于SQL Server中row_number函数的常见用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • PHP加密解密函数详解

    分享一个PHP加密解密的函数,此函数实现了对部分变量值的加密的功能。 加密代码如下: /* *功能:对字符串进行加密处理 *参数一:需要加密的内容 *参数二:密钥 */ function passport_encrypt($str,$key){ //加密函数 srand(...2015-10-30
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • C#中加载dll并调用其函数的实现方法

    下面小编就为大家带来一篇C#中加载dll并调用其函数的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#虚函数用法实例分析

    这篇文章主要介绍了C#虚函数用法,实例分析了C#中虚函数的功能与基本使用技巧,需要的朋友可以参考下...2020-06-25