孫朗
1,配置文件 復(fù)制代碼代碼如下: <?php define('PATH',dirname($_SERVER['SCRIPT_NAME'])); //聊天室目錄 define('CHAT_NAME','PHP聊天室'); //聊天室名稱 define("MESS", "mess.txt"); //聊天信息 define("PERSON", "person.txt"); //在線人名單 define("RETIME",3); //刷新時(shí)間 define("LINE",11); //公共窗口顯示的行數(shù) define("PRLINE",5); //私聊窗口顯示的行數(shù) define("MAX",50); //聊天室人數(shù)限制 define("MAXTIME",600000); //最大不發(fā)言時(shí)間,單位是毫秒 define("WELCOME","<font color=blue>歡迎光臨".CHAT_NAME.",請遵守聊天室規(guī)則,不要惡意刷新,不要使用不文明用語。</font>"); //歡迎語 ?> 2,公共函數(shù)文件 (1)chklogin()函數(shù)檢查用戶昵稱是否重復(fù)。參數(shù)$user是登錄用戶的昵稱。當(dāng)函數(shù)返回值為True時(shí),昵稱不可用;返回值為False時(shí),昵稱可用?! ?fù)制代碼代碼如下: function chklogin($file,$user){ $boo = false; if(file_exists($file)){ $userarr = file($file); /* 判斷昵稱是否重復(fù) */ foreach($userarr as $value){ //判斷昵稱是否重復(fù) $tmparr = explode('#',$value); //使用“#”作為分隔符來拆分字符串 if($user == $tmparr[0]){ //如果用戶數(shù)組中包含此用戶 $boo = true; break; } } } return $boo; } (2)addlogin()函數(shù)將登錄的用戶昵稱寫入文件中,保存格式為:昵稱#IP#性別,參數(shù)$file是保存的文件地址,$user是用戶昵稱,$ip是登陸IP,$sex表示用戶性別。 復(fù)制代碼代碼如下: function addlogin($file,$user,$ip,$sex){ $tmp = $user.'#'.$ip.'#'.$sex.chr(13).chr(10); //chr(13) 是一個(gè)回車,Chr(10) 是個(gè)換行符,chr(32) 是一個(gè)空格符 $fp = fopen($file,'a'); //寫入方式在文件末尾追加信息 $boo = fwrite($fp,$tmp); fclose($fp); return $boo; } (3)storeuser()函數(shù)的作用是將用戶信息存為一個(gè)數(shù)組。格式為“用戶名,用戶性別”,參數(shù)$file是用戶列表文件。代碼如下: 復(fù)制代碼代碼如下: function storeuser($file){ $tmparr = file($file); //將文件內(nèi)容寫入數(shù)組 $userarr = array(); //創(chuàng)建數(shù)組 foreach($tmparr as $value){ //循環(huán)輸出數(shù)組內(nèi)容 $tmparr = explode('#',$value); //使用#拆分字符串 $userarr[] = $tmparr[0].','.$tmparr[2]; //將用戶名和用戶性別保存到新數(shù)組中 } return $userarr; } (4)addmess()函數(shù)將發(fā)言內(nèi)容寫入文件中。參數(shù)$file是保存的文件地址,$mess是要保存的內(nèi)容 復(fù)制代碼代碼如下: function addmess($file,$mess){ $fp = fopen($file,'a'); //以追加的形式打開文件 $boo = fwrite($fp,$mess.chr(13).chr(10)); //將信息寫入文件中 fclose($fp); //關(guān)閉文件 return boo; } (5)deluser()函數(shù)的作用是刪掉用戶。參數(shù)$file是保存的文件地址,$user是要?jiǎng)h除的用戶 復(fù)制代碼代碼如下: function deluser($file,$user){ $tmparr = file($file); //將文件內(nèi)容寫入數(shù)組 $rearr = array(); //創(chuàng)建數(shù)組 foreach($tmparr as $value){ //循環(huán)輸出數(shù)組內(nèi)容 $tmp = explode('#',$value); //使用#拆分字符串 if($tmp[0] != $user){ //如果變量中的用戶名和當(dāng)前用戶不相等 $rearr[] = $value; //將該用戶信息保存到新數(shù)組中 } } $fp = fopen($file,'w+'); //以只寫的方式打開文件 foreach($rearr as $value){ //循環(huán)數(shù)組 fwrite($fp,$value); //寫入數(shù)組內(nèi)容 } fclose($fp); //關(guān)閉文件 } (6)getRows()函數(shù)的作用是返回文件的行數(shù),參數(shù)$file是文件名 復(fù)制代碼代碼如下: function getRows($file){ if(file_exists($file)){ //如果文件存在 $fl = file($file); //將文件按行寫入數(shù)組 return count($fl); //求出數(shù)組長度并返回 }else{ return 0; //如果文件不存在,返回0
靈羊峰
你這個(gè)的話 index.php 得這么寫
<?phpheader('content-type:text/html;charset=utf-8');$actio = $_GET['actio']; $do = $_GET['do']; include $actio.'/'.$do.'.php';
學(xué)藝
<?php //直接輸出 echo exp(-0.5)?>
易靜
php有可用的websocket庫,不需要php-fpm。
目前比較成熟的有swoole(swoole.com),和workman(workman.net)
swoole是c寫的php擴(kuò)展, 效率比nodejs還要高,workman是純php實(shí)現(xiàn),兩者都號稱可以實(shí)現(xiàn)并發(fā)百萬TCP連接。
給你個(gè)例子:
這個(gè)要通過cmd運(yùn)行的 具體帶的參數(shù)有點(diǎn)忘記了<?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //創(chuàng)建一個(gè)socket連接 設(shè)置參數(shù) 綁定 監(jiān)聽 并且返回 $master = WebSocket("localhost",12345); //標(biāo)示是否已經(jīng)進(jìn)行過握手了 $is_shaked = false; //是否已經(jīng)關(guān)閉 $is_closed = true; //將socket變?yōu)橐粋€(gè)可用的socket while(true){ //如果是關(guān)閉狀態(tài)并且是沒有握手的話 則創(chuàng)建一個(gè)可用的socket(貌似第二個(gè)條件可以去除) if($is_closed && !$is_shaked){ if(($sock = socket_accept($master)) < 0){ echo "socket_accept() failed: reason: " . socket_strerror($sock) . "\n"; } //將關(guān)閉狀態(tài)修改為false $is_closed = false; } //開始進(jìn)行數(shù)據(jù)處理 process($sock); } //處理請求的函數(shù) function process($socket){ //先從獲取到全局變量 global $is_closed, $is_shaked; //從socket中獲取數(shù)據(jù) $buffer = socket_read($socket,2048); //如果buffer返回值為false并且已經(jīng)握手的話 則斷開連接 if(!$buffer && $is_shaked){ disconnect($socket); }else{ //如果沒有握手的話則握手 并且修改握手狀態(tài) if($is_shaked == false){ $return_str = dohandshake($buffer); $is_shaked = true; }else{ //如果已經(jīng)握手的話則送入deal函數(shù)中進(jìn)行相應(yīng)處理 $data_str = decode($buffer); //解析出來的從前端送來的內(nèi)容 console($data_str); $return_str = encode(deal($socket, $data_str)); //$return_str = encode($data_str); } //將應(yīng)該返回的字符串寫入socket返回 socket_write($socket,$return_str,strlen($return_str)); } } function deal($socket, $msgObj){ $obj = json_decode($msgObj); foreach($obj as $key=>$value){ if($key == 'close'){ disconnect($socket); console('close success'); return 'close success'; }else if($key == 'msg'){ console($value."\n"); return $value; } } } //獲取頭部信息 function getheaders($req){ $r=$h=$o=null; if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; } if(preg_match("/Host: (.*)\r\n/" ,$req,$match)){ $h=$match[1]; } if(preg_match("/Origin: (.*)\r\n/",$req,$match)){ $o=$match[1]; } if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$req,$match)){ $key=$match[1]; } if(preg_match("/\r\n(.*?)\$/",$req,$match)){ $data=$match[1]; } return array($r,$h,$o,$key,$data); } function WebSocket($address,$port){ $master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed"); socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed"); socket_bind($master, $address, $port) or die("socket_bind() failed"); socket_listen($master,20) or die("socket_listen() failed"); echo "Server Started : ".date('Y-m-d H:i:s')."\n"; echo "Master socket : ".$master."\n"; echo "Listening on : ".$address." port ".$port."\n\n"; return $master; } function dohandshake($buffer){ list($resource,$host,$origin,$key,$data) = getheaders($buffer); echo "resource is $resource\n"; echo "origin is $origin\n"; echo "host is $host\n"; echo "key is $key\n\n"; $response_key = base64_encode(sha1($key.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)); $return_str = "HTTP/1.1 101 Switching Protocols\r\n". "Upgrade: websocket\r\n". "Connection: Upgrade\r\n". "Sec-WebSocket-Accept: $response_key\r\n\r\n"; return $return_str; } function console($msg){ $msg = transToGBK($msg); echo "$msg\n"; return $msg; } function decode($msg="") { $mask = array(); $data = ""; $msg = unpack("H*",$msg); $head = substr($msg[1],0,2); if (hexdec($head{1}) === 8){ $data = false; } else if (hexdec($head{1}) === 1){ $mask[] = hexdec(substr($msg[1],4,2)); $mask[] = hexdec(substr($msg[1],6,2)); $mask[] = hexdec(substr($msg[1],8,2)); $mask[] = hexdec(substr($msg[1],10,2)); $s = 12; $e = strlen($msg[1])-2; $n = 0; for ($i= $s; $i<= $e; $i+= 2){ $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2))); $n++; } } return $data; } function encode($msg=""){ $frame = array(); $frame[0] = "81"; $msg .= ' is ok'; $len = strlen($msg); $frame[1] = $len<16?"0".dechex($len):dechex($len); $frame[2] = ord_hex($msg); $data = implode("",$frame); return pack("H*", $data); } function transToGBK($s){//UTF8->GBK //echo $s; return iconv("UTF-8", "GBK", $s); return $s; } function ord_hex($data){ $msg = ""; $l = strlen($data); for ($i=0; $i<$l; $i++){ //ord是返回字符串第一個(gè)字符的ascii值 //dechex把十進(jìn)制轉(zhuǎn)換為十六進(jìn)制 $msg .= dechex(ord($data{$i})); } return $msg; } function disconnect($socket){ global $is_shaked, $is_closed; $is_shaked = false; $is_closed = true; socket_close($socket); }?>
妖靈之力
兩種方式:
第一:使用一個(gè)文本文檔
每次讀取這個(gè)文本文檔的數(shù),然后加1,再覆蓋寫入
關(guān)鍵代碼:
<?php$txt_db = 'jsb.txt';$nums = file_get_contents($txt_db);$nums++;file_put_contents($txt_db,$nums);?>
第二:使用數(shù)據(jù)庫,設(shè)計(jì)數(shù)據(jù)表,每次更新數(shù)據(jù)庫。
個(gè)人建議:使用第一種方法。
原因:需求簡單,所以盡可能少占資源,抗壓力強(qiáng)。
涼柚
<!DOCTYPE html>body{<body><?php//設(shè)置級別錯(cuò)誤,通知類除外error_reporting('E_ALL&~E_NOTICE'); /**1---傳入頁碼,使用GET獲取**/$page=$_GET['p'];/**2---根據(jù)頁碼取出數(shù)據(jù):php->mysql處理**/$host="localhost";$username="root";$password="root";$db="db4"; //數(shù)據(jù)庫$mysql_table="person"; //數(shù)據(jù)表$table_guanjianzi="think"; //關(guān)鍵字$pageSize=10;$showPage=5; //連接數(shù)據(jù)庫,面向過程$conn=mysqli_connect($host,$username,$password);if(!$conn){echo "數(shù)據(jù)庫連接失敗";exit;}//選擇所要操作的數(shù)據(jù)庫mysqli_select_db($conn,$db);//設(shè)置數(shù)據(jù)庫編碼格式mysqli_query($conn,"SET NAMES UTF8");//編寫sql獲取分頁數(shù)據(jù) SELECT * FROM 表名 LIMIT 起始位置,顯示條數(shù)//注意:以下id,name,age,say都是字段節(jié)點(diǎn)名,person是表名,db4是數(shù)據(jù)庫名,think是指定的關(guān)鍵字.$sql = "SELECT id, name, age, sayFROM personWHERE say LIKE '%{$table_guanjianzi}%' order by id ASC LIMIT ".($page-1)*$pageSize .",{$pageSize}"; //雙引號能包單引號,反過來不行,會出錯(cuò)./// $sql = 'SELECT id, name, age, say// FROM person// WHERE say LIKE "%'think'%" order by id ASC LIMIT '.($page-1)*$pageSize .",{$pageSize}";// 節(jié)點(diǎn)名 關(guān)鍵字 節(jié)點(diǎn)名 可指定數(shù)量limit后可寫一個(gè)指定的數(shù)字//$sql="select * from $mysql_table"//$sql='select * from data where Id='.$id.' order by '.$item.' desc';//把sql語句傳送到數(shù)據(jù)庫$result=mysqli_query($conn,$sql);//將數(shù)據(jù)顯示到table中,并未table設(shè)置格式echo "<div class='content'>";echo "<table border=1 cellspacing=0 width=30% align=center>";echo "<tr><td>ID</td><td>NAME</td><td>say</td></tr>";while ($row = mysqli_fetch_assoc($result)) {echo "<tr>";echo "<td>{$row['id']}</td>";echo "<td>{$row['name']}</td>";echo "<td>{$row['say']}</td>";echo "<tr>";}echo "</table>";echo "</div>";//釋放結(jié)果mysqli_free_result($result);//獲取數(shù)據(jù)總條數(shù)$total_sql="SELECT COUNT(*)FROM $mysql_table";$total_result=mysqli_fetch_array(mysqli_query($conn,$total_sql));$total=$total_result[0];$total_pages=ceil($total/$pageSize);//關(guān)閉數(shù)據(jù)庫mysqli_close($conn);/**3---顯示數(shù)據(jù)+顯示分頁條**/$page_banner="<div class='page'>";//計(jì)算偏移量$pageoffset=($showPage-1)/2;//兩種情況下 首頁、上一頁 的顯示效果if($page>1){$page_banner .= "<a href='".$_SERVER['PHP_SELF']."?p=1'>首頁</a>";$page_banner .= "<a href='".$_SERVER['PHP_SELF']."?p=" .($page-1) . "'><上一頁</a>";}else{$page_banner .="<span class='disable'>首頁</span>";$page_banner .="<span class='disable'><上一頁</span>";}//顯示$start=1;$end=$total_pages;//當(dāng)總條數(shù)大于分頁數(shù)時(shí)if($total_pages>$showPage){if($page>$pageoffset+1){$page_banner .="...";}if($page>$pageoffset){$start=$page-$pageoffset;$end=$total_pages>$page+$pageoffset?$page+$pageoffset:$total_pages;//三段式}//最前面幾個(gè)特殊頁號的顯示。當(dāng)前指的是頁號1或者2時(shí)else{$start=1;$end=$showPage;}//最后面幾個(gè)特殊頁號的顯示,當(dāng)前顯示的是頁號7和8if($page+$pageoffset>$total_pages){$start=$start-($page+$pageoffset-$end);//注意理解這一句}}//顯示頁碼for($i=$start;$i<=$end;$i++){//當(dāng)前頁頁碼上顯示背景色if($page==$i){$page_banner .="<span class='current'>{$i}</span>";}//非當(dāng)前頁碼顯示else{$page_banner .= "<a href='".$_SERVER['PHP_SELF']."?p=" .$i . "'>{$i}</a>"; } }if($total_pages>$showPage&&$total_pages>$page+$pageoffset){$page_banner .="..."; }//兩種情況下的尾頁、下一頁 的顯示效果if($page<$total_pages){$page_banner .= "<a href='".$_SERVER['PHP_SELF']."?p=" .($page+1) . "'>下一頁></a>";$page_banner .= "<a href='".$_SERVER['PHP_SELF']."?p=$total_pages'>尾頁</a>";}else{$page_banner .="<span class='disable'>尾頁</span>";$page_banner .="<span class='disable'>下一頁></span>";}$page_banner .= "共{$total_pages}頁,";$page_banner .= "<form action='mypage.php' method='get'>";$page_banner .= " 到第<input type='text' size=2 value='1' name='p'>頁";$page_banner .= "<input type='submit' value='確定'>";$page_banner .= "</form>";$page_banner .= "</div>";echo $page_banner;?></body></html>
長風(fēng)洞
代碼如下:</form> <script>$("input[name='res']").click(); </script>
三盤經(jīng)
1、冒泡排序function bubble_sort($arr) { $n=count($arr); for($i=0;$i<$n-1;$i ){ for($j=$i 1;$j<$n;$j ) { if($arr[$j]<$arr[$i]) { $temp=$arr[$i]; $arr[$i]=$arr[$j]; $arr[$j]=$temp; } } } return $arr;}2、歸并排序function Merge(&$arr, $left, $mid, $right) { $i = $left; $j = $mid 1; $k = 0; $temp = array(); while ($i <= $mid && $j <= $right) { if ($arr[$i] <= $arr[$j]) $temp[$k ] = $arr[$i ]; else $temp[$k ] = $arr[$j ]; } while ($i <= $mid) $temp[$k ] = $arr[$i ]; while ($j <= $right) $temp[$k ] = $arr[$j ]; for ($i = $left, $j = 0; $i <= $right; $i , $j ) $arr[$i] = $temp[$j];} function MergeSort(&$arr, $left, $right){ if ($left < $right) { $mid = floor(($left $right) / 2); MergeSort($arr, $left, $mid); MergeSort($arr, $mid 1, $right); Merge($arr, $left, $mid, $right); }}3、二分查找-遞歸function bin_search($arr,$low,$high,$value) { if($low>$high) return false; else { $mid=floor(($low $high)/2); if($value==$arr[$mid]) return $mid; elseif($value<$arr[$mid]) return bin_search($arr,$low,$mid-1,$value); else return bin_search($arr,$mid 1,$high,$value); }}4、二分查找-非遞歸function bin_search($arr,$low,$high,$value) { while($low<=$high) { $mid=floor(($low $high)/2); if($value==$arr[$mid]) return $mid; elseif($value<$arr[$mid]) $high=$mid-1; else $low=$mid 1; } return false;}5、快速排序function quick_sort($arr) { $n=count($arr); if($n<=1) return $arr; $key=$arr[0]; $left_arr=array(); $right_arr=array(); for($i=1;$i<$n;$i ) { if($arr[$i]<=$key) $left_arr[]=$arr[$i]; else $right_arr[]=$arr[$i]; } $left_arr=quick_sort($left_arr); $right_arr=quick_sort($right_arr); return array_merge($left_arr,array($key),$right_arr);}6、選擇排序function select_sort($arr) { $n=count($arr); for($i=0;$i<$n;$i ) { $k=$i; for($j=$i 1;$j<$n;$j ) { if($arr[$j]<$arr[$k]) $k=$j; } if($k!=$i) { $temp=$arr[$i]; $arr[$i]=$arr[$k]; $arr[$k]=$temp; } } return $arr;}7、插入排序function insertSort($arr) { $n=count($arr); for($i=1;$i<$n;$i ) { $tmp=$arr[$i]; $j=$i-1; while($arr[$j]>$tmp) { $arr[$j 1]=$arr[$j]; $arr[$j]=$tmp; $j--; if($j<0) break; } } return $arr;}
周胤
<?php /** * Memcache 消息隊(duì)列類 */ class QMC { const PREFIX = 'ASDFASDFFWQKE'; /** * 初始化mc * @staticvar string $mc * @return Memcache */ static private function mc_init() { static $mc = null; if (is_null($mc)) { $mc = new Memcache; $mc->connect('127.0.0.1', 11211); } return $mc; } /** * mc 計(jì)數(shù)器,增加計(jì)數(shù)并返回新的計(jì)數(shù) * @param string $key 計(jì)數(shù)器 * @param int $offset 計(jì)數(shù)增量,可為負(fù)數(shù).0為不改變計(jì)數(shù) * @param int $time 時(shí)間 * @return int/false 失敗是返回false,成功時(shí)返回更新計(jì)數(shù)器后的計(jì)數(shù) */ static public function set_counter( $key, $offset, $time=0 ){ $mc = self::mc_init(); $val = $mc->get($key); if( !is_numeric($val) || $val < 0 ){ $ret = $mc->set( $key, 0, $time ); if( !$ret ) return false; $val = 0; } $offset = intval( $offset ); if( $offset > 0 ){ return $mc->increment( $key, $offset ); }elseif( $offset < 0 ){ return $mc->decrement( $key, -$offset ); } return $val; } /** * 寫入隊(duì)列 * @param string $key * @param mixed $value * @return bool */ static public function input( $key, $value ){ $mc = self::mc_init(); $w_key = self::PREFIX.$key.'W'; $v_key = self::PREFIX.$key.self::set_counter($w_key, 1); return $mc->set( $v_key, $value ); } /** * 讀取隊(duì)列里的數(shù)據(jù) * @param string $key * @param int $max 最多讀取條數(shù) * @return array */ static public function output( $key, $max=100 ){ $out = array(); $mc = self::mc_init(); $r_key = self::PREFIX.$key.'R'; $w_key = self::PREFIX.$key.'W'; $r_p = self::set_counter( $r_key, 0 );//讀指針 $w_p = self::set_counter( $w_key, 0 );//寫指針 if( $r_p == 0 ) $r_p = 1; while( $w_p >= $r_p ){ if( --$max < 0 ) break; $v_key = self::PREFIX.$key.$r_p; $r_p = self::set_counter( $r_key, 1 ); $out[] = $mc->get( $v_key ); $mc->delete($v_key); } return $out; } } /** 使用方法: QMC::input($key, $value );//寫入隊(duì)列 $list = QMC::output($key);//讀取隊(duì)列 */ ?>