上海汽車城無人駕駛汽車測試基地舉行開園儀式

6月7日上午,由工信部批准的國內首個“國家智慧網聯汽車(上海)試點示範區”封閉測試區在嘉定舉行了開園儀式。測試基地可以為無人駕駛汽車提供綜合性的測試場地和功能要求,集多種測試功能場景、DSRC和LTE-V等V2X通訊技術、覆蓋安全、效率、資訊服務和新能源汽車應用等四類領域的封閉測試區(一期)正式投入運營。

此次開放的一期測試場地,建設了1個GPS差分基站、2座LTE-V通訊基站、16套DSRC和4套LTE-V路側單元、6個智慧紅綠燈和40個各類攝像頭,整個園區道路實現了北斗系統的釐米級定位和WIFI的全覆蓋,完成了隧道、林蔭道、加油/充電站、地下停車場、十字路口、丁字路口、圓形環島等模擬交通場景,可以為無人駕駛、自動駕駛和V2X網聯汽車提供29種場景的測試驗證。

據瞭解,上海國際汽車城將計畫到2020年,開發出覆蓋整個汽車城100平方公里的智慧網聯汽車綜合性典型城市的示範區,並探索連接與虹橋樞紐的共用交通走廊,這意味著中國的智慧聯網和無人駕駛汽車從國家戰略高度正式進入實操階段。

此次揭牌的“智慧網聯汽車標準規範測試與研究基地”也將成為中國智慧網聯汽車標準規範的承載主體,推動相關產品、技術標準走向成熟。示範區目前正在承擔和進行中的國家重大專項、上海市級重點專案18項,涉及公共服務平臺、資料中心、關鍵技術研究和標準規範制定等多個方面。

同時,作為國內首個智慧聯網和無人駕駛試點城市,將以嘉定為中心佈局汽車全產業鏈,嘉定也將成為中國智慧汽車和無人駕駛的國家級“孵化器”。

中國汽車技術中心“智慧網聯汽車標準規範測試與研究基地”揭牌後,未來智慧汽車和無人駕駛在滬已明確將完成“四步走”規劃:

第一階段是封閉測試階段,目前正在進行中。在嘉定汽車博覽公園、同濟大學嘉定校區等5平方公里範圍內,測試車輛達到200輛左右,封閉道路15公里,模擬智慧網聯汽車在高速+城市+鄉村試跑狀況;預計今年年內將進一步完善通訊網路、交通道路等基礎設施,演示場景增至50種,為智慧網聯以及無人駕駛等技術應用最終進入城市綜合示範區打下基礎。

第二階段是開放道路測試階段。從今年9月到明年底,將圍繞汽車城核心區博園路、墨玉南路、汽車•創新港等36個模擬封閉交通場景,實現1000輛車在27平方公里面積內73公里左右的車輛上路實測,最終實現國內首個功能完備的智慧網聯汽車測試示範公共服務平臺。

第三階段從2018年到2019年底,則將開始典型城市綜合示範區試驗。測試示範區的面積將在安亭汽車城核心區的基礎上拓展至安亭鎮全區,投入5000輛車在包括高速路在內的100平方公里範圍內試跑,基本建成基於智慧城市理念與要求下的智慧網聯汽車區域性測試示範公共服務平臺,初步打造智慧網聯汽車產業集群,成為全國區域性智慧網聯汽車標準化產業基地。

最後第四階段到2020年,真正在滬建成示範城市及交通走廊。以安亭到虹橋樞紐為中心,10000輛車的示範道路累計增加到約500公里,建設兩條共用走廊將兩個區域連接起來形成閉環,最終建成區域性、相對獨立、功能齊全的智慧網聯汽車測試示範公共服務平臺,形成初具規模的智慧網聯汽車產業集群。

資料顯示,在2015年10月,位於汽車城的一個占地面積12萬平方米的汽車智慧園區汽車•創新港正式開園,半年不到的時間內聚集了包括蔚來汽車、上汽阿裡斑馬汽車、樂視汽車等新型的造車企業迅速聚集於此。

 

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

全球速度最快電動汽車 時速達644km

據報導,最近摩納哥跑車廠商Venturi開發出了全球速度最快的電動汽車。

這輛名為Venturi Buckeye Bullet 3(VBB3)的電動汽車,由Venturi的Formula E電動方程式團隊和俄亥俄州立大學的汽車研究中心聯合打造而成。該車之前的模型曾在2010年創造了全球電動汽車陸上行駛速度記錄:307英里每小時(mph)。但當前模型的預估速度為372mph,將輕鬆打破這一記錄。Venturi的目標是令VBB3的速度最終達到400mph(約合644km/hr)。

不過高速電動汽車也有一些自己的優勢。和其他電動車一樣,VBB3產生的熱量遠比同等功率的汽油引擎更少,因此VBB3無需冷卻通風口。不過這並不意味著該車“很冷”,實際上,其內部系統包含許多石油潤滑機制和一隻每次行駛前都要加滿冰的箱子。

去年,由於開採和氣候變化等因素造成美國邦納維爾鹽鹼灘退化,Venturi無法對VBB3進行測試,他們希望今年夏天時情況會好一些,這樣他們就能繼續其追求速度的征程。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

特斯拉:Model 3 不太可能如期交車

3 月 31 對外發表「親民平價」電動車 Model 3 後,下單數量暴增,特斯拉〈Tesla〉在短短一周後狂接 32.5 萬筆訂單,最近一次公布的數字更高達 40 萬筆訂單,如此驚人的數字,不僅打破電動車市場紀錄,也挑戰了車業過往的訂單紀錄。於此同時,外界也在質疑,特斯拉真能準時出貨交車嗎?   這個答案恐怕要讓已經下訂 Model 3 的消費者失望了。特斯拉執行長馬斯克〈Elon Musk〉於 5 月 4 日表示,原先預期 Model 3 第一批訂於 2017 年 7 月 1 日交車,但因車輛出廠牽扯到供應鏈是否能如期交單,以及組裝時間是否如預期,因此,「Model 3 不太可能如期交車」。   馬斯克指出,Model 3 的設計上,沒有其他現有車款 Model S 與 Model X 複雜,但能否準時交車,還是得仰賴生產零件的供應鏈端是否如期交貨,若供應鏈無法達到預期目標,特斯拉會在位於加州費利蒙〈Fremont〉的生產工廠自行製造所需零件。   馬斯克預期,2017 年 Model 3 的初期生產量將達 10 萬至 20 萬輛,且 2018 年產出將擴增至 50 萬輛。   此外,為了讓全球的出貨更有效率,馬斯克提到,等到位於加州費利蒙的工達到最大化生產,可能會考慮在中國或歐洲設廠點,以滿足各地的出貨需求。

(首圖來源:)

(本文授權轉載自《》─〈〉)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

戴姆勒、特斯拉聯合開發電動版奔馳B級開始投產

電動版奔馳B級是戴姆勒繼Smart ForTwo電動版之後的第二款純電動車,由戴姆勒和特斯拉聯合開發,其電動馬達由特斯拉提供,今年將先後在美國和歐洲上市。

電動版奔馳B級擁有大約200公里的續航里程,0到100km/h加速僅需時7.9秒,最高速度為160km/h。其電動馬達由特斯拉提供,規律達174馬力,同寶馬i3電動車的規律相比還高出8馬力。目前戴姆勒尚未公佈新款奔馳B級電動車的售價。

電動版奔馳B級由戴姆勒位於德國的拉施塔特(Rastatt)工廠負責生產,汽油、柴油及天然氣版本的奔馳B級也在該工廠投產。據戴姆勒一名女發言人透露,電動版奔馳B級在其整個生命週期中的產量預計將達到五位數。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

Python語言基礎05-函數和模塊的使用

本文收錄在

在分享本章節的內容之前,先來研究一道數學題,請說出下面的方程有多少組正整數解。

事實上,上面的問題等同於將8個蘋果分成四組每組至少一個蘋果有多少種方案。想到這一點問題的答案就呼之欲出了。

可以用Python的程序來計算出這個值,代碼如下所示。

"""
輸入M和N計算C(M,N)

Version: 0.1
Author: along
"""
m = int(input('m = '))
n = int(input('n = '))
fm = 1
for num in range(1, m + 1):
    fm *= num
fn = 1
for num in range(1, n + 1):
    fn *= num
fmn = 1
for num in range(1, m - n + 1):
    fmn *= num
print(fm // fn // fmn)

輕鬆得出答案為:35

 

1. 函數的作用

  不知道大家是否注意到,在上面的代碼中,我們做了3次求階乘,這樣的代碼實際上就是重複代碼。編程大師Martin Fowler先生曾經說過:“代碼有很多種壞味道,重複是最壞的一種!”,要寫出高質量的代碼首先要解決的就是重複代碼的問題。對於上面的代碼來說,我們可以將計算階乘的功能封裝到一個稱之為“函數”的功能模塊中,在需要計算階乘的地方,我們只需要“調用”這個“函數”就可以了。

1.1 定義函數

  在Python中可以使用def關鍵字來定義函數,和變量一樣每個函數也有一個響亮的名字,而且命名規則跟變量的命名規則是一致的。在函數名後面的圓括號中可以放置傳遞給函數的參數,這一點和數學上的函數非常相似,程序中函數的參數就相當於是數學上說的函數的自變量,而函數執行完成后我們可以通過return關鍵字來返回一個值,這相當於數學上說的函數的因變量。

在了解了如何定義函數后,我們可以對上面的代碼進行重構,所謂重構就是在不影響代碼執行結果的前提下對代碼的結構進行調整,重構之後的代碼如下所示。

def factorial(num):
    """求階乘"""
    result = 1
    for i in range(1, num + 1):
        result *= i
    return result

m = int(input('m = '))
n = int(input('n = '))
# 當需要計算階乘的時候不用再寫循環求階乘而是直接調用已經定義好的函數
print(factorial(m) // factorial(n) // factorial(m - n))

  說明: Python的math模塊中其實已經有一個factorial函數了,事實上要計算階乘可以直接使用這個現成的函數而不用自己定義。下面例子中的一些函數在Python中也都是現成的,我們這裡是為了講解函數的定義和使用才把它們又實現了一遍,實際開發中不建議做這種低級的重複性的工作。

 

2. 函數的參數

  函數是絕大多數編程語言中都支持的一個代碼的”構建塊”,但是Python中的函數與其他語言中的函數還是有很多不太相同的地方,其中一個顯著的區別就是Python對函數參數的處理。在Python中,函數的參數可以有默認值,也支持使用可變參數,所以Python並不需要像其他語言一樣支持,因為我們在定義一個函數的時候可以讓它有多種不同的使用方式,下面是兩個小例子。

from random import randint

def roll_dice(n=2):
    """搖色子"""
    total = 0
    for _ in range(n):
        #print(_)
        total += randint(1, 6)
        #print(total)
    return total

def add(a=0, b=0, c=0):
    """三個數相加"""
    return a + b + c


# 如果沒有指定參數那麼使用默認值搖兩顆色子
print(roll_dice())
# 搖三顆色子
print(roll_dice(3))
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
# 傳遞參數時可以不按照設定的順序進行傳遞
print(add(c=50, a=100, b=200))

  我們給上面兩個函數的參數都設定了默認值,這也就意味着如果在調用函數的時候如果沒有傳入對應參數的值時將使用該參數的默認值,所以在上面的代碼中我們可以用各種不同的方式去調用add函數,這跟其他很多語言中函數重載的效果是一致的。

 

2.1 函數的可變參數

  其實上面的add函數還有更好的實現方案,因為我們可能會對0個或多個參數進行加法運算,而具體有多少個參數是由調用者來決定,我們作為函數的設計者對這一點是一無所知的,因此在不確定參數個數的時候,我們可以使用可變參數,代碼如下所示。

# 在參數名前面的*表示args是一個可變參數
def add(*args):
    result = 0
    for num in args:
        result += num
    return(result)

# 在調用add函數時可以傳入0個或多個參數
print(add())
print(add(1))
print(add(1, 2))
print(add(1, 2, 3))
print(add(1, 3, 5, 7, 9))

 

3. 用模塊管理函數

  對於任何一種編程語言來說,給變量、函數這樣的標識符起名字都是一個讓人頭疼的問題,因為我們會遇到命名衝突這種尷尬的情況。最簡單的場景就是在同一個.py文件中定義了兩個同名函數,由於Python沒有函數重載的概念,那麼後面的定義會覆蓋之前的定義,也就意味着兩個函數同名函數實際上只有一個是存在的。

def foo():
    print('hello, world!')

def foo():
    print('goodbye, world!')

# 下面的代碼會輸出什麼呢?
foo()

   當然上面的這種情況我們很容易就能避免,但是如果項目是由多人協作進行團隊開發的時候,團隊中可能有多個程序員都定義了名為foo的函數,那麼怎麼解決這種命名衝突呢?答案其實很簡單,Python中每個文件就代表了一個模塊(module),我們在不同的模塊中可以有同名的函數,在使用函數的時候我們通過import關鍵字導入指定的模塊就可以區分到底要使用的是哪個模塊中的foo函數,代碼如下所示。

(1)先在同級目錄下,創建2個py文件

module1.py

def foo():
    print('hello world')

module2.py

def foo():
    print('goodbye world')

 

(2)直接使用模塊使用函數

test.py

from module1 import foo
foo()

from module2 import foo
foo()

 

(3)也可以按照如下所示的方式來區分到底要使用哪一個foo函數。

test.py

import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

 

(4)但是如果將代碼寫成了下面的樣子,那麼程序中調用的是最後導入的那個foo,因為後導入的foo覆蓋了之前導入的foo。

test.py

from module1 import foo
from module2 import foo

foo()

from module2 import foo
from module1 import foo

# 輸出hello, world!
foo()

  需要說明的是,如果我們導入的模塊除了定義函數之外還中有可以執行代碼,那麼Python解釋器在導入這個模塊時就會執行這些代碼,事實上我們可能並不希望如此,因此如果我們在模塊中編寫了執行代碼,最好是將這些執行代碼放入如下所示的條件中,這樣的話除非直接運行該模塊,if條件下的這些代碼是不會執行的,因為只有直接執行的模塊的名字才是”__main__”。

module3.py

def foo():
    pass

def bar():
    pass

# __name__是Python中一個隱含的變量它代表了模塊的名字
# 只有被Python解釋器直接執行的模塊的名字才是__main__
if __name__ == '__main__':
    print('call foo()')
    foo()
    print('call bar()')
    bar()

test.py

import module3
# 導入module3時 不會執行模塊中if條件成立時的代碼 因為模塊的名字是module3而不是__main__

 

4. 練習

練習1

實現計算求最大公約數和最小公倍數的函數。

參考答案:

def gcd(x, y):
    """求最大公約數"""
    #(x, y) = (y, x) if x > y else (x, y)
    if x > y:
        (x, y) = (y, x)
    else:
        (x, y)
    for factor in range(x, 0, -1):
        if x % factor == 0 and y % factor == 0:
            return factor

def lcm(x, y):
    """求最小公倍數"""
    return x * y // gcd(x, y)

print(gcd(9,12))
print(lcm(9,12))

 

練習2

實現判斷一個數是不是迴文數的函數。

參考答案:

def is_palindrome(num):
    """
    判斷一個數是不是迴文數
    迴文數是指將一個正整數從左往右排列和從右往左排列值一樣的數
    """
    temp = num
    total = 0
    while temp > 0:
        total = total * 10 + temp % 10
        temp //= 10
    return total == num

 

練習3

實現判斷一個數是不是素數的函數。

參考答案:

def is_prime(num):
    """判斷一個數是不是素數"""
    for factor in range(2, num):
        if num % factor == 0:
            return False
    return True if num != 1 else False

print(is_prime(1))

 

練習4

寫一個程序判斷輸入的正整數是不是迴文素數。

參考答案:

if __name__ == '__main__':
    num = int(input('請輸入正整數: '))
    if is_palindrome(num) and is_prime(num):
        print('%d是迴文素數' % num)
    else:
        print('%d不是迴文素數' % num)

 

  注意:通過上面的程序可以看出,當我們將代碼中重複出現的和相對獨立的功能抽取成函數后,我們可以組合使用這些函數來解決更為複雜的問題,這也是我們為什麼要定義和使用函數的一個非常重要的原因。

 

5. 變量作用域

(1)最後,我們來討論一下Python中有關變量作用域的問題

def foo():
    b = 'hello'

    # Python中可以在函數內部再定義函數
    def bar():
        c = True
        print(a)
        print(b)
        print(c)

    bar()
    # print(c)  # NameError: name 'c' is not defined


if __name__ == '__main__':
    a = 100
    # print(b)  # NameError: name 'b' is not defined
    foo()

  上面的代碼能夠順利的執行並且打印出100、hello和True,但我們注意到了,在bar函數的內部並沒有定義a和b兩個變量,那麼a和b是從哪裡來的。

  我們在上面代碼的if分支中定義了一個變量a,這是一個全局變量(global variable),屬於全局作用域,因為它沒有定義在任何一個函數中。在上面的foo函數中我們定義了變量b,這是一個定義在函數中的局部變量(local variable),屬於局部作用域,在foo函數的外部並不能訪問到它;但對於foo函數內部的bar函數來說,變量b屬於嵌套作用域,在bar函數中我們是可以訪問到它的。bar函數中的變量c屬於局部作用域,在bar函數之外是無法訪問的。事實上,Python查找一個變量時會按照“局部作用域”、“嵌套作用域”、“全局作用域”和“內置作用域”的順序進行搜索(由小到大),前三者我們在上面的代碼中已經看到了,所謂的“內置作用域”就是Python內置的那些標識符,我們之前用過的input、print、int等都屬於內置作用域。

  其中,在foo函數中調用bar函數的變量c,會報錯;因為讀不到此變量。

 

(2)再看看下面這段代碼,我們希望通過函數調用修改全局變量a的值,但實際上下面的代碼是做不到的。

def foo():
    a = 200
    print(a)  # 200

if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 100

   在調用foo函數后,我們發現a的值仍然是100,這是因為當我們在函數foo中寫a = 200的時候,是重新定義了一個名字為a的局部變量,它跟全局作用域的a並不是同一個變量,因為局部作用域中有了自己的變量a,因此foo函數不再搜索全局作用域中的a。

 

(3)如果我們希望在foo函數中修改全局作用域中的a,代碼如下所示。

def foo():
    global a
    a = 200
    print(a)  # 200

if __name__ == '__main__':
    a = 100
    foo()
    print(a)  # 200

  我們可以使用global關鍵字來指示foo函數中的變量a來自於全局作用域,如果全局作用域中沒有a,那麼下面一行的代碼就會定義變量a並將其置於全局作用域。

  同理,如果我們希望函數內部的函數能夠修改嵌套作用域中的變量,可以使用nonlocal關鍵字來指示變量來自於嵌套作用域,請大家自行試驗。

  在實際開發中,我們應該盡量減少對全局變量的使用,因為全局變量的作用域和影響過於廣泛,可能會發生意料之外的修改和使用,除此之外全局變量比局部變量擁有更長的生命周期,可能導致對象佔用的內存長時間無法被垃圾回收。事實上,減少對全局變量的使用,也是降低代碼之間耦合度的一個重要舉措,同時也是對的踐行。減少全局變量的使用就意味着我們應該盡量讓變量的作用域在函數的內部,但是如果我們希望將一個局部變量的生命周期延長,使其在定義它的函數調用結束后依然可以使用它的值,這時候就需要使用,這個我們在後續的內容中進行講解。

  說明: 很多人經常會將“閉包”和混為一談,但實際上它們並不是一回事,如果想了解這個概念,可以看看的解釋。

說了那麼多,其實結論很簡單,從現在開始我們可以將Python代碼按照下面的格式進行書寫,這一點點的改進其實就是在我們理解了函數和作用域的基礎上跨出的巨大的一步。

def main():
    # Todo: Add your code here
    pass

if __name__ == '__main__':
    main()

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

※幫你省時又省力,新北清潔一流服務好口碑

CSS(4)—三大特性(繼承性,層疊性,優先級)

CSS(4)—三大特性(繼承性,層疊性,優先級)

CSS有三大特性分別是: 繼承性,層疊性,優先級。

一、繼承性

概念 給父元素設置一些屬性,子元素也可以使用,這個我們就稱之為繼承性。

注意

1.並不是所有的屬性都可以繼承, 只有以color/font-/text-/line-開頭的屬性才可以繼承
2.在CSS的繼承中不僅僅是兒子可以繼承, 只要是後代都可以繼承
3.繼承性中的特殊性
   3.1 a標籤的文字顏色和下劃線是不能繼承的
   3.2 h標籤的文字大小是不能繼承的

示例

<!-- 樣式部分 -->
<style type="text/css">
    .father { 
         width: 300px;            /*設置寬度*/
         font-size: 20px;         /* 設置字體*/
         text-align: right;       /* 字體右對齊*/
         background-color: green; /*背景顏色綠色*/
         color:red; /*字體顏色紅色*/
     }
 </style>
 
<!-- html部分 -->
 <body>
    <div class="father">father標籤
      <p>father子標籤 p</p>
    </div>
  </body>

運行結果

從這個例子中可以看齣子標籤p繼承了父類div的樣式。

二、層疊性

概念 層疊性就是CSS處理衝突的一種能力。層疊性只有在多個選擇器選中 同一個標籤, 然後又設置了相同的屬性, 才會發生層疊性。

示例

<html>
<head>
    <title>CSS三大特性之層疊性</title>
    <style>
        p {
            color: red;
        }
        p {
            color: blue;
        }
    </style>
</head>
<body>
  <p style="color: black">我是段落</p> <!-- 最終显示black 就近原則 black > blue > red -->
</body>
</html>

在相同優先級的的情況下 下面的樣式元素會將上面的層疊掉。

三、CSS優先級

概念 當多個選擇器選中同一個標籤, 並且給同一個標籤設置相同的屬性時, 如何層疊就由優先級來確定。

優先級

!important>行內樣式>id選擇器>類選擇器>標籤選擇器>通配符>繼承 

補充說明

1、繼承樣式的權重為0。即在嵌套結構中,不管父元素樣式的權重多大,被子元素繼承時,他的權重都為0,也就是說子元素定義的樣式會覆蓋繼承來的樣式。
2、行內樣式優先。應用style屬性的元素,其行內樣式的權重非常高,可以理解為遠大於100。
3、權重相同時,CSS遵循就近原則。也就是說靠近元素的樣式具有最大的優先級,或者說排在最後的樣式優先級最大。
4、CSS定義了一個!important命令,該命令被賦予最大的優先級。也就是說不管權重如何以及樣式位置的遠近,!important都具有最大優先級。

關於CSS權重,有一套計算公式來去計算,用一個四位的數 字串(CSS2是三位)來表示,更像四個級別,值從左到右,左面的最大,一級大於一級,數位之間沒有進制,級別之間不可超越。

部分權重是可以疊加的。比如的例子:

div ul  li   ------>      0,0,0,3
a:hover      -----—>      0,0,1,1
.son ul li   ------>      0,0,1,2
.son a       ------>      0,0,1,1   
#son p       ------>      0,1,0,1

注意

對於並集選擇器來說不是權重的加和,因為理論上它還是獨立的,它只相當於將多個選擇器的相同內容歸於一個並集選擇器中,理論上每一個選擇器還是獨立的。

示例

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        div,p {
            color: green; /*這裏不能是0,0,0,2 而是兩個0,0,0,1*/
        }

        p {
            color: red;  /*對於p標籤最終會显示紅色 0,0,0,1 (因為和上面優先級一樣,所以下面會覆蓋上面樣式)*/
        }
    </style>
</head>
<body>
    <p>標籤什麼顏色</p>
</body>
</html>

四、經典測試題

這裏舉幾個測試題來鞏固下css優先級的知識。首先我們要知道如何推斷標籤的最終樣式

1. 先找到影響文字的最裏面的盒子
2. 然後計算權重
3. 如果權重一樣,看層疊性

1、第一題

<!DOCTYPE>
<html>
    <head>
        <title>第2題</title>
        <style type="text/css">
            #father{
                color:red;  /* 繼承的權重為 0,0,0,0 */
            }
            p{
                color:blue;  /* 權重 0,0,0,1 */
            }
        </style>
    </head>
    <body>
        <div id="father">
            <p>試問這行字體是什麼顏色的?</p>
        </div>
    </body>
</html>

答案 藍色。

2、第二題

<!DOCTYPE>
<html>      
    <head>
        <title>第1題</title>
        <style type="text/css">
            #father #son{    /*權重: 0,2,0,0 */
                color:blue;
            }
            #father p.c2{   /* 權重: 0,1,1,1 */
                color:black;
            }
            div.c1 p.c2{    /* 權重 0,0,2,2 */
                color:red;
            }
            #father{
                color:green !important;  /* 繼承的權重為 0,0,0,0 */
            }
        </style>
    </head>
    <body>
        <div id="father" class="c1">
            <p id="son" class="c2">
                試問這行字體是什麼顏色的?
            </p>
        </div>
    </body>
</html>

答案 藍色。

3、第三題

<!DOCTYPE>
<html>
<head>
    <title>Document</title>
    <style type="text/css">
        div div div div div div div div div div div div{  /* 權重 0,0,0,11 (最後一位數再怎麼相加都不會向前進一位) */
            color:red;
        }
        .me{ 
            color:blue; /* 權重 0,0,1,0 */
        }
    </style>
</head>
<body>
    <div>
        <div>
            <div>
                <div>
                    <div>
                        <div>
                            <div>
                                <div>
                                    <div>
                                        <div>
                                            <div>
                                                <div class="me">試問這行文字是什麼顏色的</div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

答案 藍色。

4、第四題

<!DOCTYPE>
<html>
<head>
    <title>第四題</title>
    <style type="text/css">
        .c1 .c2 div{       /* 權重 0,0,2,1 */
            color: blue;
        }
        div #box3{         /* 權重 0,1,0,1 */
            color:green;
        }
        #box1 div{         /* 權重 0,1,0,1 */
            color:yellow;
        }
    </style>
</head>
<body>
    <div id="box1" class="c1">
        <div id="box2" class="c2">
            <div id="box3" class="c3">
                文字显示什麼顏色
            </div>
        </div>
    </div>
</body>
</html>

答案 黃色 (如果權重一樣,看層疊性)

你如果願意有所作為,就必須有始有終。(6)

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

※別再煩惱如何寫文案,掌握八大原則!

李嘉誠投資電動車 F-立凱受惠

香港首富李嘉誠所投資的香港五龍電動車日前與台灣F-立凱簽署交易契約,共同打造垂直整合的電動車廠。五龍電動車由李嘉誠所投資,未來將斥資新台幣20億元增資F-立凱,取得21.8%股權。

根據立凱、五龍電動車與五龍動力的協議,三方將以策略聯盟、資本合作的方式取得股權交換方案,五龍電動車與五龍動力將對立凱電共同投資新台幣20億元左右,取得F-立凱的21.8%股權。

F-立凱先前已獲潤泰集團總裁尹衍樑旗下相關企業投資持股逾12%,以生產電動車關鍵零組件磷酸鋰鐵正極材料為主要業務。

李嘉誠看好電動車關鍵零組件,從2010年起陸續購入五龍電動車股權,目前持股比例約為6.6%。本次五龍電動車將與F-立凱合作,等於李嘉誠加入台灣電動車業者投資行列。

同時,F-立凱將以每股港幣0.5元的價格認購五龍電動車集團所發行的430萬普通股與2.75億元港幣的無擔保可轉換公司債,總投資額預計將達港幣4.9億元,持股比率為4.2%。

整體交易完成後,李嘉誠在五龍電動車的時股比重將從6.6%降至6.3%。同時,五龍與F-立凱將著手打造全球化的一條龍供應鏈,並結合南韓SK集團技術與美國Smith物流車市場,於兩岸三地、國際市場形成明確分工。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

和諧富騰挖角Volvo高階主管,2017衝首款平民電動車

由鴻海、騰訊集團與和諧汽車聯手打造的中國電動車公司和諧富騰,致力於推動「互聯網+智慧電動車」。市場上傳出和諧富騰將延攬富豪汽車(Volvo)主管,目標在2017年推出首款平名電動車。

和諧富騰分別由和諧汽車持股接近四成、騰訊與鴻海各持股29.4%,為2015年於中國鄭州成立的合資公司,初期資本額為人民幣10億元,主要業務為電動車的生產、製造;研發與製造工作主要由鴻海負責。

目前,和諧富騰旗下有兩大子品牌:愛車、愛迪生,為雙品牌經營。其中,愛車將以推動平民款電動車iCar為主要任務。愛車有55%由和諧富騰出資,28%由和諧汽車出資,17%則為戰略合作夥伴出資。

自成立以來,和諧富騰就積極於打造自己的高階團隊,從BMW、Google自動駕駛團隊等挖角人手。目前,和諧富騰執行長由有「BMW i8電動跑車之父」的Carsten Breitfeld擔任,營運長則由有「中國豪車通」美名的Daniel Kirchert擔任。外媒近日報導,和諧富騰將延攬Volvo前中國總裁兼執行長付強加入,擔任愛車公司的執行長。

和諧富騰希望付強加入愛車公司後,能加速推動iCar的製造與行銷腳步,目標在2017年推出首輛iCar產品。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享

Appium+python自動化(三十九)-Appium自動化測試框架綜合實踐 – 代碼實現(超詳解)

簡介

  前邊一直在分享testng的相關文章,看了點贊量和閱讀數不是很高,宏哥猜測估計是大家確實是用不到或者不喜歡吧!不過宏哥經過一段時間的準備,appium的自動化測試框架完善的差不多了,那麼接下來宏哥繼續給小夥伴和童鞋們分享有關Appium自動化測試框架綜合實踐。想必小夥伴們有點等不及了吧!

driver配置封裝

kyb_caps.yaml 配置表

主要是一些配置信息的封裝。

 參考代碼

platformName: Android
#模擬器
platformVersion: 5.1.1
deviceName: 127.0.0.1:62025

#mx4真機
#platformVersion: 5.1
#udid: 750BBKL22GDN
#deviceName: MX4

appname: kaoyan3.1.0.apk
noReset: False
unicodeKeyboard: True
resetKeyboard: True

appPackage: com.tal.kaoyan
appActivity: com.tal.kaoyan.ui.activity.SplashActivity
ip: 127.0.0.1
port: 4723

desired_caps.py

主要是用來讀取配置文件的信息的封裝。

 參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-14
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from appium import webdriver
import yaml
import logging
import logging.config
import os

CON_LOG='../config/log.conf'
logging.config.fileConfig(CON_LOG)
logging=logging.getLogger()

def appium_desired():
    with open('../config/kyb_caps.yaml','r',encoding='utf-8') as file:
        data=yaml.load(file)

    desired_caps={}
    desired_caps['platformName']=data['platformName']
    desired_caps['platformVersion']=data['platformVersion']
    desired_caps['deviceName']=data['deviceName']

    base_dir = os.path.dirname(os.path.dirname(__file__))
    app_path = os.path.join(base_dir, 'app', data['appname'])
    desired_caps['app']=app_path

    desired_caps['appPackage']=data['appPackage']
    desired_caps['appActivity']=data['appActivity']
    desired_caps['noReset']=data['noReset']


    desired_caps['unicodeKeyboard']=data['unicodeKeyboard']
    desired_caps['resetKeyboard']=data['resetKeyboard']

    logging.info('start app...')
    driver=webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub',desired_caps)
    driver.implicitly_wait(8)
    return driver

if __name__ == '__main__':
    appium_desired()

    # with open('../config/kyb_caps.yaml', 'r', encoding='utf-8') as file:
    #     data = yaml.load(file)
    #
    # base_dir=os.path.dirname(os.path.dirname(__file__))
    # print(os.path.dirname(__file__))
    # print(base_dir)
    #
    # app_path=os.path.join(base_dir,'app',data['appname'])
    # print(app_path)

相對路徑符號含義

  1. “.”表示當前目錄
  2. “..” 表示當前目錄的上一級目錄。
  3. “./”表示當前目錄下的某個文件或文件夾,視後面跟着的名字而定
  4. “../”表示當前目錄上一級目錄的文件或文件夾,視後面跟着的名字而定。

基類封裝

baseView.py

主要是一些元素定位方法的封裝。

 參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-14
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
class BaseView(object):
    def __init__(self,driver):
        self.driver=driver

    def find_element(self,*loc):
        return self.driver.find_element(*loc)

    def find_elements(self,*loc):
        return self.driver.find_elements(*loc)

    def get_window_size(self):
        return self.driver.get_window_size()

    def swipe(self,start_x, start_y, end_x, end_y, duration):
        return self.driver.swipe(start_x, start_y, end_x, end_y, duration)

common公共模塊封裝

公共方法封裝 : common_fun.py

主要是一些公共方法的封裝。

參考代碼

# coding=utf-8
# 1.先設置編碼,utf-8可支持中英文,如上,一般放在第一行

# 2.註釋:包括記錄創建時間,創建人,項目名稱。
'''
Created on 2019-11-13
@author: 北京-宏哥   QQ交流群:707699217
Project:Appium自動化測試框架綜合實踐 - 代碼實現
'''
# 3.導入模塊
from kyb_testProject.baseView.baseView import BaseView
from kyb_testProject.common.desired_caps import appium_desired
from selenium.common.exceptions import NoSuchElementException
import logging
from selenium.webdriver.common.by import By
import time,os
import csv

class Common(BaseView):
    cancelBtn=(By.ID,'android:id/button2')
    skipBtn=(By.ID,'com.tal.kaoyan:id/tv_skip')
    wemedia_cacel=(By.ID,'com.tal.kaoyan:id/view_wemedia_cacel')


    def check_cancelBtn(self):
        logging.info('==========check_cancelBtn=========')
        try:
            cancelBtn = self.driver.find_element(*self.cancelBtn)
        except NoSuchElementException:
            logging.info('no cancelBtn')
        else:
            cancelBtn.click()

    def check_skipBtn(self):
        logging.info('=========check skipBtn=============')

        try:
            skipBtn = self.driver.find_element(*self.skipBtn)
        except NoSuchElementException:
            logging.info('no skipBtn')
        else:
            skipBtn.click()

    def get_size(self):
        x = self.driver.get_window_size()['width']
        y = self.driver.get_window_size()['height']
        return x, y

    def swipeLeft(self):
        logging.info('swipeLeft')
        l = self.get_size()
        x1 = int(l[0] * 0.9)
        y1 = int(l[1] * 0.5)
        x2 = int(l[0] * 0.1)
        self.swipe(x1, y1, x2, y1, 1000)

    def getTime(self):
        self.now=time.strftime("%Y-%m-%d %H_%M_%S")
        return self.now

    def getScreenShot(self,module):
        time=self.getTime()
        image_file=os.path.dirname(os.path.dirname(__file__))+'/screenshots/%s_%s.png' %(module,time)

        logging.info('get %s screenshot' %module)
        self.driver.get_screenshot_as_file(image_file)

    def check_market_ad(self):
        logging.info('====check_market_ad====')
        try:
            element=self.driver.find_element(*self.wemedia_cacel)
        except NoSuchElementException:
            pass
        else:
            logging.info('close market ad')
            element.click()

    def get_csv_data(self,csv_file,line):
        logging.info('=====get_csv_data======')
        with open(csv_file,'r',encoding='utf-8-sig') as file:
            reader=csv.reader(file)
            for index,row in enumerate(reader,1):
                if index==line:
                    return row

if __name__ == '__main__':
    # driver=appium_desired()
    # com=Common(driver)
    # com.check_cancelBtn()
    # # com.check_skipBtn()
    # com.swipeLeft()
    # com.getScreenShot('startApp')

    list = ["這", "是", "一個", "測試", "數據"]
    # for i in range(len(list)):
        # print(i, list[i])

    list1 = ["這", "是", "一個", "測試", "數據"]
    # for index, item in enumerate(list1):
    #     print(index, item)

小結

     好了,今天的分享就到這裏。感謝您耐心的閱讀!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

※評比前十大台北網頁設計、台北網站設計公司知名案例作品心得分享

※智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

※評比南投搬家公司費用收費行情懶人包大公開

LNMP+Redis架構部署

工作機制

  • L(Linux)N(Nginx)M(Mysql)P(PHP)架構想必大家都知道,LNMP架構主要作用是讓前端服務與後端存儲以及後端的一下服務進行連接起來,來實現php程序的動態請求。

   而今天我們又在LNMP架構上面加一個Redis程序,而Redis在整個架構中起到了一個數據緩存的作用。

  • LNMP+Redis工作機制:當用戶通過瀏覽器訪問網站時,並使用賬號密碼進行登陸時,此時會向Redis發出查詢請求,若Redis緩存中沒有相關信息,則php會查詢mysql數據庫中的相關信息,然後將相關信息緩存在redis中;在下次此用戶訪問時,php無需再從mysql數據庫中讀取數據,直接從redis中讀取緩存並將數據返回,這樣就可以減少數據庫的讀取壓力。
  • 下面是簡單的工作機制示意圖

 

系統環境描述

  • Linux系統版本:我這裏使用的是Ubuntu系統,大家可以選用不同的Linux版本
   jia@uduntu:~$ lsb_release -a

    No LSB modules are available.
    Distributor ID: Ubuntu
    Description: Ubuntu 19.10
    Release: 19.10
    Codename: eoan

  • Nginx軟件版本
  nginx/1.16.1 (Ubuntu)
  •  PHP軟件版本
   7.3.11-0ubuntu0.19.10.1 amd64
  • MariaDB軟件版本
   1:10.3.17-1 all

 

  • Redis軟件版本
   5:5.0.5-2build1 all

 

部署Nginx

Nginx描述:Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了MAP/POP3/SMTP服務。Nginx是一款輕量級的Web 服務器/反向代理服務器及电子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力在同類型的網頁服務器中表現較好。

安裝

安裝Nginx軟件包有很多種方法比如:RPM包安裝、編譯安裝等,我在這裏軟件就全部使用RPM進行安裝了

jia@uduntu:~$ sudo apt -y install nginx

    Setting up fonts-dejavu-core (2.37-1) ...
    Setting up libjpeg-turbo8:amd64 (2.0.3-0ubuntu1) ...
    Setting up libjpeg8:amd64 (8c-2ubuntu8) ...    
    Setting up libnginx-mod-mail (1.16.1-0ubuntu2) ...
    Setting up fontconfig-config (2.13.1-2ubuntu2) ...
    Setting up libnginx-mod-stream (1.16.1-0ubuntu2) ...
    Setting up libtiff5:amd64 (4.0.10+git191003-1) ...
    Setting up libfontconfig1:amd64 (2.13.1-2ubuntu2) ...
    Setting up libgd3:amd64 (2.2.5-5.2) ...
    Setting up libnginx-mod-http-image-filter (1.16.1-0ubuntu2) ...
    Setting up nginx-core (1.16.1-0ubuntu2) ...
    Setting up nginx (1.16.1-0ubuntu2) ...
    Processing triggers for ufw (0.36-1ubuntu3) ...
    Processing triggers for systemd (242-7ubuntu3) ...
    Processing triggers for man-db (2.8.7-3) ...
    Processing triggers for libc-bin (2.30-0ubuntu2) ...
jia@uduntu:
~$

 

出現上面字符即為安裝成功

啟動

程序啟動有兩種方法

  1. 作為系統服務進行啟動,啟動方法:

Ubuntu以及rhel7以上版本使用下面方式:

    systemctl  start nginx        \\啟動Nginx
    systemctl  stop  nginx        \\停止Nginx
    systemctl  restart  nginx        \\重新啟動Nginx

 

rhel7一下版本使用下面方式:

    server  nginx  start        \\啟動Nginx
    server  nginx  stop            \\停止Nginx
    server  nginx  restart        \\重新啟動Nginx

 

  1. 使用Nginx啟動腳本進行控制Nginx啟停:
    sh nginx        \\啟動Nginx
    停止nginx可以使用結束進程的方式進行停止

 

測試並訪問

接下來讓我們啟動nginx並進行訪問:

jia@uduntu:~$ systemctl start nginx        \\我這裏使用的非root用戶所以要求輸入密碼
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to start 'nginx.service'.
    Authenticating as: jia
    Password: 
    ==== AUTHENTICATION COMPLET
jia@uduntu:~$

 

啟動成功后訪問:
訪問地址:

    http://Server IP Address

 

看到下面內容證明安裝並啟動成功:

部署PHP

PHP描述:PHP即“超文本預處理器”,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。利於學習,使用廣泛,主要適用於Web開發領域。

安裝

    jia@uduntu:~$ sudo apt -y install php php7.3-fpm
    [sudo] password for jia:             //這裏正常輸入密碼
        \\安裝最後出現下面顯示錶示安裝成功
    Creating config file /etc/php/7.3/mods-available/json.ini with new version
    Setting up php7.3-readline (7.3.11-0ubuntu0.19.10.1) ...

    Creating config file /etc/php/7.3/mods-available/readline.ini with new version
    Setting up php7.3-cli (7.3.11-0ubuntu0.19.10.1) ...
    update-alternatives: using /usr/bin/php7.3 to provide /usr/bin/php (php) in auto mode
    update-alternatives: using /usr/bin/phar7.3 to provide /usr/bin/phar (phar) in auto mode
    update-alternatives: using /usr/bin/phar.phar7.3 to provide /usr/bin/phar.phar     (phar.phar) in auto mode

    Creating config file /etc/php/7.3/cli/php.ini with new version
    Setting up php7.3-fpm (7.3.11-0ubuntu0.19.10.1) ...

    Creating config file /etc/php/7.3/fpm/php.ini with new version
    Created symlink /etc/systemd/system/multi-user.target.wants/php7.3-fpm.service →     /lib/systemd/system/php7.3-fpm.service.
    Setting up php7.3 (7.3.11-0ubuntu0.19.10.1) ...
    Setting up php (2:7.3+69ubuntu2) ...
    Processing triggers for man-db (2.8.7-3) ...
    Processing triggers for systemd (242-7ubuntu3) ...

 

啟動

上面已經給大家說過Nginx的啟動方法了,php啟動方法與Nginx基本一樣

jia@uduntu:~$ systemctl start  php7.3-fpm
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to start 'php7.3-fpm.service'.
    Authenticating as: jia
    Password:             \\輸入密碼
    ==== AUTHENTICATION COMPLETE ===
jia@uduntu:~$ 

 

啟動成功,可以使用查看進程的方式進行查看

jia@uduntu:~$ ps uax | grep php            \\下面進程表示php運行進程
    root      10346  0.0  2.5 193732 17384 ?        Ss   08:29   0:00 php-fpm: master process     (/etc/php/7.3/fpm/php-fpm.conf)
    www-data  10357  0.0  0.9 194044  6348 ?        S    08:29   0:00 php-fpm: pool www
    www-data  10358  0.0  0.9 194044  6348 ?        S    08:29   0:00 php-fpm: pool www
    jia       10572  0.0  0.1   6296   920 pts/0    S+   08:33   0:00 grep --color=auto php
jia@uduntu:~$

 

配置Nginx

php啟動成功後下面配置Nginx,讓Nginx接收到的php請求轉交給php服務器進行解析
nginx配置文件:

    server {
        listen 80 default_server;
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html index.php ;        \\此處需要在後面添加index.php
        server_name _;
        location / {
        try_files $uri $uri/ =404;
        }
        location ~ \.php$ {            \\取消註釋
               include snippets/fastcgi-php.conf;        \\取消註釋
               fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;        \\這一行和下面一行指的是php偵聽方式,查看php是偵聽那種方式然後取消註釋哪一行
               fastcgi_pass 127.0.0.1:9000;            \\
        }

在php-fpm配置文件種查看php的偵聽方式:

    listen = /run/php/php7.3-fpm.sock        \\這種偵聽方式適用於本地php
    listen = 127.0.0.1:9000        \\這種偵聽方式適用於遠程PHP

 

看你的那個php是那種方式偵聽的,然後將nginx配置文件中的一行取消註釋,然後再重新啟動nginx使改動生效

測試

默認網頁代碼的存放位置:

    /var/www/html

 測試只需要將index,html該名為index.php,內容更改為你的php代碼
我的php代碼內容為:

    <?php
        phpifo();
    ?>

 

下面來訪問一下,訪問地址不變

只要可以解析PHP代碼了就表示配置安裝成功

部署MariaDB

部署MariaDBMariaDB描述:MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,採用GPL授權許可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕鬆成為MySQL的代替品。MariaDB基於事務的Maria存儲引擎,替換了MySQL的MyISAM存儲引擎,它使用了Percona的 XtraDB,InnoDB的變體,分支的開發者希望提供訪問即將到來的MySQL 5.4 InnoDB性能。這個版本還包括了 PrimeBase XT (PBXT) 和 FederatedX存儲引擎。

安裝

 jia@uduntu:~$ sudo apt -y install mariadb-server
    Setting up mariadb-client-10.3 (1:10.3.17-1) ...
    Setting up libdbd-mysql-perl:amd64 (4.050-2build1) ...
    Setting up libhtml-parser-perl (3.72-3build2) ...
    Setting up mariadb-server-10.3 (1:10.3.17-1) ...
    Created symlink /etc/systemd/system/mysql.service → /lib/systemd/system/mariadb.service.
    Created symlink /etc/systemd/system/mysqld.service → /lib/systemd/system/mariadb.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /lib/systemd/system/mariadb.service.
    Setting up libhttp-message-perl (6.18-1) ...
    Setting up libcgi-pm-perl (4.44-1) ...
    Setting up libhtml-template-perl (2.97-1) ...
    Setting up mariadb-server (1:10.3.17-1) ...
    Setting up libcgi-fast-perl (1:2.15-1) ...
    Processing triggers for systemd (242-7ubuntu3) ...
    Processing triggers for man-db (2.8.7-3) ...
    Processing triggers for libc-bin (2.30-0ubuntu2) ...
jia@uduntu:~$            \\出現上面代碼錶示安裝成功

 

啟動

同Nginx:

 jia@uduntu:~$ systemctl start mariadb
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to start 'mariadb.service'.
    Authenticating as: jia
    Password:         \\此處輸入密碼
    ==== AUTHENTICATION COMPLETE ===
 jia@uduntu:~$ 

 

查看是否啟動成功:

 jia@uduntu:~$ ps uax | grep mysqld
    mysql     11669  0.2 11.5 1713056 78488 ?       Ssl  09:17   0:00 /usr/sbin/mysqld
    jia       12614  0.0  0.1   6296   924 pts/0    S+   09:23   0:00 grep --color=auto mysqld
 jia@uduntu:~$ 

 

初始化數據庫:

 jia@uduntu:~$ sudo mysql_secure_installation 
     \\下面是初始化過程
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
jia@uduntu:~$ 

 

初始化完成后,可直接使用自帶的mysql客戶端進行連接

 jia@uduntu:~$ sudo mysql -u root -p
    Enter password: 
    Welcome to the MariaDB monitor.  Commands end with ; or \g.
    Your MariaDB connection id is 56
    Server version: 10.3.17-MariaDB-1 Ubuntu 19.10

    Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | ifnormation_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    3 rows in set (0.000 sec)

     MariaDB [(none)]> 

配置php支持

安裝php連接數據庫的中間件:php-mysql

 jia@uduntu:~$ sudo apt -y install php-mysql
    Preparing to unpack .../php-mysql_2%3a7.3+69ubuntu2_all.deb ...
    Unpacking php-mysql (2:7.3+69ubuntu2) ...
    Setting up php7.3-mysql (7.3.11-0ubuntu0.19.10.1) ...

    Creating config file /etc/php/7.3/mods-available/mysqlnd.ini with new version

    Creating config file /etc/php/7.3/mods-available/mysqli.ini with new version

    Creating config file /etc/php/7.3/mods-available/pdo_mysql.ini with new version
    Setting up php-mysql (2:7.3+69ubuntu2) ...
    Processing triggers for php7.3-fpm (7.3.11-0ubuntu0.19.10.1) ...
jia@uduntu:~$             //安裝成功

 

配置php.ini文件,將配置文件中extension=mysqli這一行取消註釋就可以了,然後重新啟動php-fpm

 jia@uduntu:/etc/php/7.3/fpm$ systemctl restart php7.3-fpm
    ==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
    Authentication is required to restart 'php7.3-fpm.service'.
    Authenticating as: jia
    Password:             \\輸入密碼
    ==== AUTHENTICATION COMPLETE ===
 jia@uduntu:/etc/php/7.3/fpm$ 

測試

測試php是否可使用數據庫,最好的方法就是使用php代碼寫一個連接數據庫就可以了
代碼如下:

    <?php
        $host = "localhost";    //mysql主機
        $user = "root";            //mysql用戶
        $passwd = "redhat";        //mysql密碼
        $conn = new mysqli($host,$user,$passwd);
        if (!$conn){
            die("連接數據庫失敗");
        }
        echo "連接數據庫成功";        
    ?>

 

显示數據庫連接成功示安裝成功

部署Redis

Redis描述:Redis(全稱:Remote Dictionary Server 遠程字典服務)是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。

安裝

jia@uduntu:~$ sudo apt -y install redis                \\出現下面提示表示安裝成功
    Setting up lua-cjson:amd64 (2.1.0+dfsg-2.1) ...
    Setting up libatomic1:amd64 (9.2.1-9ubuntu2) ...
    Setting up lua-bitop:amd64 (1.0.2-5) ...
    Setting up liblua5.1-0:amd64 (5.1.5-8.1build3) ...
    Setting up libhiredis0.14:amd64 (0.14.0-3) ...
    Setting up redis-tools (5:5.0.5-2build1) ...
    Setting up redis-server (5:5.0.5-2build1) ...
    Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-                                        server.service.
    Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service →     /lib/systemd/system/redis-server.service.
    Setting up redis (5:5.0.5-2build1) ...
    Processing triggers for systemd (242-7ubuntu3) ...
    Processing triggers for man-db (2.8.7-3) ...
    Processing triggers for libc-bin (2.30-0ubuntu2) ...
jia@uduntu:~$ 

 

啟動

啟動等同於Nginx啟動

jia@uduntu:~$ sudo systemctl start redis

 

啟動成功後進行檢查

jia@uduntu:~$ sudo netstat -anpl |  grep redis
    tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN          2094/redis-server 1 
    tcp6       0      0 ::1:6379                :::*                    LISTEN          2094/redis-server 1 
jia@uduntu:~$ 

可以看到redis端口(6379)就證明啟動成功
下面讓我們使用redis客戶端測試一下:

jia@uduntu:~$ sudo redis-cli         \\啟動redis客戶端
    127.0.0.1:6379> set test "hellow word"            \\設置變量
        OK
    127.0.0.1:6379> get test        \\輸出變量
        "hellow word"
    127.0.0.1:6379> del test        \\刪除變量
        (integer) 1
    127.0.0.1:6379> get test    
        (nil)
    127.0.0.1:6379> 

 

上面測試可以看出redis安裝成功,並啟動成功

配置php支持

安裝php連接redis中間件

jia@uduntu:~$ sudo apt -y install php-redis                \\輸出以下內容表示安裝成功
    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    The following additional packages will be installed:
      php-igbinary
    The following NEW packages will be installed:
      php-igbinary php-redis
    0 upgraded, 2 newly installed, 0 to remove and 18 not upgraded.
    Needto get 239 kB of archives.
    After this operation, 1,052 kB of additional disk space will be used.
    Get:1 http://cn.archive.ubuntu.com/ubuntu eoan/universe amd64 php-igbinary amd64 3.0.0-    1build1 [101 kB]
    Get:2 http://cn.archive.ubuntu.com/ubuntu eoan/universe amd64 php-redis amd64 5.0.2+4.3.0-2build1 [138 kB]
    Fetched 239 kB in 13s (19.0 kB/s)                                                                                  
    Selecting previously unselected package php-igbinary.
    (Reading database ... 70748 files and directories currently installed.)
    Preparing to unpack .../php-igbinary_3.0.0-1build1_amd64.deb ...
    Unpacking php-igbinary (3.0.0-1build1) ...
    Seleting previously unselected package php-redis.
    Preparing to unpack .../php-redis_5.0.2+4.3.0-2build1_amd64.deb ...
    Unpacking php-redis (5.0.2+4.3.0-2build1) ...
    Setting up php-igbinary (3.0.0-1build1) ...
    Setting up php-redis (5.0.2+4.3.0-2build1) ...
jia@uduntu:~$ 

 

安裝成功后,配置php支持redis
找到php.ini這個配置文件,添加下面配置,找到exension=mysql這一條,然後將下面代碼粘貼到下一行

    extension=redis.so

 

測試

測試php是否可以使用redis,下面頁面簡單既可以進行測試

<?php
   $redis = new Redis();        \\redis連接參數
   $redis->connect('127.0.0.1', 6379);        \\括號內第一項是指的redis server ip,第二項是 redis port
   echo "Connection to server successfully </br>";
   echo "Server is running: " . $redis->ping();
?>

 

將/var/www/html下面的index.php文件內容替換為上面內容,然後直接訪問即可
連接地址:

    http://nginx server ip

 

显示下面內容表示連接成功

Connection to server successfully
Server is running: 1

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

※不管是台北網頁設計公司、台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置,台北網頁設計,各種案例分享