在HTML中,Id屬性是一個非常重要的元素,它可以為網頁上的每個元素提供一個獨特的標識符。通過Id屬性,您可以精準地定位和操作特定的HTML元素,從而實現更細致的樣式控制和交互功能。本文將為您揭示Id屬性的魔力,教您如何利用它來打造出與眾不同的網頁體驗。
Id屬性的值必須在整個HTML文檔中是唯一的,這使它成為定位和操作特定元素的理想選擇。通常情況下,我們會為頁面中的重要元素如頁頭、導航欄、主內容區域等分別設置Id。
<header id="header">
<nav id="nav">
<ul>
<li><a href="#">首頁</a></li>
<li><a href="#">產品</a></li>
<li><a href="#">關于我們</a></li>
</ul>
</nav>
</header>
<main id="main">
<section id="hero">
<h1>歡迎來到我的網站</h1>
<p>這里是網站的主要內容區域</p>
</section>
</main>
有了Id屬性,您可以在CSS中直接針對特定元素進行樣式定制。這種精準的選擇器使您能夠更好地控制網頁的視覺效果。
#header {
background-color: #333;
color: #fff;
padding: 20px;
}
#nav ul {
list-style-type: none;
display: flex;
}
#nav li a {
color: #fff;
text-decoration: none;
padding: 10px 20px;
}
#hero {
background-color: #f2f2f2;
padding: 50px;
text-align: center;
}
除了CSS,Id屬性在JavaScript中也扮演著重要的角色。通過Id,您可以快速地獲取和操作特定的HTML元素,實現各種交互效果。
<button id="myButton">點擊我</button>
const button = document.getElementById('myButton');
button.addEventListener('click', () => {
alert('您點擊了按鈕!');
});
在使用Id屬性時,有幾個需要注意的最佳實踐:
總之,HTML Id屬性是一個非常強大的工具,它可以為網頁元素提供獨特的標識,從而幫助您實現精細化的樣式控制和交互功能。只要掌握好它的用法,相信您一定能打造出令人驚嘆的網頁作品。
生成關于html中OnClick的頭條爆款文章
好的,我為您生成了一篇關于HTML中onClick事件的頭條爆款文章,以下是完整內容:
在HTML中,onClick事件是一種非常強大的交互功能,它可以讓您的網頁元素在用戶點擊時執行各種自定義的操作。無論是彈出提示框、切換樣式還是觸發復雜的交互效果,onClick事件都能輕松搞定。本文將為您揭示onClick事件的魔力,教您如何利用它打造出引人入勝的網頁體驗。
onClick事件最常見的應用就是為按鈕添加點擊響應。當用戶點擊按鈕時,就會觸發預先定義好的JavaScript代碼,從而實現所需的功能。
<button onclick="showMessage()">點擊我</button>
function showMessage() {
alert('您點擊了按鈕!');
}
除了按鈕,您還可以為其他HTML元素如鏈接、圖片等添加onClick事件,讓整個網頁變得生動有趣。
onClick事件的真正威力在于它能與JavaScript無縫結合,實現各種復雜的交互效果。您可以利用JavaScript操作DOM,動態地改變元素的樣式、內容甚至觸發其他事件。
<div id="box" class="box">這是一個盒子</div>
<button onclick="toggleBox()">切換盒子</button>
function toggleBox() {
const box = document.getElementById('box');
box.classList.toggle('active');
}
在這個例子中,當用戶點擊按鈕時,JavaScript會切換盒子元素的樣式類,從而實現顯示/隱藏的交互效果。
除了基本的交互,onClick事件還可以用于觸發更復雜的功能,如表單提交、數據請求、動畫效果等。您可以將onClick事件與其他事件監聽器、API調用等技術相結合,打造出令人驚叩的網頁體驗。
<form onsubmit="submitForm(event)">
<input type="text" id="name" placeholder="請輸入您的名字" />
<button type="submit">提交</button>
</form>
function submitForm(event) {
event.preventDefault(); // 阻止表單默認提交行為
const nameInput = document.getElementById('name');
const name = nameInput.value;
// 執行表單提交的其他邏輯
console.log(`您的名字是: ${name}`);
}
在使用onClick事件時,有幾個需要注意的最佳實踐:
總之,HTML onClick事件是一個非常強大的交互工具,它可以讓您的網頁元素煥發生機,變得更加生動有趣。
.請自我介紹一下?
答:我叫 xxx,來自北京,20xx 年畢業于 xx 大學計算機 xx 系,畢業后在武漢從事了 x 年的 php 開發工作,公司是一個外包公司,主要做微信開發,公眾號推廣,商城,論壇的開發
2.你在公司負責那些項目?
答:由于我們公司是一個外包公司,不可能只做一個項目,公司的項目都是交叉進行的,論壇,微信,商城我都做過?
3.你為什么來深圳?
答:因為我哥在這邊,父母也希望兄弟間有個照應,而且深圳是一線城市,技術也比廣西前沿一些
4.武漢使用什么前端框架和后端框架?
答:根據自己的區域回答
5.你做過那些模塊?
答:登陸注冊,商品管理,購物車模塊,訂單管理
6.你們公司是使用什么框架?
答:我們公司采用的是 TP 框架,運用的 mysql+apache+php 進行開發,因為 TP 框架是一個免費開源的,輕量級的 php 開發框架,而且是我們中國人自己開發的,也是國內用的比較多的,各種資料也比較齊全
7.mvc 是什么?相互間有什么關系?
答:mvc 是一種開發模式,主要分為三部分:m(model),也就是模型,負責數據的操作;v(view),也就是視圖,負責前后臺的顯示;c(controller),也就是控制器,負責業務邏輯 客戶端請求項目的控制器,如果執行過程中需要用到數據,控制器就會到模型中獲取數據,再將獲取到的數據通過視圖顯示出來
8.oop 是什么?
答:oop 是面向對象編程,面向對象編程是一種計算機編程架構,OOP 的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或對象組合而成。 OOP 具有三大特點 1、封裝性:也稱為信息隱藏,就是將一個類的使用和實現分開,只保留部分接口和方法與外部聯系,或者說只公開了一些供開發人員使用的方法。于是開發人員只 需要關注這個類如何使用,而不用去關心其具體的實現過程,這樣就能實現 MVC 分工合作,也能有效避免程序間相互依賴,實現代碼模塊間松藕合。 2、繼承性:就是子類自動繼承其父級類中的屬性和方法,并可以添加新的屬性和方法或者對部分屬性和方法進行重寫。繼承增加了代碼的可重用性。PHP 只支持單繼承,也就是說一個子類只能有一個父類。 3、多態性:子類繼承了來自父級類中的屬性和方法,并對其中部分方法進行重寫。于是多個子類中雖然都具有同一個方法,但是這些子類實例化的對象調用這些相同的方法后卻可以獲得完全不同的結果,這種技術就是多態性。多態性增強了軟件的靈活性。 1、易維護 采用面向對象思想設計的結構,可讀性高,由于繼承的存在,即使改變需求,那么維護也只是在局部模塊,所以維護起來是非常方便和較低成本的。 2、質量高 在設計時,可重用現有的,在以前的項目的領域中已被測試過的類使系統滿足業務需求并具有較高的質量。 3、效率高 在軟件開發時,根據設計的需要對現實世界的事物進行抽象,產生類。使用這樣的方法解決問題,接近于日常生活和自然的思考方式,勢必提高軟件開發的效率和質量。 4、易擴展 由于繼承、封裝、多態的特性,自然設計出高內聚、低耦合的系統結構,使得系統更靈活、更容易擴展,而且成本較低。
9.smarty 是什么,有什么作用?
答:回答一:smarty 是用 php 寫出來的模板引擎,也是目前業界最著名的 php 模板引擎之一 它分離了邏輯代碼和外在的顯示,提供了一種易于管理和使用的方法,用來將混雜的 php 邏輯代碼與 html 代碼進行分離 回答二:smarty 是 php 中最著名的引擎框架之一,我們公司使用的是 TP 框架,已經封裝好了 smarty 模板,所以沒有單獨使用過 回答三: smarty 是個模板引擎,最顯著的地方就是有可以把模板緩存起來。一般模板來說,都是做一個靜態頁面,然后在里面把一些動態的部分用一切分隔符切開,然后在 PHP 里打開這個模板文件,把分隔符里面的值替換掉,然后輸出來,你可以看下 PHPLib 里面的 template 部分。 而 smarty 設定了緩存參數以后,第一次運行時候會把模板打開,在 php 替換里面值的時候把讀取的 html 和 php 部分重新生成一個臨時的 php 文件,這樣就省去了每次打開都重新讀取 html 了。如果修改了模板,只要重新刷下就行了。
10.TP 框架有哪些優點?
答:TP 框架是我們中國人自己開發的框架,各種資料比較齊全,國內用的比較多,比較簡單和方便,而且是免費開源的
11.TP 的特性有哪些?
答: 1.多表查詢非常方便,在 model 中幾句代碼就可以完成對多表的關聯操作 2.融合了 smarty 模板,使前后臺分離 3.支持多種緩存技術,尤其對 memcache 技術支持非常好 4.命名規范,模型,視圖,控制器嚴格遵循命名規則,通過命名一一對應 5.支持多種 url 模式 6.內置 ajax 返回方法,包括 xml,json,html 等 7.支持應用擴展,類庫擴展,驅動擴展等
12.TP 框架中的大字母函數?
答: U:對 url 的組裝 A:內部實例化控制器 S:緩存處理 R:調用某個控制器的操作方法 D:實例化自定義模型類 M:實例化基礎模型類 I:獲取參數 L:設置或者獲取當前語言 C:設置或獲取,保存配置
13.請介紹一下 laravel 框架?
答: laravel 框架的設計思想比較先進,非常適合應用各種開發模式,作為一個框架,它為你準備好了一切,composer 是 php 的未來,沒有 composer,php 肯定要走向沒落 laravel 框架最大的特點和優秀之處就是集合了 php 比較新的特點,以及各種各樣的設計模式,Ioc 模式,依賴注入等
14.laravel 有那些特點?
答:回答一: 1.強大的 rest router:用簡單的回調函數就可以調用,快速綁定 controller 和 router 2.artisan:命令行工具,很多手動的工作都自動化 3.可繼承的模板,簡化 view 的開發和管理 4.blade 模板:渲染速度更快 5.ORM 操作數據庫 6.migration:管理數據庫和版本控制 7.測試功能也很強大 8.composer 也是亮點 回答二: laravel 框架引入了門面,依賴注入,Ioc 模式,以及各種各樣的設計模式等
15.請簡述一下數據庫的優化?
答:數據庫的優化可以從四個方面來優化: 1.從結構層: web 服務器采用負載均衡服務器,mysql 服務器采用主從復制,讀寫分離 2.從儲存層: 采用合適的存儲引擎,采用三范式 3.從設計層: 采用分區分表,索引,表字段合適的字段屬性,適當采用逆范式,開啟 mysql 緩存 4.sql 語句層:結果一樣的情況下,采用效率高,速度快節省資源的 sql 語句執行
16.如何解決異常處理?
答: 拋出異常:使用 try...catch,異常的代碼放在 try 代碼塊內,如果沒有觸發異常,則代碼繼續執行,如果異常被觸發,就會拋出一個異常。Catch 代碼塊捕獲異常,并創建一個包含異常信息的對象。$e->getMessage(),輸出異常的錯誤信息。 解決異常:使用 set_error_handler 函數獲取異常(也可以使用 try()和 catch()函數),然后使用 set_exception_handler()函數設置默認的異常處理程序,register_shutdown_function()函數來執行,執行機制是,php 要把調入的函數調入到內存,當頁面所有的 php 語句都執行完成時,再調用此函數
17.前端
答:我在工作中處理前端的功能,一般就是用 ajax 向后臺請求數據,然后返回數據在前臺頁面中顯示出來。我從來沒有獨立的完整的將 html 和 css 樣式都一個人完成,如果公司實在有這樣的需求的話,我可能會找一些前臺的模板或者說是前端的框架,比如說 h—ui 等等
18.權限管理(RBAC)的實現?
答: 1.首先創建一張用戶表:id name auto(保存格式為:控制器-方法) 2.然后在后臺中創建一個基類控制器,控制器里封裝一個構造方法,當用戶登陸成功后,使用 TP 框架中封裝好的 session 函數獲取保存在服務器中的 session id,然后實例化模型,通過用戶 id 獲取保存在數據表中的 auth 數據,使用 explode 函數分割獲取到的數據,并使用一個數組保存起來,然后使用 TP 框架中封裝好的常量獲取當前控制器和方法,然后把他們組裝成字符串,使用 in_array 函數進行判斷該數組中是否含有當前獲取到的控制器和方法,如果沒有,就提示該用戶沒有權限,如果有就進行下一步操作
19.支付功能的實現?
答:
20.怎么保證促銷商品不會超賣
答:這個問題是我們當時開發時遇到的一個難點,超賣的原因主要是下的訂單的數目和我們要促銷的商品的數目不一致導致的,每次總是訂單的數比我們的促銷商品的數目要多,當時我們的小組討論了好久,給出了好幾個方案來實現: 第一種方案是:①在每次下訂單前我們判斷促銷商品的數量夠不夠,不夠不允許下訂單,更改庫存量時加上一個條件,只更改商品庫存大于 0 的商品的庫存,當時我們使用 ab 進行壓力測試,當并發超過 500,訪問量超過 2000 時,還是會出現超賣現象。所以被我們否定了。 第二種方案是:②使用 mysql 的事務加排他鎖來解決,首先我們選擇數據庫的存儲引擎為 innoDB,使用的是排他鎖實現的,剛開始的時候我們測試了下共享鎖,發現還是會出現超賣的現象。有個問題是,當我們進行高并發測試時,對數據庫的性能影響很大,導致數據庫的壓力很大,最終也被我們否定了。 第三種方案是:③使用文件鎖實現。當用戶搶到一件促銷商品后先觸發文件鎖,防止其他用戶進入,該用戶搶到促銷品后再解開文件鎖,放其他用戶進行操作。這樣可以解決超賣的問題,但是會導致文件得 I/O 開銷很大。 最后我們使用了 redis 的隊列來實現。將要促銷的商品數量以隊列的方式存入 redis 中,每當用戶搶到一件促銷商品則從隊列中刪除一個數據,確保商品不會超賣。這個操作起來很方便,而且效率極高,最終我們采取這種方式來實現
21.商城秒殺的實現
答:搶購、秒殺是如今很常見的一個應用場景,主要需要解決的問題有兩個: 1 高并發對數據庫產生的壓力 2 競爭狀態下如何解決庫存的正確減少(”超賣”問題) 對于第一個問題,已經很容易想到用緩存來處理搶購,避免直接操作數據庫,例如使用 Redis。 第二個問題,我們可以使用 redis 隊列來完成,把要秒殺的商品放入到隊列中,因為 pop 操作是原子的,即使有很多用戶同時到達,也是依次執行,文件鎖和事務在高并發下性能下降很快,當然還要考慮其他方面的東西,比如搶購頁面做成靜態的,通過 ajax 調用接口,其中也可能會出現一個用戶搶多次的情況,這時候需要再加上一個排隊隊列和搶購結果隊列及庫存隊列。高并發情況下,將用戶進入排隊隊列,用一個線程循環處理從排隊隊列取出一個用戶,判斷用戶是否已在搶購結果隊列,如果在,則已搶購,否則未搶購,庫存減 1,寫數據庫,將用戶入結果隊列。
22.購物車的原理
答:購物車相當于現實中超市的購物車,不同的是一個是實體車,一個是虛擬車而已。用戶可以在購物網站的不同頁面之間跳轉,以選購自己喜愛的商品,點擊購買時,該商品就自動保存到你的購物車中,重復選購后,最后將選中的所有商品放在購物車中統一到付款臺結賬,這也是盡量讓客戶體驗到現實生活中購物的感覺。服務器通過追蹤每個用戶的行動,以保證在結賬時每件商品都物有其主。 主要涉及以下幾點: 1、把商品添加到購物車,即訂購 2、刪除購物車中已定購的商品 3、修改購物車中某一本圖書的訂購數量 4、清空購物車 5、顯示購物車中商品清單及數量、價格 實現購物車的關鍵在于服務器識別每一個用戶并維持與他們的聯系。但是 HTTP 協議是一種“無狀態(Stateless)”的協議,因而服務器不能記住是誰在購買商品,當把商品加入購物車時,服務器也不知道購物車里原先有些什么,使得用戶在不同頁面間跳轉時購物車無法“隨身攜帶”,這都給購物車的實現造成了一定的困難。 目前購物車的實現主要是通過 cookie、session 或結合數據庫的方式。下面分析一下它們的機制及作用。 cookie cookie 是由服務器產生,存儲在客戶端的一段信息。它定義了一種 Web 服務器在客戶端存儲和返回信息的機制,cookie 文件它包含域、路徑、生存期、和由服務器設置的變量值等內容。當用戶以后訪問同一個 Web 服務器時,瀏覽器會把 cookie 原樣發送給服務器。通過讓服務器讀取原先保存到客戶端的信息,網站能夠為瀏覽者提供一系列的方便,例如在線交易過程中標識用戶身份、安全要求不高的場合避免用戶重復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告等等。利用 cookie 的特性,大大擴展了 WEB 應用程序的功能,不僅可以建立服務器與客戶機的聯系,因為 cookie 可以由服務器定制,因此還可以將購物信息生成 cookie 值存放在客戶端,從而實現購物車的功能。用基于 cookie 的方式實現服務器與瀏覽器之間的會話或購物車,有以下特點: 1、cookie 存儲在客戶端,且占用很少的資源,瀏覽器允許存放 300 個 cookie,每個 cookie 的大小為 4KB,足以滿足購物車的要求,同時也減輕了服務器的負荷; 2、cookie 為瀏覽器所內置,使用方便。即使用戶不小心關閉了瀏覽器窗口,只要在 cookie 定義的有效期內,購物車中的信息也不會丟失; 3、cookie 不是可執行文件,所以不會以任何方式執行,因此也不會帶來病毒或攻擊用戶的系統; 4、基于 cookie 的購物車要求用戶瀏覽器必須支持并設置為啟用 cookie,否則購物車則失效; 5、存在著關于 cookie 侵犯訪問者隱私權的爭論,因此有些用戶會禁止本機的 cookie 功能。 session session 是實現購物車的另一種方法。session 提供了可以保存和跟蹤用戶的狀態信息的功能,使當前用戶在 session 中定義的變量和對象能在頁面之間共享,但是不能為應用中其他用戶所訪問,它與 cookie 最重大的區別是,session 將用戶在會話期間的私有信息存儲在服務器端,提高了安全性。在服務器生成 session 后,客戶端會生成一個 sessionid 識別號保存在客戶端,以保持和服務器的同步。這個 sessionid 是只讀的,如果客戶端禁止 cookie 功能,session 會通過在 URL 中附加參數,或隱含在表單中提交等其他方式在頁面間傳送。因此利用 session 實施對用戶的管理則更為安全、有效。 同樣,利用 session 也能實現購物車,這種方式的特點是: 1、session 用新的機制保持與客戶端的同步,不依賴于客戶端設置; 2、與 cookie 相比,session 是存儲在服務器端的信息,因此顯得更為安全,因此可將身份標示,購物等信息存儲在 session 中; 3、session 會占用服務器資源,加大服務器端的負載,尤其當并發用戶很多時,會生成大量的 session,影響服務器的性能; 4、因為 session 存儲的信息更敏感,而且是以文件形式保存在服務器中,因此仍然存在著安全隱患。 結合數據庫的方式 這也是目前較普遍的模式,在這種方式中,數據庫承擔著存儲購物信息的作用,session 或 cookie 則用來跟蹤用戶。這種方式具有以下特點: 1、數據庫與 cookie 分別負責記錄數據和維持會話,能發揮各自的優勢,使安全性和服務器性能都得到了提高; 2、每一個購物的行為,都要直接建立與數據庫的連接,直至對表的操作完成后,連接才釋放。當并發用戶很多時,會影響數據庫的性能,因此,這對數據庫的性能提出了更高的要求; 3、使 cookie 維持會話有賴客戶端的支持。 各種方式的選擇: 雖然 cookie 可用來實現購物車,但必須獲得瀏覽器的支持,再加上它是存儲在客戶端的信息,極易被獲取,所以這也限制了它存儲更多,更重要的信息。所以一般 cookie 只用來維持與服務器的會話,例如國內最大的當當網絡書店就是用 cookie 保持與客戶的聯系,但是這種方式最大的缺點是如果客戶端不支持 cookie 就會使購物車失效。 Session 能很好地與交易雙方保持會話,可以忽視客戶端的設置。在購物車技術中得到了廣泛的應用。但 session 的文件屬性使其仍然留有安全隱患。 結合數據庫的方式雖然在一定程度上解決了上述的問題,但從上面的例子可以看出:在這種購物流程中涉及到對數據庫表的頻繁操作,尤其是用戶每選購一次商品,都要與數據庫進行連接,當用戶很多的時候就加大了服務器與數據庫的負荷。
23.redis 消息隊列先進先出需要注意什么
答:通常使用一個 list 來實現隊列操作,這樣有一個小限制,所以的任務統一都是先進先出,如果想優先處理某個任務就不太好處理了,這就需要讓隊列有優先級的概念,我們就可以優先處理高級別的任務,實現方式有以下幾種方式: 1)單一列表實現:隊列正常的操作是 左進右出(lpush,rpop)為了先處理高優先級任務,在遇到高級別任務時,可以直接插隊,直接放入隊列頭部(rpush),這樣,從隊列頭部(右側)獲取任務時,取到的就是高優先級的任務(rpop) 2)使用兩個隊列,一個普通隊列,一個高級隊列,針對任務的級別放入不同的隊列,獲取任務時也很簡單,redis 的 BRPOP 命令可以按順序從多個隊列中取值,BRPOP 會按照給出的 key 順序查看,并在找到的第一個非空 list 的尾部彈出一個元素,redis> BRPOP list1 list2 0 list1 做為高優先級任務隊列 list2 做為普通任務隊列 這樣就實現了先處理高優先級任務,當沒有高優先級任務時,就去獲取普通任務 方式 1 最簡單,但實際應用比較局限,方式 3 可以實現復雜優先級,但實現比較復雜,不利于維護 方式 2 是推薦用法,實際應用最為合適
24.你負責的模塊有哪些難題
答:在我負責的 B2B 電商項目中,當時我負責的是訂單模塊,由于客戶一次選擇了多家商戶的商品,最終生成了一個訂單,這樣我們平臺在給商戶結算時出現了不知道這比費用應該給哪個商戶,這時候我們小組經過討論,需要涉及到訂單拆分,也就是說用戶點擊支付后,如果有多件商品,并且不是同一家店鋪那么 就要用到訂單的拆分,比如如果有兩件商品,并且不是同一店鋪 就在原來的訂單號下 在生成兩個子訂單號 并修改訂單表中兩件商品的訂單號。最終實現了商品的分配管理,解決了我們的難題。 我覺得在開發過程中,遇到的難題無非是兩個,一個是技術層次的,我認為,只要你有恒心,有熱心,沒有覺得不了的難題。另一個就是溝通問題,在任何地方任何時候溝通都是最重要的,尤其是我們做開發的,不溝通好,會影響整個項目的進度,我本人是個非常還溝通的人,所以這點上也沒多大問題。
25.用戶下單是怎么處理的
答:判斷用戶有沒有登錄,在沒有登錄的情況下,不允許下單。登陸后,可進行下單,并生成唯一的訂單號,此時訂單的狀態為未支付。
26.電商的登錄是怎么實現的
答:分為普通登錄和第三方登錄 這邊主要說一下第三方登錄吧,第三方登陸主要使用的是 author 協議,我就以 QQ 的第三方登陸為例來進行說明:當用戶在我們的站點請求 QQ 的第三方登陸時,我們站點會引導用戶跳轉到 QQ 的登陸授權界面, 當用戶輸入 QQ 和密碼成功登錄以后會自動跳回到我們站點設置好的回調頁面,并附帶一個 code 參數,接著你使用 code 再次去請求 QQ 的授權頁面,就可以從中獲取到一個 access token(訪問令牌),通過這個 access_token,我們可以調用 QQ 提供給我們的接口,比如獲取 open_id,可以獲取用戶的基本信息。獲取到之后,我們需要拿用戶的授權信息和 open_id 和我們平臺的普通用戶進行綁定。這樣不管是普通用戶登陸還是第三方登陸用戶,都可以實現登陸。
27.接口安全方面是怎么處理的
答:我們當時是這么做的,使用 HTTP 的 POST 方式,對固定參數+附加參數進行數字簽名,使用的是 md5 加密,比如:我想通過標題獲取一個信息,在客戶端使用 信息標題+日期+雙方約定好的一個 key 通過 md5 加密生成一個簽名(sign),然后作為參數傳遞到服務器端,服務器端使用同樣的方法進行校驗,如何接受過來的 sign 和我們通過算法算的值相同,證明是一個正常的接口請求,我們才會返回相應的接口數據。
28.用的什么技術實現短信發送,在哪調用
答:我主要用的第三方短信接口,在申請接口時進行相應信息的配置,然后在我們站點需要用到短信驗證的地方進行調用,我們通常在用戶注冊時使用到。
29.在工作中遇到什么困難?
答:總體來說:在工作我主要遇到這幾個問題比較難處理: ①我之前工作的時候發現經常會出現一些臨時需求打亂了我的計劃,搞得有時候這個任務還沒完成,又得去做其他的任務,最后一天下來,大大小小的東西是很多,但是沒有完成得非常好的,后面我總結了一下,我會把這些都添加優先級,遇到臨時需求,按照優先級重新將已有任務和臨時任務進行排版,保證在規定時間內有效率的完成優先級高的任務。 ②在做項目需求時候,遇到理解能力欠佳的人,溝通時容易被氣到,影響自己的情緒,最后反倒還不能到達需要的效果。后面,每次到這種時候,我一般會借助一些紙質的、更加形象的東西,讓雙方都認同的、都能明白的一種方式來進行溝通,后面減少了很多不必須的麻煩。大家都知道,對于程序員來說,改需求是一件很痛苦的事情,所以前期的溝通工作很重要。 ③還有一件事時,我以前的領導不太懂技術,所以每次出一個新的需求出來,總是要求我們在很短的時間內完成,完不成我們就會被懷疑能力有問題。當然,每個領導都希望自己的員工能夠盡快的完成任務,降低成本,提高效率。這時候我會把我們的需求細化,把其中的重點、難點都列出來,做好時間規劃,耐心的跟領導溝通,項目每個點的重要性和時間的花費比例,確保在這個規劃的時間點內保質保量的完成任務。慢慢的也得到了領導的認可,其實領導也不是一味的不通情理,只要把東西計劃好了,以最小的代價換取最高的價值,每個人都是很容易理解得
30.用戶不登錄,怎么直接加入購物車的
答:用戶在不登錄的情況下,可以把要購買商品的信息(如商品的 ID,商品的價格、商品的 sku_id,購買數量等關鍵數據)存到 COOKIE 里面,當登陸的情況下。把 COOKIE 里面的內容存到數據庫,并清除 cookie 中的數據。
31.寫過接口嗎,怎么定義接口的
答:寫過。接口分為兩種:一種是數據型接口,一種是應用型接口。 數據型接口:是比抽象類更抽象的某種“結構”——它其實不是類,但是跟類一樣的某種語法結構,是一種結構規范,規范我們類要以什么格式進行定義,一般用于團隊比較大,分支比較多的情況下使用。 應用型接口: API(application interface) 數據對外訪問的一個入口 我主要是參與的 APP 開發中接口的編寫,客戶端需要什么樣的數據,我們就給他們提供相應的數據,數據以 json/xml 的格式返回,并且配以相應的接口文檔。
32.sku 減庫存
答:SKU = Stock Keeping Unit (庫存量單位) 即庫存進出計量的單位,可以是以件,盒,托盤等為單位。SKU 是庫存量單位,區分單品。 在服裝、鞋類商品中使用最多最普遍。 例如紡織品中一個 SKU 通常表示:規格、顏色、款式。 在設計表時,不僅僅只有商品表,商品表中有個總庫存,我們還需要涉及一張 SKU 表,里面有 SKU 庫存和單價字段,用戶每購買一件商品,實際上購買的都是 SKU 商品,這樣在下訂單成功后,應該根據所購買的商品的唯一的 SKU 號來進行相應的 SKU 庫存的減少,當然商品的總庫存保存在商品主表中,也需要減少總庫存中的庫存量。
33.庫存設置?
答:庫存分為商品總庫存和 SKU 庫存,往往商品總庫存的為 SKU 庫存的總和。一般在商城的后臺對貨品設置最高庫存及最低庫存后,當前庫存數量與最高、最低兩者比較,超出庫存或者低于庫存的,則被統計成報表形式反映,便于用戶掌握貨品庫存超、短缺狀態及數量。
34.訂單、庫存兩個表 如何保證數據的一致性?
答:在一個電子商務系統中,正常的應該是訂單生成成功后,相應的庫存進行減少。必須要保證兩者的一致性,但有時候因為某些原因,比如程序邏輯問題,并發等問題,導致下單成功而庫存沒有減少的情況。這種情況我們是不允許發生的,MySQL 中的事務剛好可以解決這一問題,首先得選擇數據庫的存儲引擎為 innoDB,事務規定了只有下訂單完成了,并且相應的庫存減少了才允許提交事務,否則就事務回滾,確保數據一致性。
35.O2O 用戶下單,c 端下單,如何保證 b a 端數據一致?
答:O2O 為線上和線下模式,O2O 模式奉行的是“線上支付+實體店消費”的消費模式,即消費者在網上下單完成支付后,憑消費憑證到實體店消費。O2O 模式是把商家信息和支付程序放在線上進行,而把商品和服務兌現放在線下,也就是說 O2O 模式適用于快遞無法送達的有形產品。數據一致性的問題是 O2O 行業中最常見的問題,我們可以類似于數據庫的主從復制的思路來解決這個問題。O2O 有個供應商系統,類似于主服務器,在 C 端(從服務器)下單時,數據同步更新到供應商系統端,b、a 實時從供應商系統中拉取數據進行同步,比如利用定時任務,定時拉取數據進行同步。
36.Redis 如何防止高并發
答:其實 redis 是不會存在并發問題的,因為他是單進程的,再多的 command 都是 one by one 執行的。我們使用的時候,可能會出現并發問題,比如 get 和 set 這一對。 redis 為什么會有高并發問題 redis 的出身決定 Redis 是一種單線程機制的 nosql 數據庫,基于 key-value,數據可持久化落盤。由于單線程所以 redis 本身并沒有鎖的概念,多個客戶端連接并不存在競爭關系,但是利用 jedis 等客戶端對 redis 進行并發訪問時會出現問題。發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由于客戶端連接混亂造成。 同時,單線程的天性決定,高并發對同一個鍵的操作會排隊處理,如果并發量很大,可能造成后來的請求超時。 在遠程訪問 redis 的時候,因為網絡等原因造成高并發訪問延遲返回的問題。 解決辦法 在客戶端將連接進行池化,同時對客戶端讀寫 Redis 操作采用內部鎖 synchronized。 服務器角度,利用 setnx 變向實現鎖機制。
37.秒殺當中的細節你是怎么得出來的
答:通過性能測試及模擬秒殺場景。每個問題都經過反復測試,不斷的發現問題,不斷的解決。
38.做秒殺用什么數據庫,怎么實現的。
答:因為秒殺的一瞬間,并發非常大,如果同時請求數據庫,會導致數據庫的壓力非常大,導致數據庫的性能急劇下降,更嚴重的可能會導致數據庫服務器宕機。這時候一般采用內存高速緩存數據庫 redis 來實現的,redis 是非關系型數據庫,redis 是單線程的,通過 redis 的隊列可以完成秒殺過程。
39.支付寶流程怎么實現的
答:首先要有一個支付寶賬號,接下來向支付寶申請在線支付業務,簽署協議。協議生效后有支付寶一方會給網站方一個合作伙伴 ID,和安全校驗碼,有了這兩樣東西就可以按照支付寶接口文檔開發支付寶接口了,中間主要涉及到一個安全問題。整個流程是這樣的:我們的網站通過 post 傳遞相應的參數(如訂單總金額,訂單號)到支付頁面,支付頁面把一系列的參數經過處理,以 post 的方式提交給支付寶服務器,支付寶服務器進行驗證,并對接收的數據進行處理,把處理后的結果返回給我們網站設置的異步和同步回調地址,通過相應的返回參數,來處理相應的業務邏輯,比如返回的參數代表支付成功,更改訂單狀態。
40.什么是單點登錄?
答:單點登錄 SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄后,就不用在其他系統中登錄,也就是用戶的一次登錄能得到其他所有系統的信任。
41.什么情況下使用緩存
答:當用戶第一次訪問應用系統的時候,因為還沒有登錄,會被引導到認證系統中進行登錄;根據用戶提供的登錄信息,認證系統進行身份校驗,如果通過校驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候,就會將這個 ticket 帶上,作為自己認證的憑據,應用系統接受到請求之后會把 ticket 送到認證系統進行校驗,檢查 ticket 的合法性。如果通過校驗,用戶就可以在不用再次登錄的情況下訪問應用系統 2 和應用系統 3 了。 實現主要技術點: 1、兩個站點共用一個數據驗證系統 2、主要通過跨域請求的方式來實現驗證及 session 處理。
42.怎么實現第三方登錄?
答:第三方登陸主要是基于 author 協議來實現,下面簡單說下實現流程: 1、首先我們需要以開發者的身份向第三方登陸平臺申請接入應用,申請成功后,我們會獲得一個 appID 和一個 secrectID. 2、當我們的網站需接入第三方登陸時,會引導用戶跳轉到第三方的登陸授權頁面,此時把之前申請的 appID 和 secrectID 帶給登陸授權頁面。 3、用戶登陸成功后即得到授權,第三方會返回一個臨時的 code 給我們的網站。 4、我們的網站接受到 code 后,再次向我們的第三方發起請求,并攜帶接收的 code,從第三方獲取 access_token. 5、第三方處理請求后,會返回一個 access_token 給我們的網站,我們的網站獲取到 access_token 后就可以調用第三方提供的接口了,比如獲取用戶信息等。最后把該用戶信息存入到我們站點的數據庫,并把信息保存到 session 中,實現用戶的第三方登陸。
43.如何處理負載、高并發?(好好看看,經常問到,能回答到主要的東西即可)
答:從低成本、高性能和高擴張性的角度來說有如下處理方案: 1、HTML 靜態化 其實大家都知道,效率最高、消耗最小的就是純靜態化的 html 頁面,所以我們盡可能使我們的 網站上的頁面采用靜態頁面來實現,這個最簡單的方法其實也是最有效的方法。 2、圖片服務器分離 把圖片單獨存儲,盡量減少圖片等大流量的開銷,可以放在一些相關的平臺上,如騎牛等 3、數據庫集群和庫表散列及緩存 數據庫的并發連接為 100,一臺數據庫遠遠不夠,可以從讀寫分離、主從復制,數據庫集群方面來著手。另外盡量減少數據庫的訪問,可以使用緩存數據庫如 memcache、redis。 4、鏡像: 盡量減少下載,可以把不同的請求分發到多個鏡像端。 5、數據庫優化 6、負載均衡: Apache 的最大并發連接為 1500,只能增加服務器,可以從硬件上著手,如 F5 服務器。當然硬件的成本比較高,我們往往從軟件方面著手。 負載均衡 (Load Balancing) 建立在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增加吞吐量、加強網絡數據處理能力,同時能夠提高網絡的靈活性和可用性。目前使用最為廣泛的負載均衡軟件是 Nginx、LVS、HAProxy。我分別來說下三種的優缺點:
Nginx 的優點是:
Nginx 的缺點是:
LVS:使用 Linux 內核集群實現一個高性能、高可用的負載均衡服務器,它具有很好的可伸縮性(Scalability)、可靠性(Reliability)和可管理性(Manageability)。
LVS 的優點是:
LVS 的缺點是:
HAProxy 的特點是:
① roundrobin,表示簡單的輪詢,這個不多說,這個是負載均衡基本都具備的;
② static-rr,表示根據權重,建議關注;
③ leastconn,表示最少連接者先處理,建議關注;
④ source,表示根據請求源 IP,這個跟 Nginx 的 IP_hash 機制類似,我們用其作為解決 session 問題的一種方法,建議關注;
⑤ ri,表示根據請求的 URI;
⑥ rl_param,表示根據請求的 URl 參數’balance url_param’ requires an URL parameter name;
⑦ hdr(name),表示根據 HTTP 請求頭來鎖定每一次 HTTP 請求;
⑧ rdp-cookie(name),表示根據據 cookie(name)來鎖定并哈希每一次 TCP 請求。
Nginx 和 LVS 對比的總結:
44.做秒殺時鎖表考慮到沒有?
答:考慮到了,當時我們做秒殺時考慮了好幾種方案,其中有一種就是使用事務加上排他鎖來實現。 架構類的東西接觸過嗎? 有接觸過,曾經自己在自己的服務器上配置過。我以前做過以下幾個架構方面的配置和測試; 1、數據庫的讀寫分離、主從復制及集群。 2、Nginx 負載均衡 3、redis 集群及主從
45.封裝過一個簡單的框架
答;封裝過一個簡單的 MVC 框架,主要分為 3 層,控制器層和模型層視圖層,以及路由的分配和入口文件,模板引擎,單例模式、工廠模式,第三方類庫的引入等。
46.談談對 MVC 的認識
答:核心思想是:視圖和用戶交互通過事件導致控制器改變 控制器改變導致模型改變 或者控制器同時改變兩者 模型改變 導致視圖改變 或者視圖改變 潛在的從模型里面獲得參數 來改變自己。他的好處是可以將界面和業務邏輯分離。 Model(模型),是程序的主體部分,主要包含業務數據和業務邏輯。在模型層,還會涉及到用戶發布的服務,在服務中會根據不同的業務需求,更新業務模型中的數據。 View(視圖),是程序呈現給用戶的部分,是用戶和程序交互的接口,用戶會根據具體的業務需求,在 View 視圖層輸入自己特定的業務數據,并通過界面的事件交互,將對應的輸入參數提交給后臺控制器進行處理。 Contorller(控制器),Contorller 是用來處理用戶 輸入數據,已經更新業務模型的部分。控制器中接收了用戶與界面交互時傳遞過來的數據,并根據數據業務邏輯來執行服務的調用和更新業務模型的數據和狀態。
47.session 與 cookie 的區別
答:1、cookie 數據存放在第三方應用的瀏覽器上,session 數據放在服務器上。 2、cookie 不是很安全,別人可以分析存放在本地的 COOKIE,進行 COOKIE 欺騙 考慮到安全應當使用 session。 3、session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用 COOKIE。 4、單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存 20 個 cookie。 5、所以個人建議: 將登陸信息等重要信息存放為 SESSION 其他信息如果需要保留,可以放在 COOKIE
48.echo(),print(),print_r()的區別
答:echo 可以一次輸出多個值,多個值之間用逗號分隔。echo 是語言結構(language construct),而并不是真正的函數,因此不能作為表達式的一部分使用。echo 是 php 的內部指令,不是函數,無返回值。 print():函數 print()打印一個值(它的參數),如果字符串成功顯示則返回 true,否則返回 false。只能打印出簡單類型變量的值(如 int,string),有返回值 printf():源于 C 語言中的 printf()。該函數輸出格式化的字符串。 print_r()和 var_dump() print_r()可以把字符串和數字簡單地打印出來,而數組則以括起來的鍵和值得列表形式顯示,并以 Array 開頭。但 print_r()輸出布爾值和 NULL 的結果沒有意義,因為都是打印"\n"。因此用 var_dump()函數更適合調試。print_r 是函數,可以打印出比較復雜的變量(如數組,對象),有返回值 var_dump()判斷一個變量的類型與長度,并輸出變量的數值,如果變量有值輸的是變量的值并回返數據類型。此函數顯示關于一個或多個表達式的結構信息,包括表達式的類型與值。數組將遞歸展開值,通過縮進顯示其結構。
49.說一下單引號雙引號?
答:①單引號內部的變量不會執行, 雙引號會執行 ②單引號解析速度比雙引號快。 ③單引號只能解析部分特殊字符,雙引號可以解析所有特殊字符。
50.索引的優缺點
答:1、優點:
a)可以保證數據庫表中每一行的數據的唯一性
b)可以大大加快數據的索引速度
c)加速表與表之間的連接,物別是在實現數據的參考完事性方面特別有意義
d)在使用分組和排序子句進行數據檢索時,同樣可以顯著減少查詢中分組和排序的時間
f)通過使用索引,可以在時間查詢的過程中,使用優化隱藏器,提高系統的性能
2、 缺點:
a) 創建索引和維護索引要耗費時間,這種時間隨著數據量的增加而增加
b) 索引需要占物理空間,除了數據表占用數據空間之外,每一個索引還要占用一定的物理空間,如果需要建立聚簇索引,那么需要占用的空間會更大
c) 以表中的數據進行增、刪、改的時候,索引也要動態的維護,這就降低了整數的維護速度
d) 建立索引的原則
e) 在經常需要搜索的列上,可以加快搜索的速度
f) 在作為主鍵的列上,強制該列的唯一性和組織表中數據的排列結構
g) 在經常用在連接的列上,這些列主要是一外鍵,可以加快連接的速度
h) 在經經常需要根據范圍進行搜索的列上創建索引,國為索引已經排序,其指定的范圍是連續的
i) 在經常需要排序的列上,國為索引已經排序,這樣井底可以利用索引的排序,加快排序井底時間
j) 在經常使用在 where 子句中的列上,加快條件的判斷速度
|| 內容轉載網絡 ||
ttpd 2.4.6 + mysql-5.5.28 + php-5.4.19編譯安裝過程:
一、編譯安裝apache
1、解決依賴關系
httpd-2.4.4需要較新版本的apr和apr-util,因此需要事先對其進行升級。升級方式有兩種,一種是通過源代碼編譯安裝,一種是直接升級rpm包。
(1) 編譯安裝apr
# tar xf apr-1.4.6.tar.bz2
# cd apr-1.4.6
# ./configure --prefix=/usr/local/apr
# make && make install
(2) 編譯安裝apr-util
# tar xf apr-util-1.4.1.tar.bz2
# cd apr-util-1.4.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
(3) httpd-2.4.6編譯過程也要依賴于pcre-devel軟件包,需要事先安裝。此軟件包系統光盤自帶,因此,找到并安裝即可。
2、編譯安裝httpd-2.4.6
# tar xf httpd-2.4.4.tar.bz2 -C /usr/local
# cd /usr/local/httpd-2.4.4
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=most(將most更改為all,否則會出錯) --with-mpm=event
# make && make install
補充:
(1)構建MPM為靜態模塊
在全部平臺中,MPM都可以構建為靜態模塊。在構建時選擇一種MPM,鏈接到服務器中。如果要改變MPM,必須重新構建。為了使用指定的MPM,請在執行configure腳本 時,使用參數 --with-mpm=NAME。NAME是指定的MPM名稱。編譯完成后,可以使用 ./httpd -l 來確定選擇的MPM。 此命令會列出編譯到服務器程序中的所有模塊,包括 MPM。
(2)構建 MPM 為動態模塊
在Unix或類似平臺中,MPM可以構建為動態模塊,與其它動態模塊一樣在運行時加載。 構建 MPM 為動態模塊允許通過修改LoadModule指令內容來改變MPM,而不用重新構建服務器程序。在執行configure腳本時,使用--enable-mpms-shared選項即可啟用此特性。當給出的參數為all時,所有此平臺支持的MPM模塊都會被安裝。還可以在參數中給出模塊列表。默認MPM,可以自動選擇或者在執行configure腳本時通過--with-mpm選項來指定,然后出現在生成的服務器配置文件中。編輯LoadModule指令內容可以選擇不同的MPM。
3、修改httpd的主配置文件,設置其Pid文件的路徑
編輯/etc/httpd/httpd.conf,添加如下行即可:
PidFile "/var/run/httpd.pid"
4、提供SysV服務腳本/etc/rc.d/init.d/httpd,內容如下:
#!/bin/bash
#
# httpd Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d 10 $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=$?
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
fi
echo
}
# See how we were called.
case "" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f ${pidfile} ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL
而后為此腳本賦予執行權限:
# chmod +x /etc/rc.d/init.d/httpd
加入服務列表:
# chkconfig --add httpd
接下來就可以啟動服務進行測試了。
二:編譯安裝php-5.4.13
1、解決依賴關系:
請配置好yum源(可以是本地系統光盤)后執行如下命令:
# yum -y groupinstall "X Software Development"
yum groupinstall "Server Platform Development" "Developmenttools" "Desktop Platform Development"
安裝數據加密等擴展工具:libmcrypt、mhash、mcrypt
2、編譯安裝php-5.4.13
# tar xf php-5.4.19.tar.bz2
# cd php-5.4.19
# ./configure --prefix=/usr/local/php --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --enable-fpm --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --with-openssl --with-apxs2=/usr/local/apache/bin/apxs --enable-maintainer-zts
說明:
1、這里為了支持apache的worker或event這兩個MPM,編譯時使用了--enable-maintainer-zts選項。
2、如果使用PHP5.3以上版本,為了鏈接MySQL數據庫,可以指定mysqlnd,這樣在本機就不需要先安裝MySQL或MySQL開發包了。mysqlnd從php 5.3開始可用,可以編譯時綁定到它(而不用和具體的MySQL客戶端庫綁定形成依賴),但從PHP 5.4開始它就是默認設置了。
# ./configure --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd
# make
# make test
# make intall
為php提供配置文件:
# cp php.ini-production /etc/php.ini
3、 編輯apache配置文件httpd.conf,以apache支持php
# vim /etc/httpd/httpd.conf
1、添加如下二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
2、定位至DirectoryIndex index.html
修改為:
DirectoryIndex index.php index.html
而后重新啟動httpd,或讓其重新載入配置文件即可測試php是否已經可以正常使用。
4、配置php-fpm
1、為php-fpm提供腳本:
cp /usr/local/php-5.4.19/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod +x /etc/init.d/php-fpm
2、提供php-fpm配置文件并編輯
cp /usr/local/ php-5.4.19/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
vim /usr/local/php-5.4.19/etc/php-fpm.conf
pm.max_children = 150
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pid = /usr/local/php/var/run/php-fpm.pid
3、啟動php-fpm服務
Service php-fpm start
*請認真填寫需求信息,我們會在24小時內與您取得聯系。