1. 程式人生 > >不向前走,不知路遠;不努力學習,不明白真理

不向前走,不知路遠;不努力學習,不明白真理

<?php

	/*
		cookie基本操作
		cookie是一種由伺服器傳送給客戶端的片段資訊,儲存在客戶端瀏覽器的記憶體或者硬碟上。
		在客戶對該服務的請求中發回它。
		cookie檔案會放在 C:\Documents and Settings\使用者名稱\Cookies

		例如此程式生成的cookie檔名   使用者名稱@localhost[1].txt
	*/


	//設定cookie
	$time = time() +  60 * 60;  //設定cookie生存時間,必須設定時間.(儲存1小時)
	//$time = time() + 60 * 60 * 24 * 7   儲存一週
	setCookie("user",'yuanchao',$time);

	//獲取cookie
	print_r($_COOKIE);

	echo $_COOKIE['user'];
<?php

	/*
		陣列形態的cookie
	*/

	$time = time() + 60 * 60;
	/*
		在setCookie()函式的第一個引數中,通過在cookie標識中指定陣列下標的形式設定。
	*/
	setCookie('user[name]','yuanchao',$time);
	setCookie('user[age]','30',$time);
	setCookie('user[sex]','男',$time);

	foreach($_COOKIE["user"] as $key=>$value) {
		echo $key .'--' . $value .'<br/>';
	}
<?php

	/*
		刪除cookie
		如果刪除在客戶端的cookie,可以使用兩種方法。
		
		第一種:省略setcookie()函式的所有引數列,僅僅只有第一個引數的cookie名稱即可。
		
		第二種:利用setcookie()函式把cookie設定為已過期狀態。即減去-1
	*/

	//第一種方式
	setCookie('user');

	//第二種方式

	setCookie('user[name]','',time()-1);

基於cookie的使用者登陸模組

--建立使用者表,allow許可權位,1代表有許可權,0代表無許可權
create table user (
	id	int primary key auto_increment,
	name varchar(20) not null,
	pwd varchar(50) not null,
	allow_1 int(1) not null,
	allow_2 int(1) not null,
	allow_3 int(1) not null
);
--建立管理員和yc普通使用者
insert into user values(null,'admin',md5('admin'),1,1,1);
insert into user values(null,'yc',md5('yc'),0,0,1);

mysql> select * from user;
+----+-------+----------------------------------+---------+---------+---------+
| id | name  | pwd                              | allow_1 | allow_2 | allow_3 |
+----+-------+----------------------------------+---------+---------+---------+
|  1 | admin | 21232f297a57a5a743894a0e4a801fc3 |       1 |       1 |       1 |
|  2 | yc    | a2bf364d91c65964491d6ef7c0a36c46 |       0 |       0 |       1 |
+----+-------+----------------------------------+---------+---------+---------+
2 rows in set (0.00 sec)


conn.inc.php

<?php
	
	/*
		連線資料庫
	*/

	$mysqli = new mysqli('localhost','root','root','xsphp');
	if(mysqli_connect_errno()) {
		printf('資料庫連線失敗,失敗原因:%s',mysqli_connect_error());
		exit;
	}

comm.inc.php

<?php

	/*
		檢查cookie,判斷是否登陸
	*/
	if(!isset($_COOKIE["islogin"]) && $_COOKIE["islogin"] != true) {
		var_dump($_COOKIE["islogin"]);
		header('location:login.php');
	}

login.php

<html>
	<head>
		<title>基於cookie的使用者登陸模組</title>
		<?php
			if(isset($_POST['sub'])) {
				include('conn.inc.php');
				$name = $_POST['name'];
				$pwd = $_POST['pwd'];
				$sql = 'select id from user where name ="'.$name.'" and pwd = "'.md5($pwd).'" ';
			//echo $sql;
				$result = $mysqli->query($sql);
				if($result->num_rows > 0) {
					$row = $result->fetch_assoc();
					//登陸成功,設定cookie
					$time = time() + 60 * 60;  //失效時間1小時
					setCookie('name',$name,$time);
					setCookie('islogin',true,$time);
					setCookie('id',$row['id'],$time);
					$result->close();
					$mysqli->close();
					header('location:index.php');
				}
				$mysqli->close();
				echo '登陸失敗!';
			}
		?>
	</head>
	<body>
	<form action="login.php" method="post" name="myform">
		<table border="1" align="center">
			<tr>
				<td>
				使用者名稱:
				</td>
				<td>
					<input type="text" name="name" />
				</td>
			</tr>
			<tr>
				<td>
				密碼:
				</td>
				<td>
					<input type="password" name="pwd" />
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" name="sub" value="登陸"/>
				</td>
			</tr>
		</table>
	</form>
	</body>
</html>

index.php

<?php

	/*
		主介面 
	*/

	include('comm.inc.php');
	include('conn.inc.php');
	
	$name = $_COOKIE['name'];
	$id = $_COOKIE['id'];
	echo "歡迎{$name}回來 <br/>";
	echo "<a href='logout.php'>退出登陸</a> <br/>";
	$sql = "select * from user where id = " . $id;
	$result = $mysqli->query($sql);
	$row = $result->fetch_assoc();
	if($row['allow_1'] == 1) {
		echo '您擁有allow_1許可權 <br/>';
	}
	if($row['allow_2'] == 1) {
		echo '您擁有allow_2許可權 <br/>';
	}
	if($row['allow_3'] == 1) {
		echo '您擁有allow_3許可權 <br/>';
	}
	$result->close();
	$mysqli->close();

logout.php

<?php

	include('comm.inc.php');

	//刪除cookie
	setCookie('name');
	setCookie('id');
	setCookie('islogin');

	header('location:login.php');



Session
<?php

	/*
		Session

		session的設定不同於cookie,必須先啟動。
	*/
	
	//開啟session,此函式之前不能有任何輸出
	session_start(); 

	$_SESSION['username'] = 'hello world';

	echo session_id().'<br/>'; //輸出sessionid

	echo $_SESSION['username'] .'<br/>';

	//輸出pip.ini檔案裡session.name
	echo session_name().'<br/>';

<?php

	/*
		session銷燬步驟
	*/

	//第一步,開啟session
	session_start();
	//第二步,刪除所有session變數
	$_Session = array();
	//第三步,如果是基於cookie的session,使用setcookie()刪除包含session id的cookie
	if(isset($_COOKIE[session_name()])) {
		setCookie(session_name(),'',time()-3600,'/');
	}
	//第四步,最後徹底銷燬session
	session_destroy();


	/*
		$_Session = array(); 清空$_SESSION陣列的同時,也將這個使用者在伺服器端對應的session檔案內容清空。

		而使用session_destroy();則是將這個使用者在伺服器端對應的session檔案刪除
	*/

基於session登陸模組

comm.inc.php

<?php

	/*
		檢查session,判斷是否登陸
	*/
	session_start();
	if(!isset($_SESSION["islogin"]) && $_SESSION["islogin"] != true) {
		header('location:login.php');
	}

login.php

<html>
	<head>
		<title>基於session的使用者登陸模組</title>
		<?php
		//開啟session
		session_start();
			if(isset($_POST['sub'])) {
				include('conn.inc.php');
				$name = $_POST['name'];
				$pwd = $_POST['pwd'];
				$sql = 'select id from user where name ="'.$name.'" and pwd = "'.md5($pwd).'" ';
			//echo $sql;
				$result = $mysqli->query($sql);
				if($result->num_rows > 0) {
					$row = $result->fetch_assoc();
					//登陸成功,設定session
					$_SESSION['name'] = $name;
					$_SESSION['id'] = $row['id'];
					$_SESSION['islogin'] = true;
					$result->close();
					$mysqli->close();
					header('location:index.php');
				}
				$mysqli->close();
				echo '登陸失敗!';
			}
		?>
	</head>
	<body>
	<form action="login.php" method="post" name="myform">
		<table border="1" align="center">
			<tr>
				<td>
				使用者名稱:
				</td>
				<td>
					<input type="text" name="name" />
				</td>
			</tr>
			<tr>
				<td>
				密碼:
				</td>
				<td>
					<input type="password" name="pwd" />
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" name="sub" value="登陸"/>
				</td>
			</tr>
		</table>
	</form>
	</body>
</html>

index.php

<?php

	/*
		主介面 
	*/

	include('comm.inc.php');
	include('conn.inc.php');
	$name = $_SESSION['name'];
	$id = $_SESSION['id'];
	echo "歡迎{$name}回來 <br/>";
	echo "<a href='logout.php'>退出登陸</a> <br/>";
	$sql = "select * from user where id = " . $id;
	$result = $mysqli->query($sql);
	$row = $result->fetch_assoc();
	if($row['allow_1'] == 1) {
		echo '您擁有allow_1許可權 <br/>';
	}
	if($row['allow_2'] == 1) {
		echo '您擁有allow_2許可權 <br/>';
	}
	if($row['allow_3'] == 1) {
		echo '您擁有allow_3許可權 <br/>';
	}
	$result->close();
	$mysqli->close();

使用URL傳遞session id的登陸模組

方法:

       第一個方法:手動的在每個超級連結的URL中都新增一個session.
            頁面都要判斷一下是否有傳過來的session id, 有則設定一下。


    第二個方法:使用pip.ini裡的session.name = PHPSESSID
                 <a href="連結?PHPSESSID=".session_id()>xxxxxx</a>
             就不需要判斷了。session自動找PHPSESSID

    第三個方法:
            使用常量SID:
            該常量在會話啟動時被定義,如果客戶端沒有傳送是的會話cookie,則sid的格式為
            session_name = session_id,否則就是一個空字串。
        <a href="連結?".SID>xxxxxx</a>
            也不需要判斷

    
       第四個方法:
        修改php.ini裡的session.use_trans_sid = 1.使用明碼在URL顯示sid.(不建議使用)

第一種方法的程式碼:

login.php

<html>
	<head>
		<title>基於session的使用者登陸模組</title>
		<?php
		//開啟session
		if(isset($_GET['sid'])) {
			session_id($_GET['sid']);
		}
		session_start();
		
		
		echo session_id().'<br/>';
			if(isset($_POST['sub'])) {
				include('conn.inc.php');
				$name = $_POST['name'];
				$pwd = $_POST['pwd'];
				$sql = 'select id from user where name ="'.$name.'" and pwd = "'.md5($pwd).'" ';
			//echo $sql;
				$result = $mysqli->query($sql);
				if($result->num_rows > 0) {
					$row = $result->fetch_assoc();
					//登陸成功,設定session
					$_SESSION['name'] = $name;
					$_SESSION['id'] = $row['id'];
					$_SESSION['islogin'] = true;
					$result->close();
					$mysqli->close();
					//header('location:index.php?sid='.session_id());
					
					echo '<script>';
					echo 'alert("aaaa");';
					echo "location='index.php?sid=".session_id()."'";
					echo '</script>';

					echo '------------------------';
					
				}else {
					$mysqli->close();
					echo '登陸失敗!';
				}
			}
		?>
	</head>
	<body>
	<form action="login.php?sid=<?php echo session_id();?>" method="post" name="myform">
		<table border="1" align="center">
			<tr>
				<td>
				使用者名稱:
				</td>
				<td>
					<input type="text" name="name" />
				</td>
			</tr>
			<tr>
				<td>
				密碼:
				</td>
				<td>
					<input type="password" name="pwd" />
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" name="sub" value="登陸"/>
				</td>
			</tr>
		</table>
	</form>
	</body>
</html>

commit.inc.php

<?php

	/*
		檢查session,判斷是否登陸
	*/
	
	//判斷URL是否有session id.如果有則設定。必須放在開啟sesion之前。否則session會有新的id
	if(isset($_GET['sid'])) {
			session_id($_GET['sid']);
			echo session_id();
	}
	session_start();
	if(!isset($_SESSION["islogin"]) && $_SESSION["islogin"] != true) {
	echo '))))))))))))))))))';
		//header('location:login.php');
	}
	

php.ini中與會話session有關的幾個選項

儲存和檢索與胡話關聯的資料的處理器名字,可以使用(files,user,sqlite,memcahce)中的一個值
預設為檔案files,如果想要使用自定義的處理器,可以用user
session.save_handler = user

對於files處理器,此值是建立會話資料檔案的路徑。
session.save_path = "/tmp"

是否使用cookie在客戶端儲存會話id,1表示允許
session.use_cookies = 1

會話的名稱
session.name = PHPSESSID

是否使用明碼在URL上顯示SID(會話ID)。預設禁止
session_use_trans_sid

cookie中的session id在客戶機上儲存的有效期(秒),0表示延續到瀏覽器關閉。
session.cookie_lifetime = 0  

傳遞會話id的cookie作用路徑

session.cookie_path = /

Session的自動回收機制

通過在頁面中提供的一個退出按鈕,單擊銷燬本次會話。但使用者如果沒有單擊退出按鈕,而是直接關閉瀏覽器。
或斷網等情況,在伺服器儲存的session檔案是不會被刪除的。雖然關閉瀏覽器,下次需要分配一個新的session id重新登入。
通過在php.ini中設定session.gc_maxlifetime選項來指定一個時間(單位:秒),例如1400(24分鐘)
通過在php.ini檔案中修改session.gc_probability和session.gc_divisor兩個選項,設定啟動垃圾回收程式的概率。
會根據session.gc_probability/session.gc_divisor公式計算概率,例如session.gc_probability=1,session.gc_divisor=100

這樣的概率就是1/100.即session_start()函式被呼叫100次才會有一次可能啟動垃圾回收程式。建議值為1/(1000~5000)

自定義session處理方式。

1、儲存到檔案中。session預設也是儲存到檔案中

session.php

<?php
	
	//在執行session_start(); //啟動
	function open($save_path, $session_name){
		global $sess_save_path;

		$sess_save_path=$save_path;

		return true;
	}
	//session_write_close()  session_destroy() 
	function close(){
		return true;
	}
	//session_start(), $_SESSION, 讀取session資料到$_SESSION中
	function read($id){
		global $sess_save_path;
		$sess_file=$sess_save_path."/glf_".$id;

		return (string)@file_get_contents($sess_file);
		
	}
	//結束時和session_write_close()強制提交SESSION資料 $_SESSION[]="aaa";
	function write($id, $sess_data){
		global $sess_save_path;
		$sess_file=$sess_save_path."/glf_".$id;

		if([email protected]($sess_file, "w")){
			$return=fwrite($fp, $sess_data);
			fclose($fp);
			return $return;
		}else{
			return false;
		}

	}
	//session_destroy()
	function destroy($id){
		global $sess_save_path;
		$sess_file=$sess_save_path."/glf_".$id;

		return @unlink($sess_file);
	}

	//ession.gc_probability和session.gc_divisor值決定的,open(), read() session_start也會執行gc
	function gc($maxlifetime){
		global $sess_save_path;
		
		/*
			glob() 函式依照 libc glob() 函式使用的規則尋找所有與 pattern 匹配的檔案路徑 
			返回一個包含有匹配檔案/目錄的陣列。如果出錯返回 FALSE。 

		*/
		foreach(glob($sess_save_path."/glf_*") as $filename){
			//檔案的修改時間+檔案生存時間 小於 當前時間,是過期檔案
			if(filemtime($filename)+$maxlifetime < time() ){
				@unlink($filename);
				echo $filename;
			}
		}

		return true;
	}

	session_set_save_handler("open", "close", "read", "write", "destroy","gc");

	session_start();

one.php

<?php

	include('session.php');
	//session_start();
	$_SESSION['username'] = 'yc';
	$_SESSION['pwd'] = 'admin';

	echo session_name() . '=' .session_id();

two.php

<?php

	include('session.php');

	echo $_SESSION['username']."<br/>";
	echo $_SESSION['pwd']."<br/>";

	echo session_name().'='.session_id();

three.php

<?php

	include('session.php');
	$_SESSION = array();
	if(isset($_COOKIE[session_name()])) {
		setCookie(session_name(),'',time()-100,'/');
	}
	session_destroy();

	echo 'session已銷燬';

	echo session_name().'='.session_id();

生存的sesson檔案

yctupqf4kc44d147sonkqhsfcil1

username|s:2:"yc";pwd|s:5:"admin";

2、使用資料庫處理Session資訊

--建立儲存session資訊表

create	table session(
	sid	char(32) not null primary key,   #session id
	client_ip char(15) not null,   #客戶端IP
	update_time int not null,    #session的更新時間
	data text                    #session資料
);

mysql> desc session;
+-------------+----------+------+-----+---------+-------+
| Field       | Type     | Null | Key | Default | Extra |
+-------------+----------+------+-----+---------+-------+
| sid         | char(32) | NO   | PRI | NULL    |       |
| client_ip   | char(15) | NO   |     | NULL    |       |
| update_time | int(11)  | NO   |     | NULL    |       |
| data        | text     | YES  |     | NULL    |       |
+-------------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)

session.php

<?php

	/*
		利用資料庫儲存session
	*/

	class Session {
		private static $client_ip ; //客戶端IP
		private static $lifetime;   //php.ini裡的session的生存時間
		private static $time;    //當前時間
		private static $handle;    //資料庫連線物件

		/*
			初始化物件
		*/
		private static function init($handle) {
			self::$handle = $handle;
			self::$client_ip = isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'unknow';
			self::$lifetime = ini_get("session.gc_maxlifetime");
			self::$time =time();
		}

		public function start($pdo) {
			//回撥函式呼叫類中方法,得用陣列形式
			session_set_save_handler ( 
				array(__CLASS__,"open"),
				array(__CLASS__,"close"),
				array(__CLASS__,"read"),
				array(__CLASS__,"write"),
				array(__CLASS__,"destroy"),
				array(__CLASS__,"gc")
			 );
			self::init($pdo);
			//開啟會話,啟用資料庫儲存session
			session_start();
		}

		public static function open($path,$name) {
			return true;
		}

		public static function close() {
			return true;
		}
		/*
			讀取資料庫裡session資訊
		*/
		public static function read($id) {
			$sql = 'select client_ip,update_time,data from session where sid = ?';
			$stmt = self::$handle->prepare($sql);
			$stmt->bindParam(1,$id);
			$stmt->execute();
			$row = $stmt->fetch(PDO::FETCH_ASSOC);
			//如果客戶端IP與資料庫IP不一致,session過期
			if(self::$client_ip != $row['client_ip']) {
				self::destroy($id);
				return '';
			}
			//如果使用者長時間沒有操作,session已過期
			if($row['update_time'] + self::$lifetime < self::$time) {
				self::destroy($id);
				return '';
			}
			return $row['data'];
		}

		/*
			向資料庫寫入session資訊
		*/
		public static function write($id,$data) {
			//首先判斷資料庫裡是否有此session,如果有更新,沒有插入
			$sql = 'select client_ip,update_time,data from session where sid = ?';
			$stmt =self::$handle->prepare($sql);
			$stmt->bindParam(1,$id);
			$stmt->execute();
			if($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
				//如果session資料沒有改變,或者在30秒改變則更新
				if($row['data'] != $data || self::$time > $row['update_time'] + 30) {
					$sql = "update session set client_ip=?,update-time=?,data=? where sid = ?";
					$stmt = self::$handle->prepare($sql);
					$stmt->bindParam(1,self::$client_ip);
					$stmt->bindParam(2,self::$time);
					$stmt->bindParam(3,$data);
					$stmt->bindParam(4,$id);
					$stmt->execute();
				}
			}else {
				//插入新的session資訊
				$sql = "insert into session values(?,?,?,?)";
				$stmt = self::$handle->prepare($sql);
				$stmt->execute(array($id,self::$client_ip,self::$time,$data));
			}
			return true;
		}

		/*
			銷燬session
			刪除資料庫裡session資訊
		*/
		public static function destroy($id) {
			$sql = "delete from session where sid = ?";
			$stmt = self::$handle->prepare($sql);
			return $stmt->execute(array($id));
		}

		public static function gc($maxlifetime) {
			$sql = "delete from session where update_time < ?";
			$stmt = self::$handle->prepare($sql);
			//當前時間 - session生存時間
			$deletetime = self::time - self::lifetime;
			$stmt->bindParam(1,$deletetime);
			return $stmt->execute();
		}
	}

	try {
		$dsn = "mysql:dbname=xsphp;host=localhost";
		$user = 'root';
		$pwd = 'root';
		$opt = array(PDO::ATTR_PERSISTENT=>true,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION);
		$pdo = new PDO($dsn,$user,$pwd,$opt);
	}catch(PDOException $e) {
		$e->getMessage();
	} 

	$sess = new Session();
	$sess->start($pdo);

執行one.php,two.php頁面。在資料庫裡查詢

mysql> select * from session;
+----------------------------+-----------+-------------+------------------------------------+
| sid                        | client_ip | update_time | data                               |
+----------------------------+-----------+-------------+------------------------------------+
| iclle0k85ga6ka8f2532a0gtn3 | 127.0.0.1 |  1523950782 | username|s:2:"yc";pwd|s:5:"admin"; |
+----------------------------+-----------+-------------+------------------------------------+
1 row in set (0.00 sec)

3、使用memcache處理session資訊

memcache.class.php

<?php

	/*
		用資料庫來同步Session會加大資料庫的負擔。
		用檔案儲存,讀取慢。
		用memcache來處理session則是非常合適。
		memcache的快取機制和session非常相似。另外,memcache可以做分散式。
		能夠把web伺服器中的記憶體組合起來,成為一個記憶體池。
	*/

	class MemSession {
		private static $lifetime;  //session生存時間
		private static $handle;    //memcache物件
		const NS = 'memcache_';   //宣告一個session名的字首,防止衝突

		/*
			物件初始化
		*/
		public static function init($handle) {
			self::$lifetime = ini_get("session.gc_maxlifetime");
			self::$handle = $handle;
		}

		public static function start($mem) {
			self::init($mem);
			session_set_save_handler ( 
				array(__CLASS__,"open") ,
				array(__CLASS__,"close") ,
				array(__CLASS__,"read") ,
				array(__CLASS__,"write") ,
				array(__CLASS__,"destroy") ,
				array(__CLASS__,"gc") 
			);
			//開啟會話,啟用memcache儲存session
			session_start();
		}

		public static function open($path,$name) {
			return true;
		}

		public static function close() {
			return true;
		}

		public static function read($id) {
			$data = self::$handle->get(self::getMemSessionName($id));
			//如果無資料
			if($data == false || $data == null) {
				return '';
			}
			return $data;
		}

		public static function write($id,$data) {
			//將資料寫入memcache伺服器中
			$fun = $data ? 'set' : 'replace';
			return self::$handle->$fun(self::getMemSessionName($id),$data,MEMCACHE_COMPRESSED,self::$lifetime);
		}

		public static function destroy($id) {
			return self::$handle->delete(self::getMemSessionName($id));
		}

		/*
			由於memcache伺服器在儲存資料時,已經設定失效時間。
			所以不用此函式。
		*/
		public static function gc($maxlifetime) {
			return true;
		}
		
		/*
			獲取session名
			字首+id
		*/
		public static function  getMemSessionName($id) {
			$sessionName = self::NS.$id;
			return $sessionName;
		}

	}

	$mem = new Memcache();
	$mem->connect("localhost","11211") or die("連結memcache伺服器出錯!");
	MemSession::start($mem);

在one.php,two.php,three.php中加入memcache.class.php

include('memcache.class.php');

執行頁面檢視memcache伺服器

stats items
STAT items:3:number 1
STAT items:3:age 36
STAT items:3:evicted 0
STAT items:3:outofmemory 0
END
stats cachedump 3 0
ITEM memcache_i0ddovbpsi5cp8gm3pktdh9nm5 [34 b; 1523958760 s]
END
get memcache_i0ddovbpsi5cp8gm3pktdh9nm5
VALUE memcache_i0ddovbpsi5cp8gm3pktdh9nm5 0 34
username|s:2:"yc";pwd|s:5:"admin";
END
還可以通過修改php.ini檔案中的session.save_handler和session.save_path兩個選項,直接將session資訊儲存到memcache伺服器中。
session.save_handler=memcache    
session.save_path=tcp://localhost:11211



相關推薦

向前不知努力學習明白真理

<?php /* cookie基本操作 cookie是一種由伺服器傳送給客戶端的片段資訊,儲存在客戶端瀏覽器的記憶體或者硬碟上。 在客戶對該服務的請求中發回它。 cookie檔案會放在 C:\Documents and Settings\使用者名稱\

漫漫不知在何方!

開學已經,一兩週了,大三的我看著周圍的同學,拿著阿里,京東,美團的實習offer,羨慕又後悔著。 大學,夢開始的時候。由於我大學剛開始,不知道要不要走程式設計師,對著一行了解太淺,導致耽誤了,很長時間,我仔細的算了一下,如果和剛上大學的就開始學的同學算起,大約差了整整一

【為無為事無事味無味。】大小多少抱怨以德。圖難乎其易也為大乎其細也天下之難作於易天下之大作於細。是以聖人終為大故能成其大。夫輕諾必寡信必多難。是以聖人猶難之故終無難矣。

每天進步一點點。。。 從2009年畢業到現在,做過Java後臺開發,PL/SQL開發,會編寫shell指令碼,現為兼職開發的MySQL DBA。為人友善誠懇,工作踏實,吃苦耐勞,富有朝氣,激情,以及團隊合作意識。

【sukyle的專欄】著急的事慢慢地說大事要事想清楚說小事瑣事幽默地說到的事不要隨便說傷人的事堅決不說沒有的事不要胡說別人的事謹慎地說自己的事坦誠直說該做的事做好再說將來的事到時再說。

著急的事,慢慢地說;大事要事,想清楚說;小事瑣事,幽默地說;做不到的事,不要隨便說;傷人的事,堅決不說;沒有的事,不要胡說;別人的事,謹慎地說;自己的事,坦誠直說;該做的事,做好再說;將來的事,到時再...

VPP NAT測試支援VLAN在NAT下arp學習有問題需要手動新增直連線口ICMP支援

 =================================                 CARRIER GRADE NAT - NAT44 README                 =================================   W

夢飲酒者旦而哭泣夢哭泣者旦而田獵。方其夢也不知其夢也。 ------莊子.齊物論-節選

麗之姬,艾封人之子也。晉國之始得之也,涕泣沾襟,及其至於王所,與王同筐床,食芻豢,而後悔其泣也。 予惡乎知夫死者不悔其始之蘄生乎 夢飲酒者,旦而哭泣;夢哭泣者,旦而田獵。方其夢也,不知其夢也。夢之中又佔其夢焉, 覺而後知其夢也。且有大覺而後知此其大夢也,而愚者自以為覺

社交向左AI當立歲在戊戌騰訊大急!

躺著賺錢的日子過去了,騰訊結構大調整,好飯真的不怕晚? “認為阿凡達時代才能實現雲端計算”的馬化騰變了。 馬上要20週歲的騰訊,在時隔6年後迎來新一輪的優化調整,並在此次調整正將雲業務從社交網路事業群(SNG)劃分出來,單獨成立雲與智慧產業事業群(CSIG),

我若成佛天下無魔我若入魔佛奈我何!

第一步:解除安裝原有MySQL [[email protected] ~]# rpm -qa| grep mysql //這個命令就會檢視該作業系統上是否已經安裝了mysql資料庫 有的話,我們就通過 rpm -e 命令 或者 rpm -e --nod

【Liigo's blog】當我沉默著的時候我覺得充實我將開口同時感到空虛……

當我沉默著的時候,我覺得充實; 我將開口,同時感到空虛…… 相對於籃球,我更喜歡足球; 相對於象棋,我更喜歡圍棋; 相對於C ,我更喜歡Rust;…… 莊曉立(Liigo),男,80後,山東省梁山縣人,2002年畢業於山東理工大學,十多年來長期從事軟體技術研究和基礎產

【Java那點事 | 學習●思考●分享 | Java技術交流QQ群:83753349】當你的才華還撐起你的野心時那你就應該靜下心來學習。豈能盡如人意但求無愧我心; 努力不一定會成功但是放棄一定會失敗; 好好學習,天天向上,不求與人相比但求超越

當你的才華還撐不起你的野心時,那你就應該靜下心來學習。豈能盡如人意,但求無愧我心; 努力不一定會成功,但是放棄一定會失敗; 好好學習,天天向上,不求與人相比,但求超越自己; 知其然,還要知其所以然;...

Django寫一個裝飾器:從首頁點選詳情頁如已登入進詳情頁如未登入跳轉至登入頁面登入成功後跳轉至詳情頁

有的網站需求,如果使用者未登入,能夠進入首頁,但當點選想要進入詳情頁的時候,就會跳轉到登入頁面,登入完成之後,有的需求需要進入首頁;有的需要進入點選登入之前你的意向頁面 第一種:登入之後,進入首頁。 第二種:登入之後,進入登入之前你點選想進入的意向頁面 那麼,對於第一種,登入之後,進入首

讓天下沒有難用的資料庫 » 事諸父如事父事諸兄如事兄

      事諸父,如事父;事諸兄,如事兄—出自《弟子規》,最近喜好這本書,看到這句話,心中感慨頗多,想想工作快滿三個月了,這三個月中經歷了從學校走出來,對未來生活工作的憧憬;經歷了為專案釋出熬戰的一個通宵;經歷了五六個人圍在你後面處理緊急問題的時刻;經歷在離家後的一個人過中秋節的三天….     

Dragon's Life(聚百家之長補一己之短。博覽群書汲取精華日積跬步以致千里傾盡所能佈道傳承。)

分散式日誌資料處理 在面對業務複雜場景時,實時記錄、提取、分析日誌,成為提高測試效率、監控業務質量、分析定位問題的一種高效手段。 本專欄主要講解基於目前主流的大資料技術,構建一套用於解決上述問題的通用平臺,以及在落地實踐過程中所

發上等願結中等緣享下等福擇高處立就平處坐向寬處行。

      在Google Nexus 7 ( Version 4.4.2 )平板出現之前,Intent.ACTION_GET_CONTENT開啟相簿會返回如下形式的Uri :   content://media/external/images/media/3951

Java中int和Integer的區別:int 是基本型別直接存數值 integer是物件用一個引用指向這個物件

      int 是基本型別,直接存數值   integer是物件,用一個引用指向這個物件   1.Java 中的資料型別分為基本資料型別和複雜資料型別   int 是前者>>integer 是後者(也就是一個類)   2.初始化時>>   in

掌控之中才會成功掌控之外註定失敗。

前言 前面介紹了TCP/IP協議族的組成,現在來看最底層的資料鏈路層。 鏈路層 鏈路層目的如下 為IP模組傳送和接收IP資料報。 為ARP傳送ARP請求和接收ARP應答。

戴眼鏡最近眼睛很累感覺有壓力一樣眼壓過大摘掉眼鏡後感覺又好一些求專業人士原因?

關鍵:眼壓高,帶眼鏡帶長了時間,眼睛累. 注:本人戴了七六年的眼鏡了,L475,R400度的樣子(視力:L1.0  R1.0),最近一年來眼睛突然很累,脹。有人說可能是青光眼,所以很擔憂,難道我才25歲就有青光眼了嗎? 感謝!! 一.我去了北京武警總醫院,北京協和醫院,北京

事非宜勿輕諾苟輕諾進退錯。

設計圖尺寸計算方法 單塊螢幕解析度(一般為1920x1080),根據橫排和豎排數目換算比例,根據主流顯示器解析度1920x1080,得到一個縮放值。將得到的縮放值賦予文件的body的scale屬性,這樣就可以在可視區域最大範圍內看到頁面整體的效果了。當然如果是

程式設計師職業思考與規劃 —— Java程式設計師年度總結:淺談四點心得也許得更

一、技術積累 (1)程式碼規範 1.1.1、通常的模組分佈: 一般如果你要實現一個web應用,你從後臺將資料展示到前端頁面,在一個比較大的公司,你少不了跟其他專案有交集(你呼叫他的介面,他依賴你的介面),這樣下來,整個公司有很多個模組,怎麼做到很好的聯絡。回到剛剛的

JAVA程式設計:Js中self,top,parent,opener詳解傻傻分清楚

昨天專案遇到的問題:取上級window視窗物件時,傻傻分不清楚!你能分清楚嗎? 當我們在瀏覽器中開啟一個網頁時,瀏覽器都會建立一個視窗物件,這個視窗就是一個window物件。也就是Js生存依附的全域性環境物件和全域性作用域物件。 1.Self 指當前視窗頁面,就是wind