PHP多线程(pthreads)参数传递学习笔记

 更新时间:2016年11月25日 15:42  点击:1969
PHP多线程编程中可以通过Thread,Worker的构造方法传递变量到线程,也可以通过线程的public属性或public方法实现,经研究发现都是通过serialize()和unserialize()实现传递,这样就会造成几个问题:

测试环境

OS: win7 64
PHP: 5.4.25 ts
pthreads: 0.1.0


1.性能问题

2.PDO等某些类型不能serialize所以就不能传递到线程。
这两个问题是能通过其他凡是解决的,解决方法仁者见仁智者见智。

另外,可以通过传递匿名函数到线程中,但是有个bug,匿名函数不能赋值给线程中的属性,导致传递的匿名函数只能在线程的构造方法中才能使用(call_user_fun*系列函数调用)。

Thread属性定义一定要注意必须在构造方法中初始化,否则必定为null。__construct()和run()里面的代码不在一个次元,如果属性不是PHP标量在run()中不能修改,例如构造方法中初始化一个对象,然后run()中修改对象属性不会生效。

正确写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished;
 public $terminated;
 protected $id;
 public $terminate;
 public function __construct($id) {
  $this->id = $id;
  $this->terminated = true;
  $this->finished = false;
  $this->terminate = false;
 }
}

错误写法:

 代码如下 复制代码

abstract class Task extends Thread {
 private $finished=false;
 public $terminated=false;
 protected $id;// www.111cn.net
 public $terminate=false;
 public function __construct($id) {
  $this->id = $id;
 }
}


这样也是错的,无论stdClass还是数组

 代码如下 复制代码
abstract class Task extends Thread {
 private $info;
 public function __construct($task) {
  $this->info = array();
  $this->info ['task'] = $task;
  $this->info ['finished'] = false;
  $this->info ['terminate'] = false;
  $this->info ['terminated'] = false;
  $this->info ['error'] = false;
  $this->info ['info'] = array ();
 }
}


后来研究又发现,复合类型的数据整体赋值貌似能起作用。

如果程序有很多回调函数在线程内部用的话就是找死啊。

 

闲来蛋疼,看了几个短网址API服务,于是把它们整理出来,方便以后使用。目前,提供靠谱的短网址API接口的公司不多(谷歌、百度、新浪微博、网易等),而像腾讯微博、淘宝这几个巨头的短网址服务都是仅供内部使用。

1 谷歌、百度、网易、新浪短网址服务的API比较

百度短网址API接口完全对外开放,用户不需申请其开放平台的APPKEY,也不用采用OAuth的协议,因此相对简单方便;谷歌的短网址API接口有两种形式,一种类似于百度无需进行繁复的OAuth认证,不过限制比多;另一种是采用GAE平台OAuth2.0的认证方式,限制较少。新浪微博的短网址API接口服务也类似于谷歌,第一种只需要取得新浪微博开放平台的APPKEY即可使用,第二种是采用OAuth2.0认证的方式。网易只提供类似于新浪微博提供的第二种API接口调用方式,即需要申请APPKEY,不过申请非常容易通过,这点不同于新浪微博。值得一提的是,经博主测试,网易的短网址API接口貌似有bug。最终三个接口的测试效果如下图所示:

百度网易新浪微博短网址API接口
2 PHP实现百度短网址API接口调用

百度短网址的API接口封装不是很好,需要针对长网址转短网址和短网址转长网址请求不同的页面(create.php和query.php),另外官方的示例程序也有错误。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用百度短网址API接口
    *     * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function bdUrlAPI($type, $url){
    if($type)
    $baseurl = 'http://dwz.cn/create.php';
    else
    $baseurl = 'http://dwz.cn/query.php';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('url'=>$url);
    else
    $data=array('tinyurl'=>$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status']!=0)
    {
    echo 'ErrorCode: ['.$arrResponse['status'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['err_msg'])."]<br/>";
    return 0;
    }
    if($type)
    return $arrResponse['tinyurl'];
    else
    return $arrResponse['longurl'];
    }
    echo '<br/><br/>----------百度短网址API----------<br/><br/>';
    echo 'Long to Short: '.bdUrlAPI(1, 'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.bdUrlAPI(0, 'http://dwz.cn/evlhW').'<br/><br/>';
    ?>

3 PHP实现网易短网址API接口调用

网易短网址API接口

用户首先需要申请一个appkey,申请地址是http://126.am/,登录进去即可申请,并且很快得到审核。不过,经过测试发现一个bug:用接口生成的短网址无法通过API接口还原为之前的长网址,提示“NOT_MATCH”(对应的官方说明是:Key和短地址不匹配,无法还原)。但是如上图所示,如果在http://126.am/user.action的页面生成的短网址却能够通过API还原为原来的长网址。

   

 代码如下 复制代码
<?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用网易短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function wyUrlAPI($type,$url){
    if($type)
    $baseurl = 'http://126.am/api!shorten.action';
    else
    $baseurl = 'http://126.am/api!expand.action';
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '4f0c04771d4e40b4945afcfdc0337e3d';
    $ch=curl_init();
    curl_setopt($ch,CURLOPT_URL,$baseurl);
    curl_setopt($ch,CURLOPT_POST,true);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    if($type)
    $data=array('longUrl'=>$url,'key'=>$key);
    else
    $data=array('shortUrl'=>$url,'key'=>$key);
    curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if($arrResponse['status_code']!=200)
    {
    echo 'ErrorCode: ['.$arrResponse['status_code'].'] ErrorMsg: ['.iconv('UTF-8','GBK',$arrResponse['status_txt'])."]<br/>";
    return 0;
    }
    return $arrResponse['url'];
    }
    echo '<br/><br/>----------网易短网址API----------<br/><br/>';
    echo 'Long to Short: '.wyUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.wyUrlAPI(0,'http://126.am/huangky').'
    ';
    echo 'Short to Long: '.wyUrlAPI(0,'126.am/XRYsJ2').'<br/><br/>';
    ?>

4 PHP实现新浪微博短网址API接口调用

同样,用户首先需要申请一个新浪微博开放平台的appkey,申请地址是http://open.t.sina.com.cn/,不过审核相对严格而且比较慢。新浪微博短网址API接口有两种实现方式,第一种是原始的OAuth1.0的验证方式,比较简单,无需申请token,第二种是OAuth2.0的验证方式,这个需要access_token(虽然官方文档http://t.cn/8FgFoL8说可以像第一种那样直接通过appkey验证,但是测试不成功)。因此下面的示例采用的是第一种方式,即直接通过appkey验证。

 代码如下 复制代码

 

    <?php
    /**
    * @author: vfhky 20130304 20:10
    * @description: PHP调用新浪短网址API接口
    *    * @param string $type: 非零整数代表长网址转短网址,0表示短网址转长网址
    */
    function xlUrlAPI($type,$url){
    /* 这是我申请的APPKEY,大家可以测试使用 */
    $key = '1562966081';
    if($type)
    $baseurl = 'http://api.t.sina.com.cn/short_url/shorten.json?source='.$key.'&url_long='.$url;
    else
    $baseurl = 'http://api.t.sina.com.cn/short_url/expand.json?source='.$key.'&url_short='.$url;
    $ch=curl_init();
    curl_setopt($ch, CURLOPT_URL,$baseurl);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_TIMEOUT, 15);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $strRes=curl_exec($ch);
    curl_close($ch);
    $arrResponse=json_decode($strRes,true);
    if (isset($arrResponse->error) || !isset($arrResponse[0]['url_long']) || $arrResponse[0]['url_long'] == '')
    return 0;
    if($type)
    return $arrResponse[0]['url_short'];
    else
    return $arrResponse[0]['url_long'];
    }
    echo '<br/><br/>----------新浪短网址API----------<br/><br/>';
    echo 'Long to Short: '.xlUrlAPI(1,'http://www.111cn.net').'<br/>';
    echo 'Short to Long: '.xlUrlAPI(0,'http://t.cn/8FdW1rm').'<br/><br/>';
    ?>

5 后记

综上,百度的短网址API相对方便,而且限制较少;新浪和网易的API接口相对麻烦;网易的短网址API是唯一具备API请求统计功能的,但很容易受到“请求过于频繁而遭到REQUEST_LIMIT”。另外,对于任何API接口的调试工作,一定要使用其接口提供的错误信息,例如上面百度接口的$arrResponse['status']字段、网易的$arrResponse['status_code']字段。

原文转自:http://www.huangkeye.cn/web/php/839.html

 

初学php时就知道利用替换函数来替换指定的数字,但要替换指定位置我们需要简单处理一下才行,下面我介绍几个例子把指定位星号显示出来。

例子,用户名

 代码如下 复制代码

function cut_str($string, $sublen, $start = 0, $code = 'UTF-8')
{
    if($code == 'UTF-8')
    {
        $pa = "/[x01-x7f]|[xc2-xdf][x80-xbf]|xe0[xa0-xbf][x80-xbf]|[xe1-xef][x80-xbf][x80-xbf]|xf0[x90-xbf][x80-xbf][x80-xbf]|[xf1-xf7][x80-xbf][x80-xbf][x80-xbf]/";
        preg_match_all($pa, $string, $t_string);

        if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen));
        return join('', array_slice($t_string[0], $start, $sublen));
    }
    else
    {
        $start = $start*2;
        $sublen = $sublen*2;
        $strlen = strlen($string);
        $tmpstr = '';www.111cn.Net

        for($i=0; $i< $strlen; $i++)
        {
            if($i>=$start && $i< ($start+$sublen))
            {
                if(ord(substr($string, $i, 1))>129)
                {
                    $tmpstr.= substr($string, $i, 2);
                }
                else
                {
                    $tmpstr.= substr($string, $i, 1);
                }
            }
            if(ord(substr($string, $i, 1))>129) $i++;
        }
        //if(strlen($tmpstr)< $strlen ) $tmpstr.= "...";
        return $tmpstr;
    }
}

示例

 代码如下 复制代码

$str = "如来神掌";
echo cut_str($str, 1, 0).'**'.cut_str($str, 1, -1);
//输出:如**掌

下面附两个IP地址与手机号星号显示

初学PHP,看到别人是通过合并和拆分数组进行这个操作!所以转过来!!

 代码如下 复制代码

<?php 

$ip =$_SERVER['REMOTE_ADDR'];

  $ip_arr= explode('.', $ip);

  $ip_arr[3]='*';

  $ip= implode('.', $ip_arr);

echo $ip;

?>

手机号的

 代码如下 复制代码

<?php
$haoma="15012345678";
echo preg_replace("/(d{3})d{5}/","$1*****",$haoma);
//150*****678
?>

表单可以把自己定义成数组形式,这样我们就能利用post接收用户多选过来的值了,下面一聚教程小编给各位整理了几个例子。

今天写php的时候发现$_POST["arr"]无法获取参数arr的数组,记录一下。

例如有以下表单需要提交:

 代码如下 复制代码

  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />
  <input type="checkbox" name="arr" value="" />

使用$_POST["arr"]只能获得最后选择的复选框的值,要获得全部选中的复选框的值需要把表单修改成下面:

 代码如下 复制代码

  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />
  <input type="checkbox" name="arr[]" value="" />

这样就可以使用$_POST["arr"]获得全部选中的checkbox的值,那这样获取值了我们要怎么解析出来呢。

第一中方法

 代码如下 复制代码

<form action="test1.php" method="post">
<?
for($i=0;$i<10;$i++){
?>
<input type="checkbox" name="interests[](不能去掉[])" value="<?=$i?>">test<?=$i?><br>
<?
}
?>
<input type="submit">
</form>

test1.php

<?php
foreach($_POST as $key => $val){
if(is_array($val)){
   foreach($val as $v2){
    echo "$v2<br>";
   }
}
}

?>

第二种用法

test3.php

 代码如下 复制代码

<?php

if(isset($_POST['submit'])){
$users = $_POST['user'];
foreach($users as $key=>$val){
   echo 'user ',$key,' = ',$val,'<br />';
}
}
?>
<form method="post">
zhangsan <input type="text" name="user[zhangsan]" value="0" /><br />
lisi <input type="text" name="user[lisi]" value="1" /><br />
wangwu <input type="text" name="user[wangwu]" value="2" /><br />
zhaoliu <input type="text" name="user[zhaoliu]" value="3" /><br />
<input type="submit" name="submit" value="提交" />
</form>

防盗链就是对一些文件资源进行包装了,这样对方是看不到我们文件源地址了,下载是也是php文件打开了,下载成功之后就成了要下载的文件了,下面我来给各位分享一站长写的类。

悲剧,刚提交的既然服务器挂了没成功,又得重写....

这几天在写一个PHP防盗链外部资源下载处理函数,昨天晚上刚完成编写,中间遇到了些问题,这里就不详述了;

以下是自写的简单的PHP防盗链处理类(重新整理编写成类文件,以便后期改进);

 代码如下 复制代码

<?php 

002 /** 

003  * 

004  * 防盗链外部资源下载处理类 

005  *  

006  * @author 清风 <xrcc_bk@126.com> 

007  * @link   http://blog.emtalk.net 

008  *  

009  */

010 class BurglarDow{ 

011     /** 

012      * 初始许可下载状态 

013      * @var    allow 

014      * @access private 

015      */

016     private $allow      =  false; 

017     /** 

018      * 初始下载地址 

019      * @var    dowUrl 

020      * @access private 

021      */

022     private $dowUrl     =  null; 

023     /** 

024      * 初始来路域名 

025      * @var    RemoteUrl 

026      * @access private 

027      */

028     private $RemoteUrl  =  null; 

029     /** 

030      * 初始许可资源取用域名列表 

031      * @var    allowUrl 

032      * @access private 

033      */

034     private $allowUrl   =  array(); 

035     /** 

036      * 初始转跳地址 

037      * @var    Location 

038      * @access private 

039      */

040     private $Location   =  null; 

041   

042     public function __construct($dowUrl,$Location,array $allowUrl){ 

043         // 初始下载地址 

044         $this->dowUrl   = $dowUrl; 

045         // 初始许可资源取用域名列表 

046         $this->allowUrl = $allowUrl; 

047         // 初始转跳地址 

048         $this->Location = $Location; 

049   

050         $this->RemoteUrl = @parse_url($_SERVER['HTTP_REFERER']);                                                      // 获取来路域名 

051         if(!is_array($this->RemoteUrl)) 

052             header("HTTP/1.1 301 Moved Permanently"); 

053             header("Location: ".$this->Location); 

054   

055         if(isset($this->RemoteUrl['host'])){ 

056             if(in_array($this->RemoteUrl['host'],$this->allowUrl)){                                                   // 判断是否来至许可域名 

057                 $this->allow  = true;                                                                                 // 下载许可状态为:真 

058             } 

059         } 

060         unset($this->allowUrl,$this->RemoteUrl);                                                                      // 释放内存变量 

061     } 

062   

063     /** 

064      * 防盗链资源下载 

065      * @access public 

066      * @return mixed 

067      */

068     public function dow(){ 

069         $FileInfo = get_headers($this->dowUrl,1);                                                                     // 获取远程文件头部信息 

070   

071         if(true === $this->allow){                                                                                    // 判断是否许可下载资源 

072             //判断配置文件是否存在 

073             if(is_file('Config.ini')){ 

074                 $FileCon = parse_ini_file('Config.ini'); 

075             }else{ 

076                 $FileName   =  basename($FileInfo['Content-Location']); 

077                 $FileConStr = "FileName  = {$FileName}rnFileUrl   = {$FileInfo['Content-Location']}rnFileSize   = {$FileInfo['Content-Length']}"; 

078                 $handle = fopen ('Config.ini', "wb");                                                                 // Config.ini文件不存在则创建文件 

079                 if (fwrite ($handle, $FileConStr) == FALSE) {                                                         // 数据写入文件  

080                     echo "File creation failed ...";  

081                 } 

082                 fclose ($handle);                                                                                     // 关闭一个已打开的文件指针 

083                 $FileCon = parse_ini_file('Config.ini'); 

084             } 

085             if(!empty($$this->dowUrl)){ 

086                 $fp = @fopen($$this->dowUrl, "rb");                                                                   // 二进制模式读取文件 

087                 if (!$fp) 

088                      exit("Download a mistake.nn"); 

089   

090                 // 输出远程资源 

091                 header("Content-type:text/html;charset=utf-8"); 

092                 header('Content-Description: File Transfer'); 

093                 header('Content-Type: application/octet-stream'); 

094                 header('Content-Disposition: attachment; filename='.$FileCon['FileName']); 

095                 header("Accept-Ranges: bytes"); 

096                 header('Content-Transfer-Encoding: binary'); 

097                 header('Expires: 0'); 

098                 header('Cache-Control:must-revalidate,post-check=0,pre-check=0'); 

099                 header('Pragma: public'); 

100                 header('Content-Length: '.$FileCon['FileSize']); 

101                 while (!feof($fp)){ 

102                     set_time_limit(0);                                                                                 // 设置文件最长执行时间 

103                     echo fread($fp, 1024);                                                                             // 输出文件 

104                     flush();                                                                                           // 输出缓冲 

105                     ob_flush();                                                                                        // 输出缓冲区中的内容 

106                 } 

107                 fclose($fp); 

108             }else{ 

109                 header("HTTP/1.1 404 Not Found"); 

110             } 

111         }else{ 

112             header("HTTP/1.1 301 Moved Permanently"); 

113             header("Location: ".$this->Location); 

114         } 

115     } 

116 } 

117 // 远程资源地址 

118 $dowUrl = '/qq/QQ5.1/10055/QQ5.1.exe'; 

119 // 转跳地址 

120 $Location = 'http://www.111cn.net'; 

121 // 许可来路域名列表 

122 $allowUrl = array( 

123     'blog.emtalk.net', 

124 ); 

125 $BurglarDow = new BurglarDow($dowUrl,$Location,$allowUrl); 

126 $BurglarDow -> dow();


有何不足之处,还望访友们多指点指点;

[!--infotagslink--]

相关文章

  • php上传图片学习笔记与心得

    我们在php中上传文件就必须使用#_FILE变量了,这个自动全局变量 $_FILES 从 PHP 4.1.0 版本开始被支持。在这之前,从 4.0.0 版本开始,PHP 支持 $HTTP_POST_FILES 数组。这...2016-11-25
  • Smarty模板学习笔记之Smarty简介

    1、简介Smarty是一个使用PHP写出来的模板PHP模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目...2014-05-31
  • C#中的多线程多参数传递详解

    第一种解决方案的原理是:将线程执行的方法和参数都封装到一个类里面。通过实例化该类,方法就可以调用属性来实现间接的类型安全地传递多个参数...2020-06-25
  • php Observer观察者模式之学习笔记

    当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。 那么如何让各家电脑知道自己的盟友被攻击了...2016-11-25
  • PHP 日期函数 学习笔记介绍

    举一个简单的date例子 我将使用echo命令把内容输出到我们的客户端(浏览器)。我将使用下面的代码做为基础代码。 代码如下 复制代码 <!DOCTY...2016-11-25
  • Android学习笔记之多界面切换实例

    一篇Android学习笔记之多界面切换实例,希望对各位朋友有所帮助。 用过VB 、 VC#的朋友都知道,在VB或VC#里要进行窗口(界面)切换很容易 例如在VB、C#里: 有 Fom1、...2016-09-20
  • php中的变量引用传值学习笔记

    引用:意思是将原始对象在内存中的地址传递给目标对象,就相当于原始对象和目标对象指向的是同一个内存地址。此时,如果对目标对象或者原始对象进行修改,内存中的数据也会改...2016-11-25
  • PHP中的cURL请求及示例学习笔记

    cURL是php中一个很强大的功能,可以模仿各种用户请求,如模仿用户登录,发送php cookie等等操作,下面我来整理一些相关的方法与各位同学看看 备注:使用curl_init函数,必须...2016-11-25
  • 那些年,我还在学习C# 学习笔记

    那些年学了ASP.NET后,才开始学习C#,说来也怪,怎么学了ASP.NET才来学习C#,其实没有什么的...2020-06-25
  • YII2 WIDGET的学习笔记

    CWidget是所有Widget的基类。CWidget是自包含组件,可以看出是MVC的简略版,CWidget相比Controller,既没有actions,也没有filters widget,英文意思为小工具,小挂件,在程序...2016-11-25
  • metasploit调用nexpose扫描学习笔记

    Metasploit是一个免费的、可下载的框架,通过它可以很容易地获取、开发并对计算机软件漏洞实施攻击。它本身附带数百个已知软件漏洞的专业级漏洞攻击工具 nexpose安...2016-11-25
  • php学习笔记之PHP扩展开发教程

    PHP扩展开发不是所有开发者都会操作的一个东西,下面我来演示一个关于PHP扩展开发实现过程,各位同学有需要可进入参考。 我们先假设需要这样一个扩展,提供一个叫tao_s...2016-11-25
  • Yii2学习笔记之汉化yii设置表单的描述

    小编推荐的这篇文章介绍了Yii2学习笔记之汉化yii设置表单的描述,非常实用,有兴趣的同学快来看看吧。 一:汉化框架&#8195;&#8195;框架汉化在这里设置,如果不生效,前台后...2017-07-06
  • php Builder建造器模式学习笔记

    星际里面有不少的任务关,也可以自己编辑地图,画面上有各种地形,建筑和部队,存在一个问题,初始化画面的流程很乱。待解决的问题:完成初始化画面的工作,同时尽量减少各种绘制...2016-11-25
  • php中session学习笔记

    Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中我们可以看到,Session实际上是一个...2016-11-25
  • PHP单例模式学习笔记详解

    单例模式是php中一个为了简化大家开发及重复调用的一个功能,下面我来给各位朋友详细介绍单例模式用法。 1.单例模式的概念 顾名思义,单例模式只有一个实例,而且自行...2016-11-25
  • php正则表达式子模式的反向引用学习笔记

    本文章给大家分享一篇php正则表达式子模式的反向引用学习笔记,希望此教程对各位朋友有帮助哦。 需要用正则表达式获取字符串的标题。标题标签是h1~h6。 使用正则...2016-11-25
  • php 适配器模式的学习笔记

    适配器模式许多和php程序员都没有碰到关于适配器的应用了,这里小编整理了两个关于适配器的使用例子,下面我们就一起来看看吧,希望各位有帮助。 【目的】:将一个类的...2016-11-25
  • PHP CodeIgniter学习笔记详解

    今天做的是个简单的表明表页面,前端我用的是Bootstrap。没办法,自己不懂美工,也只有用别人的工具。BS真的很漂亮,而且插件丰富,不愧是twitter工程师弄出来的东西。 (中...2016-11-25
  • php与mysql数据库cookie Session 分页学习笔记

    下面整理了是一些在学习php mysql中我们一些常用的知识点,包括有分页,连接数据库及时登录与文件上会以的知识点,希望对各位有帮助。 代码如下 复制代码 ...2016-11-25