PHP文件上传进度条基于Session与Javascript实现

 更新时间:2016年11月25日 15:44  点击:1783
如果你使用的是php5.4之前的就只能通过ajax,iframe或一些其它办法来实现,如果你使用的是php5.4我们可以使用session.upload_progress 来快速结合js实现文件上传进度条。


下面我们就详细介绍一下 PHP 5.4 的这个 session.upload_progress 新特性。

原理介绍
当浏览器向服务器端上传一个文件时,PHP将会把此次文件上传的详细信息(如上传时间、上传进度等)存储在session当中。然后,随着上传的进行,周期性的更新session中的信息。这样,浏览器端就可以使用Ajax周期性的请求一个服务器端脚本,由该脚本返回session中的进度信息;浏览器端的Javascript即可根据这些信息显示/更新进度条了。

那么,文件上传信息具体是如何存储的?我们要如何访问它呢?下面我们来详细说明。

PHP 5.4 中引入了一些配置项(在php.ini中进行设置)

session.upload_progress.enabled = "1"
session.upload_progress.cleanup = "1"
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq = "1%"
session.upload_progress.min_freq = "1"
其中enabled控制upload_progress功能的开启与否,默认开启;cleanup 则设置当文件上传的请求提交完成后,是否清除session的相关信息,默认开启。

prefix 和 name 两项用来设置进度信息在session中存储的变量名/键名。关于这两项的详细使用见下文。

freq 和 min_freq 两项用来设置服务器端对进度信息的更新频率。合理的设置这两项可以减轻服务器的负担。

在上传文件的表单中,需要为该次上传设置一个标识符,并在接下来的过程中使用该标识符来引用进度信息。具体的,在上传表单中需要有一个隐藏的input,它的name属性为php.ini中 session.upload_progress.name 的值;它的值为一个由你自己定义的标识符。如下:

<input type="hidden"
    name="<?php echo ini_get('session.upload_progress.name'); ?>"
    value="test" />
接到文件上传的表单后,PHP会在$_SESSION变量中新建键,键名是一个将session.upload_progress.prefix的值与上面你自定义的标识符连接后得到的字符串,可以这样得到:

$name = ini_get('session.upload_progress.name');
$key = ini_get('session.upload_progress.prefix') . $_POST[$name];

$_SESSION[$key]; // 这里就是此次文件上传的进度信息了
$_SESSION[$key]这个变量的结构是这样的:

$_SESSION["upload_progress_test"] = array(
 "start_time" => 1234567890,   // 开始时间
 "content_length" => 57343257, // POST请求的总数据长度
 "bytes_processed" => 453489,  // 已收到的数据长度
 "done" => false,              // 请求是否完成 true表示完成,false未完成

 // 单个文件的信息
 "files" => array(
  0 => array( ... ),
  // 同一请求中可包含多个文件
  1 => array( ... ),
 )
);这样,我们就可以使用其中的 content_length 和 bytes_processed 两项来得到进度百分比。

程序示例
原理介绍完了,下面我们来完整的实现一个基于PHP和Javascript的文件上传进度条。

本示例的代码仓库: Github: pureweber/samples/php-upload-progress

上传表单
首先,来编写我们的上传表单页面 index.php,代码如下:

<form id="upload-form"
    action="upload.php" method="POST" enctype="multipart/form-data"
    style="margin:15px 0" target="hidden_iframe">

        <input type="hidden" name="" value="test" />
        <p><input type="file" name="file1" /></p>
        <p><input type="submit" value="Upload" /></p>
</form>    

<iframe id="hidden_iframe" name="hidden_iframe" src="about:blank" style="display:none;"></iframe>

<div id="progress" class="progress" style="margin-bottom:15px;display:none;">
        <div class="bar" style="width:0%;"></div>
        <div class="label">0%</div>
</div>注意表单中的session.upload_progress.name隐藏项,值设置为了test。表单中仅有一个文件上传input,如果需要,你可以添加多个。

这里需要特别注意一下表单的target属性,这里设置指向了一个当前页面中的iframe。这一点很关键,通过设置target属性,让表单提交后的页面显示在iframe中,从而避免当前的页面跳转。因为我们还得在当前页面显示进度条呢。

#progress 这个div是用来显示进度条的。

注意 别忘了在index.php的最开始加上session_start()。

处理上传的文件
表单的action指向upload.php,我们在upload.php中处理上传的文件,将它转存到当前目录。这里与通常情况下的上传处理没有区别。

if(is_uploaded_file($_FILES['file1']['tmp_name'])){
        move_uploaded_file($_FILES['file1']['tmp_name'], "./{$_FILES['file1']['name']}");
}
?>Ajax获取进度信息
这一步是关键,我们需要建立一个 progress.php 文件,用来读取session中的进度信息; 然后我们在 index.php 中增加Javascript代码,向 progress.php 发起Ajax请求,然后根据获得的进度信息更新进度条。

progress.php 的代码如下:

session_start();

$i = ini_get('session.upload_progress.name');

$key = ini_get("session.upload_progress.prefix") . $_GET[$i];

if (!empty($_SESSION[$key])) {
        $current = $_SESSION[$key]["bytes_processed"];
        $total = $_SESSION[$key]["content_length"];
        echo $current < $total ? ceil($current / $total * 100) : 100;
}else{
        echo 100;
}
?>在这里我们获得$_SESSION变量中的进度信息,然后输出一个进度百分比。

在 index.php 中,我们将如下代码添加到页面底部 (为简便,这里使用jQuery):

function fetch_progress(){
        $.get('progress.php',{ '' : 'test'}, function(data){
                var progress = parseInt(data);

                $('#progress .label').html(progress + '%');
                $('#progress .bar').css('width', progress + '%');

                if(progress < 100){
                        setTimeout('fetch_progress()', 100);
                }else{
            $('#progress .label').html('完成!');
        }
        }, 'html');
}

$('#upload-form').submit(function(){
        $('#progress').show();
        setTimeout('fetch_progress()', 100);
});
当#upload-form被提交时,我们把进度条显示出来,然后反复调用 fetch_progress() 获得进度信息,并更新进度条,直到文件上传完毕,显示'完成!'。

Done!

完整代码见: Github: pureweber/samples/php-upload-progress

注意事项
input标签的位置
name为session.upload_progress.name的input标签一定要放在文件input <input type="file" /> 的前面。

取消上传
通过设置 $_SESSION[$key]['cancel_upload'] = true 可取消当次上传。但仅能取消正在上传的文件和尚未开始的文件。已经上传成功的文件不会被删除。

setTimeout vs. setInterval
应该通过 setTimeout() 来调用 fetch_progress(),这样可以确保一次请求返回之后才开始下一次请求。如果使用 setInterval() 则不能保证这一点,有可能导致进度条出现'不进反退'。

本文章来给各位同学介绍一下关于PHP判断字符串编码是否为utf-8的程序代码,如果你有兴趣不防进入参考。

我们以前常用mb_detect_encoding()此函数检测字符编码

 

 代码如下 复制代码
//判断字符串是什么编码
if ($tag === mb_convert_encoding(mb_convert_encoding($tag, "GB2312", "UTF-8"), "UTF-8", "GB2312")) {
}
else {//如果是gb2312 的就转换为utf8的
$tag = mb_convert_encoding($tag, 'UTF-8', 'GB2312');
}

 $keytitle = “%D0%BE%C6%AC”;时。检测结果却是UTF-8.这个bug其实不算是bug,写程序时也不应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性很大。
怎么解决呢,我的办法是:

 代码如下 复制代码

$encode = mb_detect_encoding($keytitle, array('ASCII','GB2312′,'GBK','UTF-8');

个参数分别是:被检测的输入变量、编码方式的检测顺序(一旦为真,后面自动忽略)、strict模式
对编码检测的顺序进行调整,将最大可能性放在前面,这样减少被错误转换的机会。

上面办法还是解决不了,下面又找到了一个解决方法。

例1

 代码如下 复制代码

// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($word)
{
if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$word) == true)
{
return true;
}
else
{
return false;
}
} // function is_utf8

本文章来给各位同学介绍一下关于微信公众平台之CURL应用实例,如果你碰到此类问题不防进入参考一下吧。

这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支持很多的协议HTPP,HTTPS,FTP….等等很多协议,在做采集和模拟用户来执行一些操作的时候非常有用的。
使用CURL主要是四个步骤:
1、初始化URL
2、设置请求的一些参数(COOKIE,HEAD…)
3、执行请求
4、关闭资源
先说一个简单的采集,一般在获取一个网页的内容的时候我们最方便就是使用file_get_contents()函数来获取,现在我们通过CURL来抓取一个网页的内容

 代码如下 复制代码

$ch = curl_init();//初始化一个资源
       curl_setopt($ch,CURLOPT_URL,”http://www.mapenggang.com”);//设置我们要获取的网页
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//关闭直接输出
       $string= curl_exec($ch);
       curl_close($ch);


注:重点在于curl_setopt()这个函数的第二个参数(下面会有一些常用的资料)
这样我们就可以得到这个网页的内容,如果只有CURL来做些这就大材小用了,CURL其实可以用来做更加神奇的东西。
最近刚到一家创业型的新公司(尼玛,选择这个公司真的是比较纠结,因为手里有好几个offer,但是这边给的工资待遇很低,因为创业型公司吗。我也不知道为什么会选择这家公司,反正是为了选择这家公司,朋友都很不解,其实我也不知道为什么会选择这家,其他公司的工资大概是这家公司的两倍,希望这次没有选错,不然.想死的心都会有,说了这么多废话),做的是现在比较火的微信公众平台的开发,因为微信现在开放的接口特别的少,所以通过接口得到的东西特别的少(尼玛,小马哥你什么时候多放的借口啊!),但是官方提供的操作平台有很多接口中没有数据所以,我们需要去自己去找一些数据了,好吧,主角上场CURL。

首先公众平台是要登录才能访问,那我就先登录吧(废话),首先需要抓包分析一下正常提交数据,这里我就不截图了(博客在bae平台上,编辑器还没有时间去理他,不太好使),通过抓包分析得出,微信的公众平台使用的是ajax登录,且密码在提交之前已经进行了md5加密(好像正规应该叫md5散列把,而且标准的MD5散列应该是128位的,不过为了方便存储和传输就现在最多的就是32和16位了,刚了解,惭愧),还有很重要一点就是,微信公众平台采用的是https协议进行登录的。最爽的一点就是不用验证码,sogay。不然老费劲了,分析到这就可以了。Come on !!!!

 代码如下 复制代码


$password = md5($password);//因为刚才抓包发现是md5加密过的,所以这里我们提前把密码加密号


$post = "username={$username}&pwd={$password}&f=json&imgcode=";
$loginUrl = "https://mp.weixin.qq.com/cgi-bin/login?";//微信登录的地址

//这里的头信息都是必须要设置的,这些你都可以在刚才抓包的时候获取到


$headerArray = array(
'Accept:application/json, text/javascript, */*',
'Content-Type:application/x-www-form-urlencoded',
'Referer:https://mp.weixin.qq.com/'
);

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$loginUrl);
// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// 从证书中检查SSL加密算法是否存在
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//关闭直接输出
curl_setopt($ch,CURLOPT_POST,1);//使用post提交数据
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);//设置 post提交的数据
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36');//设置用户代理
curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);//设置头信息

curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);//设置cookie的保存目录,这里很重要,你懂的(cookie你都不存,你以为你是麻花腾啊!)
$loginData = curl_exec($ch);//这里会返回token,需要处理一下。

//获取到token的值

$loginData = json_decode($loginData,true);

$token = explode("=",$loginData['ErrMsg']);

$token = array_pop($token);

echo "登录微信系统成功<br />";


curl_close($ch);


 

上边就是登录微信公众平台的代码了,经测试十分好用+_+。
这几天微信公众平台接触的比较多,这个只是万里长征的第一步,后边我会分享一下如何将微信的fakeid 和 openid对应起来,实现自己可以自己的平台上显示用户的完整信息(据我了解,网上现在对于如何fakeid 和 openid对应来没有很好的解决方案,通过好几天的奋斗现在已经可以对应起来的,比较麻烦,且已有的用户是无法对起来的(其实这个理论上是可以的,但是没有做出来不乱说,其实是没有时间去做这个,有机会可以尝试,不过实现需要已有系统的支持,也就是你现在的系统必须记录了和用回的聊天记录(我说什么了?我什么都没有说!)))。
体育老师啊,你说你不好好带你的体育课,没有跑来教我们语文,这几天接触不少能写的东西太多了,所以想到那就写到那了,有点乱,几天主要用的是CURL,所以今天说点CURL的实例,正好就把手头的登录微信公众平台的东西写上来了,CURL到此结束,后边我可能会写更多关于微信公众平台的东西。
附:

选项

可选value

备注

CURLOPT_AUTOREFERER

当根据Location:重定向时,自动设置header中的Referer:信息。

 

CURLOPT_BINARYTRANSFER

在启用CURLOPT_RETURNTRANSFER的时候,返回原生的(Raw)输出。

 

CURLOPT_COOKIESESSION

启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下cURL会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie

 

CURLOPT_CRLF

启用时将Unix的换行符转换成回车换行符。

 

CURLOPT_DNS_USE_GLOBAL_CACHE

启用时会启用一个全局的DNS缓存,此项为线程安全的,并且默认启用。

 

CURLOPT_FAILONERROR

显示HTTP状态码,默认行为是忽略编号小于等于400HTTP信息。

 

CURLOPT_FILETIME

启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的CURLINFO_FILETIME选项返回。 curl_getinfo().

 

CURLOPT_FOLLOWLOCATION

启用时会将服务器服务器返回的"Location: "放在header中递归的返回给服务器,使用CURLOPT_MAXREDIRS可以限定递归返回的数量。

 

CURLOPT_FORBID_REUSE

在完成交互以后强迫断开连接,不能重用。

 

CURLOPT_FRESH_CONNECT

强制获取一个新的连接,替代缓存中的连接。

 

CURLOPT_FTP_USE_EPRT

启用时当FTP下载时,使用EPRT (LPRT)命令。设置为FALSE时禁用EPRTLPRT,使用PORT命令 only.

 

CURLOPT_FTP_USE_EPSV

启用时,在FTP传输过程中回复到PASV模式前首先尝试EPSV命令。设置为FALSE时禁用EPSV命令。

 

CURLOPT_FTPAPPEND

启用时追加写入文件而不是覆盖它。

 

CURLOPT_FTPASCII

CURLOPT_TRANSFERTEXT的别名。

 

CURLOPT_FTPLISTONLY

启用时只列出FTP目录的名字。

 

CURLOPT_HEADER

启用时会将头文件的信息作为数据流输出。

 

CURLINFO_HEADER_OUT

启用时追踪句柄的请求字符串。

PHP 5.1.3 开始可用。CURLINFO_前缀是故意的(intentional)

CURLOPT_HTTPGET

启用时会设置HTTPmethodGET,因为GET是默认是,所以只在被修改的情况下使用。

 

CURLOPT_HTTPPROXYTUNNEL

启用时会通过HTTP代理来传输。

 

CURLOPT_MUTE

启用时将cURL函数中所有修改过的参数恢复默认值。

 

CURLOPT_NETRC

在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。

 

CURLOPT_NOBODY

启用时将不对HTML中的BODY部分进行输出。

 

CURLOPT_NOPROGRESS

启用时关闭curl传输的进度条,此项的默认设置为启用。

Note:PHP自动地设置这个选项为TRUE,这个选项仅仅应当在以调试为目的时被改变。

 

 

CURLOPT_NOSIGNAL

启用时忽略所有的curl传递给php进行的信号。在SAPI多线程传输时此项被默认启用。

cURL 7.10时被加入。

CURLOPT_POST

启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。

 

CURLOPT_PUT

启用时允许HTTP发送文件,必须同时设置CURLOPT_INFILECURLOPT_INFILESIZE

 

CURLOPT_RETURNTRANSFER

curl_exec()获取的信息以文件流的形式返回,而不是直接输出。

 

CURLOPT_SSL_VERIFYPEER

禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE

cURL 7.10开始默认为TRUE。从cURL 7.10开始默认绑定安装。

CURLOPT_TRANSFERTEXT

启用后对FTP传输使用ASCII模式。对于LDAP,它检索纯文本信息而非HTML。在Windows系统上,系统不会把STDOUT设置成binary模式。

 

CURLOPT_UNRESTRICTED_AUTH

在使用CURLOPT_FOLLOWLOCATION产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。

 

CURLOPT_UPLOAD

启用后允许文件上传。

 

CURLOPT_VERBOSE

启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。

 

对于下面的这些option的可选参数,value应该被设置一个integer类型的值:

 

选项

可选value

备注

CURLOPT_BUFFERSIZE

每次获取的数据中读入缓存的大小,但是不保证这个值每次都会被填满。

cURL 7.10中被加入。

CURLOPT_CLOSEPOLICY

不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个CURLCLOSEPOLICY_,但是cURL暂时还不支持。

 

CURLOPT_CONNECTTIMEOUT

在发起连接前等待的时间,如果设置为0,则无限等待。

 

CURLOPT_CONNECTTIMEOUT_MS

尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。

cURL 7.16.2中被加入。从PHP 5.2.3开始可用。

CURLOPT_DNS_CACHE_TIMEOUT

设置在内存中保存DNS信息的时间,默认为120秒。

 

CURLOPT_FTPSSLAUTH

FTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)CURLFTPAUTH_TLS (首先尝试TLS)CURLFTPAUTH_DEFAULT (cURL自动决定)

cURL 7.12.2中被加入。

CURLOPT_HTTP_VERSION

CURL_HTTP_VERSION_NONE(默认值,让cURL自己判断使用哪个版本)CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)

 

CURLOPT_HTTPAUTH

使用的HTTP验证方法,可选的值有:CURLAUTH_BASICCURLAUTH_DIGESTCURLAUTH_GSSNEGOTIATECURLAUTH_NTLMCURLAUTH_ANYCURLAUTH_ANYSAFE。 可以使用|位域()操作符分隔多个值,cURL让服务器选择一个支持最好的值。CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM. CURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

 

CURLOPT_INFILESIZE

设定上传文件的大小限制,字节(byte)为单位。

 

CURLOPT_LOW_SPEED_LIMIT

当传输速度小于CURLOPT_LOW_SPEED_LIMIT(bytes/sec)PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

 

CURLOPT_LOW_SPEED_TIME

当传输速度小于CURLOPT_LOW_SPEED_LIMIT(bytes/sec)PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

 

CURLOPT_MAXCONNECTS

允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。

 

CURLOPT_MAXREDIRS

指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

 

CURLOPT_PORT

用来指定连接端口。(可选项)

 

CURLOPT_PROTOCOLS

CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS. 可用的协议选项为:CURLPROTO_HTTPCURLPROTO_HTTPSCURLPROTO_FTPCURLPROTO_FTPSCURLPROTO_SCPCURLPROTO_SFTPCURLPROTO_TELNETCURLPROTO_LDAPCURLPROTO_LDAPSCURLPROTO_DICTCURLPROTO_FILECURLPROTO_TFTPCURLPROTO_ALL

cURL 7.19.4中被加入。

CURLOPT_PROXYAUTH

HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASICCURLAUTH_NTLM当前被支持。

cURL 7.10.7中被加入。

CURLOPT_PROXYPORT

代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。

 

CURLOPT_PROXYTYPE

不是CURLPROXY_HTTP (默认值) 就是CURLPROXY_SOCKS5

cURL 7.10中被加入。

CURLOPT_REDIR_PROTOCOLS

CURLPROTO_*中的位域值。如果被启用,位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILESCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量,请参照CURLOPT_PROTOCOLS

cURL 7.19.4中被加入。

CURLOPT_RESUME_FROM

在恢复传输时传递一个字节偏移量(用来断点续传)。

 

CURLOPT_SSL_VERIFYHOST

1 检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)2 检查公用名是否存在,并且是否与提供的主机名匹配。

 

CURLOPT_SSLVERSION

使用的SSL版本(2 3)。默认情况下PHP会自己检测这个值,尽管有些情况下需要手动地进行设置。

 

CURLOPT_TIMECONDITION

如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADERtrue,则返回一个"304 Not Modified"headerCURLOPT_HEADERfalse,则使用CURL_TIMECOND_IFUNMODSINCE,默认值为CURL_TIMECOND_IFUNMODSINCE

 

CURLOPT_TIMEOUT

设置cURL允许执行的最长秒数。

 

CURLOPT_TIMEOUT_MS

设置cURL允许执行的最长毫秒数。

cURL 7.16.2中被加入。从PHP 5.2.3起可使用。

CURLOPT_TIMEVALUE

设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

 

对于下面的这些option的可选参数,value应该被设置一个string类型的值:

 

选项

可选value

备注

CURLOPT_CAINFO

一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 .

 

CURLOPT_CAPATH

一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。

 

CURLOPT_COOKIE

设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")

 

CURLOPT_COOKIEFILE

包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。

 

CURLOPT_COOKIEJAR

连接结束后保存cookie信息的文件。

 

CURLOPT_CUSTOMREQUEST

使用一个自定义的请求信息来代替"GET""HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET""POST""CONNECT"等等。也就是说,不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0rnrn"是不正确的。

Note: 在确定服务器支持这个自定义请求的方法前不要使用。

 

 

CURLOPT_EGDSOCKET

类似CURLOPT_RANDOM_FILE,除了一个Entropy Gathering Daemon套接字。

 

CURLOPT_ENCODING

HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity""deflate""gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。

cURL 7.10中被加入。

CURLOPT_FTPPORT

这个值将被用来获取供FTP"POST"指令所需要的IP地址。"POST"指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的IP地址。

 

CURLOPT_INTERFACE

网络发送接口名,可以是一个接口名、IP地址或者是一个主机名。

 

CURLOPT_KRB4LEVEL

KRB4 (Kerberos 4) 安全级别。下面的任何值都是有效的(从低到高的顺序)"clear""safe""confidential""private".。如果字符串和这些都不匹配,将使用"private"。这个选项设置为NULL时将禁用KRB4 安全认证。目前KRB4 安全认证只能用于FTP传输。

 

CURLOPT_POSTFIELDS

全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&…'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data

 

CURLOPT_PROXY

HTTP代理通道。

 

CURLOPT_PROXYUSERPWD

一个用来连接到代理的"[username]:[password]"格式的字符串。

 

CURLOPT_RANDOM_FILE

一个被用来生成SSL随机数种子的文件名。

 

CURLOPT_RANGE

"X-Y"的形式,其中XY都是可选项获取数据的范围,以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如"X-Y,N-M"

 

CURLOPT_REFERER

HTTP请求头中"Referer: "的内容。

 

CURLOPT_SSL_CIPHER_LIST

一个SSL的加密算法列表。例如RC4-SHATLSv1都是可用的加密列表。

 

CURLOPT_SSLCERT

一个包含PEM格式证书的文件名。

 

CURLOPT_SSLCERTPASSWD

使用CURLOPT_SSLCERT证书需要的密码。

 

CURLOPT_SSLCERTTYPE

证书的类型。支持的格式有"PEM" (默认值), "DER""ENG"

cURL 7.9.3中被加入。

CURLOPT_SSLENGINE

用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。

 

CURLOPT_SSLENGINE_DEFAULT

用来做非对称加密操作的变量。

 

CURLOPT_SSLKEY

包含SSL私钥的文件名。

 

CURLOPT_SSLKEYPASSWD

CURLOPT_SSLKEY中指定了的SSL私钥的密码。

Note: 由于这个选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。

 

 

CURLOPT_SSLKEYTYPE

CURLOPT_SSLKEY中规定的私钥的加密类型,支持的密钥类型为"PEM"(默认值)"DER""ENG"

 

CURLOPT_URL

需要获取的URL地址,也可以在curl_init()函数中设置。

 

CURLOPT_USERAGENT

HTTP请求中包含一个"User-Agent: "头的字符串。

 

CURLOPT_USERPWD

传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"

如果你是一个seo工作者你估计要求把php文件全部转换成html页面了,这样可以对网站排名有好处,同时也可以减轻服务器apache负载了,下面我来介绍一个php生成静态页面实例。

addform.php文件

 代码如下 复制代码


  <form action="add.php" method="post" >
   新闻标题:
  <input type="text" name="title" /><br>
  新闻内容:<br>
  <textarea name="content" rows="10" cols="50" >

  </textarea><br>

  <input type="submit" name="submit" value="提交"/>

  </form>

add.php文件

 代码如下 复制代码

<?php
require_once("mysql_inc.php"); //引用conn.php,连接数据库

$title=$_POST['title'];
$content=$_POST['content']; //获得表单变量


//以下建立一文本文档,其值自动计数
$countfile="count.txt";
if(!file_exists($countfile))
{
fopen($countfile,"w"); //如果此文件不存在,则自动建立一个
}
$fp=fopen($countfile,"r");
$num=fgets($fp,20);
$num=$num+1; //每次其值自动加一
fclose($fp);
$fp=fopen($countfile,"w");
fwrite($fp,$num); //更新其值
fclose($fp);


//利用上面自动计数的值获得HTML的路径$path
$houzui=".html";
$path=$num.$houzui;
//这样形成的路径是自动增长的,如1.html,2.html,3.html……….添加一条新闻便自动加上1

//以下用SQL语句添加数据至表 news
$sql="insert into news (id,title,content,path) values ('','".$title."','".$content."','".$path."')";
$query=mysql_query($sql);

//以下为关键之处,把从表单获得的数据替换模板中的{title},{content}标记
$fp=fopen("mode.html","r"); //只读打开模板
$str=fread($fp,filesize("mode.html"));//读取模板中内容
$str=str_replace("{title}",$title,$str);
$str=str_replace("{content}",$content,$str);//替换内容
fclose($fp);

$handle=fopen($path,"w"); //写入方式打开新闻路径
fwrite($handle,$str); //把刚才替换的内容写进生成的HTML文件
fclose($handle);


//收尾工作:
echo "<a href=$path target=_blank>查看刚才添加的新闻</a>";


mysql_inc.php数据库连接文件

 代码如下 复制代码

<?php
   class mysql{


     private $host;//�����
     private $name;//�û���
     private $pass;//����
     private $database;//��ݿ���
     private $ut;//���뷽ʽ

 

     function __construct($host,$name,$pass,$database,$ut){
      $this->host=$host;
      $this->name=$name;
      $this->pass=$pass;
      $this->database=$database;
      $this->ut=$ut;
      $this->connect();

     }


     function connect(){
      $link=mysql_connect($this->host,$this->name,$this->pass) or die ($this->error());
      mysql_select_db($this->database,$link) or die("û����ݿ⣺".$this->database);
      mysql_query("SET NAMES '$this->ut'");
     }

 function query($sql, $type = '') {
     if(!($query = mysql_query($sql))) $this->show('Say:', $sql);
     return $query;
 }

    function show($message = '', $sql = '') {
  if(!$sql) echo $message;
  else echo $message.'<br>'.$sql;
 }

    function affected_rows() {
  return mysql_affected_rows();
 }

 function result($query, $row) {
  return mysql_result($query, $row);
 }

 function num_rows($query) {
  return @mysql_num_rows($query);
 }

 function num_fields($query) {
  return mysql_num_fields($query);
 }

 function free_result($query) {
  return mysql_free_result($query);
 }

 function insert_id() {
  return mysql_insert_id();
 }

 function fetch_row($query) {
  return mysql_fetch_row($query);
 }

 function version() {
  return mysql_get_server_info();
 }

 function close() {
  return mysql_close();
 }

 

 

      function htmtocode($content){
     $content=str_replace("n","<br>",str_replace(" ","&nbsp",$content));
     return $content;
     }
   }

   $db=new mysql("localhost","root","","database","utf8");

 

 


?>

以前我要验证身份证我们多半会使用正则判断用户输入是不是15位或18位的全数字,然后来判断身份证是否合法了,这种方法只是最基础的,下面提供的这个身份证验证,可以识别真假身份证哦。
 代码如下 复制代码

<?php
$IDCard = new IDCard();
var_dump($IDCard::isCard($_GET['card']));
 
/**
 * 身份证处理类
 */
class IDCard {
 
    //检证身份证是否正确
    public static function isCard($card) {
        $card = self::to18Card($card);
        if (strlen($card) != 18) {
            return false;
        }
 
        $cardBase = substr($card, 0, 17);
 
        return (self::getVerifyNum($cardBase) == strtoupper(substr($card, 17, 1)));
    }
 
 
    //格式化15位身份证号码为18位
    public static function to18Card($card) {
        $card = trim($card);
 
        if (strlen($card) == 18) {
            return $card;
        }
 
        if (strlen($card) != 15) {
            return false;
        }
 
        // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
        if (array_search(substr($card, 12, 3), array('996', '997', '998', '999')) !== false) {
            $card = substr($card, 0, 6) . '18' . substr($card, 6, 9);
        } else {
            $card = substr($card, 0, 6) . '19' . substr($card, 6, 9);
        }
        $card = $card . self::getVerifyNum($card);
        return $card;
    }
 
    // 计算身份证校验码,根据国家标准gb 11643-1999
    private static function getVerifyNum($cardBase) {
        if (strlen($cardBase) != 17) {
            return false;
        }
        // 加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 
        // 校验码对应值
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
 
        $checksum = 0;
        for ($i = 0; $i < strlen($cardBase); $i++) {
            $checksum += substr($cardBase, $i, 1) * $factor[$i];
        }
 
        $mod = $checksum % 11;
        $verify_number = $verify_number_list[$mod];
 
        return $verify_number;
    }
}
 
?>
[!--infotagslink--]

相关文章

  • 使用PHP+JavaScript将HTML页面转换为图片的实例分享

    这篇文章主要介绍了使用PHP+JavaScript将HTML元素转换为图片的实例分享,文后结果的截图只能体现出替换的字体,也不能说将静态页面转为图片可以加快加载,只是这种做法比较interesting XD需要的朋友可以参考下...2016-04-19
  • 关于JavaScript中name的意义冲突示例介绍

    在昨天的《Javascript权威指南》学习笔记之十:ECMAScript 5 增强的对象模型一文中,对于一段代码的调试出现了一个奇怪现象,现将源代码贴在下面: 复制代码 代码如下: <script type="text/javascript"> function Person(){}...2014-05-31
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • javascript自定义的addClass()方法

    复制代码 代码如下: //element:需要添加新样式的元素,value:新的样式 function addClass(element, value ){ if (!element.className){ element.className = value; }else { newClassName = element.className; newClas...2014-05-31
  • JavaScript中的this关键字使用方法总结

    在javascritp中,不一定只有对象方法的上下文中才有this, 全局函数调用和其他的几种不同的上下文中也有this指代。 它可以是全局对象、当前对象或者任意对象,这完全取决于函数的调用方式。JavaScript 中函数的调用有以下...2015-03-15
  • 详解javascript数组去重问题

    首先,我想到的是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。于是乎,我写出了如下代码A: Array.prototype.clearRepetitionA = function(){ var resul...2015-11-08
  • JavaScript预解析,对象详解

    这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
  • javascript的事件触发器介绍的实现

    事件触发器从字面意思上可以很好的理解,就是用来触发事件的,但是有些没有用过的朋友可能就会迷惑了,事件不是通常都由用户在页面上的实际操作来触发的吗?这个观点不完全正确,因为有些事件必须由程序来实现,如自定义事件,jQue...2014-06-07
  • JavaScript中逗号运算符介绍及使用示例

    有一道js面试题,题目是这样的:下列代码的执行结果是什么,为什么? 复制代码 代码如下: var i, j, k; for (i=0, j=0; i<10, j<6; i++, j++) { k = i+j; } document.write(k); 答案是显示10,这道题主要考察JavaScript的逗...2015-03-15
  • JavaScript学习笔记整理_setTimeout的应用

    下面小编就为大家带来一篇JavaScript学习笔记整理_setTimeout的应用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-03
  • Javascript类型转换的规则实例解析

    这篇文章主要介绍了Javascript类型转换的规则实例解析,涉及到javascript类型转换相关知识,对本文感兴趣的朋友一起学习吧...2016-02-27
  • 详解JavaScript操作HTML DOM的基本方式

    通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。 HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。 HTML DOM 模型被构造为对象的树: 通过可编程的对象模型,Java...2015-10-23
  • ActiveX控件与Javascript之间的交互示例

    1、ActiveX向Javascript传参 复制代码 代码如下: <script language="javascript" for="objectname" event="fun1(arg)"> fun2(arg); </script> objectname为ActiveX控件名,通过<object>标签里的id属性设定,如下; 复制...2014-06-07
  • JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍

    下面小编就为大家带来一篇JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20
  • JavaScript获取浏览器信息的方法

    Window有navigator对象让我们得知浏览器的全部信息.我们可以利用一系列的API函数得知浏览器的信息.JavaScript代码如下:function message(){ txt = "<p>浏览器代码名: " + navigator.appCodeName + "</p>";txt+= "<p>...2015-11-24
  • 学习JavaScript设计模式之装饰者模式

    这篇文章主要为大家介绍了JavaScript设计模式中的装饰者模式,对JavaScript设计模式感兴趣的小伙伴们可以参考一下...2016-01-21
  • javascript设计模式之解释器模式详解

    神马是“解释器模式”?先翻开《GOF》看看Definition:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。在开篇之前还是要科普几个概念: 抽象语法树: 解释器模式并未解释如...2014-06-07
  • 跟我学习javascript的最新标准ES6

    虽然ES6都还没真正发布,但已经有用ES6重写的程序了,各种关于ES789的提议已经开始了,这你敢信。潮流不是我等大众所能追赶的。潮流虽然太快,但我们不停下学习的步伐,就不会被潮流丢下的,下面来领略下ES6中新特性,一堵新生代JS...2015-11-24
  • Php文件上传类class.upload.php用法示例

    本文章来人大家介绍一个php文件上传类的使用方法,期望此实例对各位php入门者会有不小帮助哦。 简介 Class.upload.php是用于管理上传文件的php文件上传类, 它可以帮...2016-11-25
  • 详解JS中的compose函数和pipe函数用法

    这篇文章主要介绍了JS中的compose函数和pipe函数用法,想深入了解Javascript的同学,可以参考下...2021-04-27