最近面試了很多公司,正好把記得的問題作個總結。javascript
本文 github 會持續更新php
搜索 蘇生不惑 或者掃二維碼關注,每週更新。html
關於簡歷怎麼寫,知乎上有不少對應問題,能夠自行搜索,這裏推薦幾個簡歷相關的 repojava
$mail = 'test@sina.com'; //郵箱地址 $pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/"; preg_match($pattern, $mail, $matches); //驗證可使用 filter_var($email, FILTER_VALIDATE_EMAIL)
參考官網linux
看似有窮的小數, 在計算機的二進制表示裏倒是無窮的 http://www.cnblogs.com/datang...
echo serialize(0.1+0.7); //d:0.79999999999999993;nginx
ps cat tail top awklaravel
jsonp 和 corsgit
單例 工廠 策略 適配器 觀察者程序員
<?php //參考 https://www.cnblogs.com/Steven-shi/p/5858229.html class DBHelper { private $link; static private $_instance; // 鏈接數據庫 private function __construct($host, $username, $password) { $this->link = mysql_connect($host, $username, $password); $this->query("SET NAMES 'utf8'", $this->link); //echo mysql_errno($this->link) . ": " . mysql_error($link). "n"; //var_dump($this->link); return $this->link; } private function __clone() { } public static function get_class_nmdb($host, $username, $password) { //$connector = new nmdb($host, $username, $password); //return $connector; if (FALSE == (self::$_instance instanceof self)) { self::$_instance = new self($host, $username, $password); } return self::$_instance; } // 鏈接數據表 public function select_db($database) { $this->result = mysql_select_db($database); return $this->result; } // 執行SQL語句 public function query($query) { return $this->result = mysql_query($query, $this->link); } // 將結果集保存爲數組 public function fetch_array($fetch_array) { return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC); } // 得到記錄數目 public function num_rows($query) { return $this->result = mysql_num_rows($query); } // 關閉數據庫鏈接 public function close() { return $this->result = mysql_close($this->link); } } $connector = DBHelper::get_class_nmdb($host, $username, $password); $connector -> select_db($database); ?>
$arr=[5,2,8,1,9]; $len=count($arr); for($k=1;$k<$len;$k++) { for($j=0;$j<$len-$k;$j++){ if($arr[$j]<$arr[$j+1]){ list($arr[$j+1],$arr[$j])=[$arr[$j],$arr[$j+1]]; } } } print_r($arr);
利用 jwt 實現 session 共享,具體使用 jwt 參考 http://blog.leapoahead.com/20...
服務器負載 慢日誌 xhprof 慢sql
Memcache,Redis 都是內存數據庫
redis是一個開源的支持多種數據類型的key=>value的存儲數據庫。支持字符串、列表、集合、有序集合、哈希五種類型
memcache 只支持簡單的key/value數據結構,不像Redis能夠支持豐富的數據類型。
沒法進行持久化,數據不能備份,只能用於緩存使用,且重啓後數據所有丟失
高質量代碼三要素:可讀性,可維護性,可變動性 代碼質量評價:低耦合,高內聚 https://segmentfault.com/a/11...
php.net sf google
《Modern PHP》《PHP核心技術和最佳實踐》《PHP the right way》
laravel carbon queryphp等
索引的本質仍是提高查詢數據庫的速度,減小服務器I/O開銷
主鍵 惟一 普通 聯合
function mydump() { $args = func_num_args(); for($i = 0;$i < $args; $i ++) { $param = func_get_arg($i); switch(gettype($param)) { case 'NULL' : echo 'NULL'; break; case 'boolean' : echo ($param ? 'bool(true)' : 'bool(false)'); break; case 'integer' : echo "int($param)"; break; case 'double' : echo "float($param)"; break; case 'string' : dumpString($param); break; case 'array' : dumpArr($param); break; case 'object' : dumpObj($param); break; case 'resource' : echo 'resource'; break; default : echo 'UNKNOWN TYPE'; break; } } } function dumpString($param) { $str = sprintf("string(%d) %s",strlen($param),$param); echo $str; } function dumpArr($param) { $len = count($param); echo "array($len) {\r\n"; foreach($param as $key=>$val) { if(is_array($val)) { dumpArr($val); } else { echo sprintf('["%s"] => %s(%s)',$key,gettype($val),$val); } } echo "}\r\n"; } function dumpObj($param) { $className = get_class($param); $reflect = new ReflectionClass($param); $prop = $reflect->getDefaultProperties(); echo sprintf("Object %s #1(%d) {\r\n",$className,count($prop)); foreach($prop as $key=>$val) { echo "[\"$key\"] => "; mydump($val); } echo "}"; } class MyClass { protected $_name; function test() { echo "hello"; } } $str = "test"; mydump(new MyClass(),$str); echo "\r\n"; $arr2 = array( "1" => "Ddaddad", "one" => array("two" => "Dddd" ), "three" => 1 ); mydump($arr2); mydump(1,true,null);
用戶能夠關注他人 能夠發佈微博 能夠查看關注人的微博 能夠評論微博
用戶表 關注表 微博表 評論表
echo date('Y-m-d',strtotime('monday last week'));
echo date('Y-m-d', strtotime('-' . (6+date('w')) . ' days'));
echo date('Y-m-d',strtotime('sunday last week'));
array_values(rsort(array_unique(array_filter($arr))))
function unique_by_key($arr, $key1,$key2) { $tmp_key = []; foreach ($arr as $key => $item) { if ( in_array($item[$key1].$item[$key2], $tmp_key) ) { unset($arr[$key]); } else { $tmp_key[] = $item[$key1].$item[$key2]; } } return $arr; } //使用示例: $arr = array( array('id' => 1, 'title' => 'a','pubscore'=>1), array('id' => 2, 'title' => 'a','pubscore'=>1), array('id' => 3, 'title' => 'b','pubscore'=>2), array('id' => 4, 'title' => 'c','pubscore'=>3), array('id' => 5, 'title' => 'd','pubscore'=>3), ); print_r(unique_by_key($arr,'title','num'));
tar -cvf jpg.tar *.jpg
tar -xvf jpg.tar
php test.php & >test.log
ps -ef |grep spread |grep -v grep |awk '{print $2}'|xargs kill -9
kill -9 $(ps -ef | grep spread| grep -v grep | awk '{print $2}')
參考 https://segmentfault.com/a/11...
訂單表有以下字段
id 自增id
user_id 購買者id
product_id 商品id
time 購買時間
price 訂單總價
找出銷量大於1000的商品,按銷量倒序 和 找出消費最多的10個用戶
select product_id,count(*) s from orders group by product_id order by s having s>1000;
select user_id,sum(price) s from orders group by user_id order by s desc limit 10;
參考手冊 http://php.net/manual/zh/lang...
Accept 指定客戶端可以接收的內容類型 Accept: text/plain, text/html
Accept-Charset 瀏覽器能夠接受的字符編碼集。 Accept-Charset: iso-8859-5
Accept-Encoding 指定瀏覽器能夠支持的web服務器返回內容壓縮編碼類型。 Accept-Encoding: compress, gzip
Accept-Language 瀏覽器可接受的語言 Accept-Language: en,zh
Accept-Ranges 能夠請求網頁實體的一個或者多個子範圍字段 Accept-Ranges: bytes
Authorization HTTP受權的受權證書 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control 指定請求和響應遵循的緩存機制 Cache-Control: no-cache
Connection 表示是否須要持久鏈接。(HTTP 1.1默認進行持久鏈接) Connection: close
Cookie HTTP請求發送時,會把保存在該請求域名下的全部cookie值一塊兒發送給web服務器。 Cookie: $Version=1; Skin=new;
Content-Length 請求的內容長度 Content-Length: 348
Content-Type 請求的與實體對應的MIME信息 Content-Type: application/x-www-form-urlencoded
Date 請求發送的日期和時間 Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect 請求的特定的服務器行爲 Expect: 100-continue
From 發出請求的用戶的Email From: user@email.com
Host 指定請求的服務器的域名和端口號 Host: www.zcmhi.com
If-Match 只有請求內容與實體相匹配纔有效 If-Match: 「737060cd8c284d8af7ad3082f209582d」
If-Modified-Since 若是請求的部分在指定時間以後被修改則請求成功,未被修改則返回304代碼 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match 若是內容未改變返回304代碼,參數爲服務器先前發送的Etag,與服務器迴應的Etag比較判斷是否改變 If-None-Match: 「737060cd8c284d8af7ad3082f209582d」
If-Range 若是實體未改變,服務器發送客戶端丟失的部分,不然發送整個實體。參數也爲Etag If-Range: 「737060cd8c284d8af7ad3082f209582d」
If-Unmodified-Since 只在實體在指定時間以後未被修改才請求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards 限制信息經過代理和網關傳送的時間 Max-Forwards: 10
Pragma 用來包含實現特定的指令 Pragma: no-cache
Proxy-Authorization 鏈接到代理的受權證書 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只請求實體的一部分,指定範圍 Range: bytes=500-999
Referer 先前網頁的地址,當前請求網頁緊隨其後,即來路 Referer: http://www.zcmhi.com/archives...
TE 客戶端願意接受的傳輸編碼,並通知服務器接受接受尾加頭信息 TE: trailers,deflate;q=0.5
Upgrade 向服務器指定某種傳輸協議以便服務器進行轉換(若是支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-Agent User-Agent的內容包含發出請求的用戶信息 User-Agent: Mozilla/5.0 (Linux; X11)
Via 通知中間網關或代理服務器地址,通訊協議 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 關於消息實體的警告信息 Warn: 199 Miscellaneous warning
1.2.3.4
4.5.6.7
2.3.4.5
1.2.3.4
寫出 shell命令 統計 ip出現的次數 結果相似
1.2.3.4 2
4.5.6.7 1
2.3.4.5 1
awk '{arr[$1]++;}END{for(i in arr){print i , arr[i] }}' test.txt
unset 和 加載一個爲包含的文件
$arr=[1,2,3]; print_r(f($arr,3)); function f($arr,$num){ return array_filter(explode(',',str_repeat(implode(',',$arr).',',$num))); }
抽象類能夠實現的功能,接口也能夠實現。
抽象類的接口的區別,不在於編程實現,而在於程序設計模式的不一樣。
通常來說,抽象用於不一樣的事物,而接口用於事物的行爲。
參考 https://segmentfault.com/a/11...
一羣猴子排成一圈,按1,2,...,n依次編號。而後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去...,如此不停的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫作大王。要求編程模擬此過程,輸入m、n,輸出最後那個大王的編號
echo monkey(10,4);//5 function monkey($m,$n){ $arr=range(1,$m); $i=0; while(count($arr)>1){ if(($i+1)%$n==0){ unset($arr[$i]); }else{ $arr[]=$arr[$i]; unset($arr[$i]); } $i++; } return $arr[$i]; }
function quickSort($arr) { $len = count($arr); if($len <= 1) { return $arr; } $base = $min = $max = []; $base_item = $arr[0]; for($i = 0; $i < $len ; $i++) { if($arr[$i] < $base_item) { $min[] = $arr[$i]; }elseif($arr[$i] > $base_item) { $max[] = $arr[$i]; }else { $base[] = $arr[$i]; } } $min = quickSort($min); $max = quickSort($max); return array_merge($min,$base,$max); }
function fib($n) { if($n <= 0) return 0; if ($n <= 2) return 1; return fib($n - 1) + fib($n - 2); } function fib2($n) { if ($n <= 2) return 1; $arr = [0,1,1]; for ($i = 3; $i <= $n; $i++) { $arr[$i] = $arr[$i - 1] + $arr[$i - 2]; } return $arr[$n]; }
function binSearch($arr,$search){ $height=count($arr)-1; $low=0; while($low<=$height){ $mid=floor(($low+$height)/2);//獲取中間數 if($arr[$mid]==$search){ return $mid; }elseif($arr[$mid]<$search){//當中間值小於所查值時,則$mid左邊的值都小於$search,此時要將$mid賦值給$low $low=$mid+1; }elseif($arr[$mid]>$search){//中間值大於所查值,則$mid右邊的全部值都大於$search,此時要將$mid賦值給$height $height=$mid-1; } } return "查找失敗"; }
$user = array( array('id' => 100, 'username' => 'a1'), array('id' => 101, 'username' => 'a2'), array('id' => 102, 'username' => 'a3'), array('id' => 103, 'username' => 'a4'), array('id' => 104, 'username' => 'a5'), ); $result = array_reduce($user, function ($result, $value) { return array_merge($result, array_values($value)); }, array()); /* Array ( [0] => 100 [1] => a1 [2] => 101 [3] => a2 [4] => 102 [5] => a3 [6] => 103 [7] => a4 [8] => 104 [9] => a5 ) */ $result = []; array_walk_recursive($user, function($value) use (&$result) { array_push($result, $value); }); $result = []; array_map(function ($value) use (&$result) { $result = array_merge($result, array_values($value)); }, $user);
//參考https://segmentfault.com/q/1010000008279730 $arr = [1,2,3]; foreach($arr as &$v) { //nothing todo. } foreach($arr as $v) { //nothing todo. } var_export($arr); //output:array(0=>1,1=>2,2=>2)
nginx -s reload
使用遊標或者yield生成器來獲取數據庫的數據 https://segmentfault.com/a/11...
HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全。 參考 https://www.itcodemonkey.com/...
aof rdb http://www.hoohack.me/2018/04...
https://juejin.im/entry/5b35a...
user用戶表、role角色表、perm權限表、role-user用戶角色關聯表、role-perm角色權限關聯表
https://juejin.im/entry/5b34b...
nginx從入門到實踐 https://juejin.im/post/5a2600...
樂觀鎖(代碼處理)與悲觀鎖( select for update) http://www.hollischuang.com/a...
//解決:DateTime 或者 使用64位操做系統 $str_time = '2100-10-02'; function newStrToTime($str_time) { $result = strtotime($str_time); if(empty($result)) { $date = new DateTime($str_time); $result = $date->format('U'); } return $result; }
php 調用simplexml_load_string以前把外部引用實體關掉:
libxml_disable_entity_loader(true);
$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
* * * * * command
分 時 日 月 周 命令
工具 https://crontab-generator.org/
https://crontab.guru/
https://tool.lu/crontab/
https://atool.vip/crontab
緩存字節碼
trait的出現就是一種解決須要多繼承場景的方式。 使用場景是若是多個類都要用到一樣的屬性或者方法,這個時候使用Traits能夠方便的給類增長這些屬性或方法,而不用每一個類都去繼承一個類,若是說繼承類是豎向擴展一個類,那麼Traits是橫向擴展一個類,從而實現代碼複用。
https://www.cnblogs.com/kluan...
https://www.cnblogs.com/zhenb...
class Request extends Thread { public $url; public $response; public function __construct($url) { $this->url = $url; } public function run() { $this->response = file_get_contents($this->url); } } $ch = new Request("www.baidu.com"); $ch ->start();
瀏覽器輸入URL->Nginx(從配置文件中加載nginx的fast-cgi模塊)->php-fpm(fastcgi的進程管理器)
先到php-fpm的master進程(負責監聽端口,接收Nginx的請求,據子進程的狀態將請求分配給子進程去處理)->worker進程負責處理請求
worker 進程則通常有多個(具體數量根據實際須要配置),每一個進程內部都嵌入了一個 PHP 解釋器,是 PHP 代碼真正執行的地方。
master 進程作的事情是 PHP環境初始化、事件監聽(重啓/重載、關閉、分發請求)、子進程狀態
https://youngperson.github.io...
數據庫字段冗餘,增添索引、優化sql、分庫分表 主從分離
git add git log git pull git push git remote git checkout
好比標量類型聲明、返回類型聲明
spl_autoload_register composer
curl mb
curl_multi_exec
惰性刪除與按期刪除
type 字段 const、eq_reg、ref、range、index和ALL
爲何從上家公司離職?
將來三年的職業規劃的怎樣的?
你有什麼問的?
https://mp.weixin.qq.com/s/13...
strace幫助你調試PHP代碼
https://laravel-china.org/doc...
PHP 開發知識結構
https://segmentfault.com/a/11...
php 經典排序算法(解析)
SegmentFault 技術週刊 Vol.31 - 碼農也要學算法