php會如何處理,php技術求助

本文目錄一覽:

如何處理 PHP 的錯誤與異常

註冊好自己的異常處理函數,可以捕獲出現的異常,一般寫框架的時候比較喜歡用。

set_error_handler(‘suda\\core\\System::uncaughtError’);

set_exception_handler(‘suda\\core\\System::uncaughtException’);

php如何處理高並發

和php關係並不大,和web服務軟體和資料庫連接關係最大,所以是web服務端採用nginx+fpm+apc or xcache,能在2g雙核,2g內存下處理10000左右的並發。

但最重要的,是資料庫這塊,中間一定要有緩存,memcache是個不錯選擇。如果在資料庫中間未加緩存,並發大後,你很快會發現都連最基本的發起連接都是難事。

PHP可以做什麼

PHP可以做什麼

PHP屬於後起之秀,吸收了java和c以及perl等語言優點,專註互聯網領域。WEB領域PHP擁有得天獨厚的優勢,WEB領域沒有語言可以和他比。將來一定是互聯網的天下。互聯網離不開WEB,WEB離不開PHP。那麼PHP可以做什麼?一起來看看PHP的用途吧!

PC端網站開發

60%全球互聯網網站採用php技術,80%國內互聯網網站使用php開發。這些網站包含購物網站,政府企業網站,QQ空間,論壇博客等等。

移動端微網站開發

移動設備的普及為移動互聯網的快速發展奠定了基礎!手機淘寶網站,手機京東網站等等, 微信公眾號應用中的微網站。 將來微網站和公眾號肯定會取代APP的地位!

APP後台開發

APP後台開發也是移動互聯網發展的一個產物。大多數網站為了讓用戶在手機上能夠得到更好體驗效果,都加入開發APP的開發行列中。而PHP後端技術將會作為他們的不二選擇。

PHP主要用來做網站開發,許多小型網站都用PHP開發,PHP是開源的,這是使得PHP經久不衰的原因。在電商、社區等方面,PHP具備非常成熟的開源代碼和模板,因此使得PHP應用極為廣泛。

php-fpm的安裝目錄

下面是我的平時的環境搭建php的各種安裝目錄,大家的基本也差不多。

centos等linux平台

1./usr/local/php/php

2./usr/local/php/etc/php.ini

3./usr/local/php/sbin/php-fpm

4./usr/local/php/etc/php-fpm.conf

mac平台

1./usr/bin/php

2./etc/php.ini

3./usr/bin/php-fpm

4./etc/php-fpm.conf

由於我開發以Mac為主,所以就用Mac的環境配置來學習。

php-fpm配置詳解

這是搜索的一份還算算比較詳細的php-fpm.conf配置詳解,我會針對性的修改下,當然php手冊上也有詳細的講解:

1.pid = /usr/local/var/run/php-fpm.pid

2.#pid設置,一定要開啟,上面是Mac平台的。默認在php安裝目錄中的var/run/php-fpm.pid。比如centos的在: /usr/local/php/var/run/php-fpm.pid

3.

4.error_log  = /usr/local/var/log/php-fpm.log

5.#錯誤日誌,上面是Mac平台的,默認在php安裝目錄中的var/log/php-fpm.log,比如centos的在: /usr/local/php/var/log/php-fpm.log

6.

7.log_level = notice

8.#錯誤級別. 上面的php-fpm.log紀錄的登記。可用級別為: alert(必須立即處理), error(錯誤情況), warning(警告情況), notice(一般重要信息), debug(調試信息). 默認: notice.

9.

10.emergency_restart_threshold = 60

11.emergency_restart_interval = 60s

12.#表示在emergency_restart_interval所設值內出現SIGSEGV或者SIGBUS錯誤的php-cgi進程數如果超過 emergency_restart_threshold個,php-fpm就會優雅重啟。這兩個選項一般保持默認值。0 表示 ‘關閉該功能’. 默認值: 0 (關閉).

13.

14.process_control_timeout = 0

15.#設置子進程接受主進程復用信號的超時時間. 可用單位: s(秒), m(分), h(小時), 或者 d(天) 默認單位: s(秒). 默認值: 0.

16.

17.daemonize = yes

18.#後台執行fpm,默認值為yes,如果為了調試可以改為no。在FPM中,可以使用不同的設置來運行多個進程池。 這些設置可以針對每個進程池單獨設置。

19.

20.listen = 127.0.0.1:9000

21.#fpm監聽埠,即nginx中php處理的地址,一般默認值即可。可用格式為: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每個進程池都需要設置。如果nginx和php在不同的機器上,分散式處理,就設置ip這裡就可以了。

22.

23.listen.backlog = -1

24.#backlog數,設置 listen 的半連接隊列長度,-1表示無限制,由操作系統決定,此行注釋掉就行。backlog含義參考:

25.

26.listen.allowed_clients = 127.0.0.1

27.#允許訪問FastCGI進程的IP白名單,設置any為不限制IP,如果要設置其他主機的nginx也能訪問這台FPM進程,listen處要設置成本地可被訪問的IP。默認值是any。每個地址是用逗號分隔. 如果沒有設置或者為空,則允許任何伺服器請求連接。

28.

29.listen.owner = www

30.listen.group = www

31.listen.mode = 0666

32.#unix socket設置選項,如果使用tcp方式訪問,這裡注釋即可。

33.

34.user = www

35.group = www

36.#啟動進程的用戶和用戶組,FPM 進程運行的Unix用戶, 必須要設置。用戶組,如果沒有設置,則默認用戶的組被使用。

37.

38.pm = dynamic

39.#php-fpm進程啟動模式,pm可以設置為static和dynamic和ondemand

40.#如果選擇static,則進程數就數固定的,由pm.max_children指定固定的子進程數。

41.

42.#如果選擇dynamic,則進程數是動態變化的,由以下參數決定:

43.pm.max_children = 50 #子進程最大數

44.pm.start_servers = 2 #啟動時的進程數,默認值為: min_spare_servers + (max_spare_servers – min_spare_servers) / 2

45.pm.min_spare_servers = 1 #保證空閑進程數最小值,如果空閑進程小於此值,則創建新的子進程

46.pm.max_spare_servers = 3 #,保證空閑進程數最大值,如果空閑進程大於此值,此進行清理

47.

48.pm.max_requests = 500

49.#設置每個子進程重生之前服務的請求數. 對於可能存在內存泄漏的第三方模塊來說是非常有用的. 如果設置為 ‘0’ 則一直接受請求. 等同於 PHP_FCGI_MAX_REQUESTS 環境變數. 默認值: 0.

50.

51.pm.status_path = /status

52.#FPM狀態頁面的網址. 如果沒有設置, 則無法訪問狀態頁面. 默認值: none. munin監控會使用到

53.

54.ping.path = /ping

55.#FPM監控頁面的ping網址. 如果沒有設置, 則無法訪問ping頁面. 該頁面用於外部檢測FPM是否存活並且可以響應請求. 請注意必須以斜線開頭 (/)。

56.

57.ping.response = pong

58.#用於定義ping請求的返回相應. 返回為 HTTP 200 的 text/plain 格式文本. 默認值: pong.

59.

60.access.log = log/$pool.access.log

61.#每一個請求的訪問日誌,默認是關閉的。

62.

63.access.format = “%R – %u %t \”%m %r%Q%q\” %s %f %{mili}d %{kilo}M %C%%”

64.#設定訪問日誌的格式。

65.

66.slowlog = log/$pool.log.slow

67.#慢請求的`記錄日誌,配合request_slowlog_timeout使用,默認關閉

68.

69.request_slowlog_timeout = 10s

70.#當一個請求該設置的超時時間後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中. 設置為 ‘0’ 表示 ‘Off’

71.

72.request_terminate_timeout = 0

73.#設置單個請求的超時中止時間. 該選項可能會對php.ini設置中的’max_execution_time’因為某些特殊原因沒有中止運行的腳本有用. 設置為 ‘0’ 表示 ‘Off’.當經常出現502錯誤時可以嘗試更改此選項。

74.

75.rlimit_files = 1024

76.#設置文件打開描述符的rlimit限制. 默認值: 系統定義值默認可打開句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。

77.

78.rlimit_core = 0

79.#設置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整數. 默認值: 系統定義值.

80.

81.chroot =

82.#啟動時的Chroot目錄. 所定義的目錄需要是絕對路徑. 如果沒有設置, 則chroot不被使用.

83.

84.chdir =

85.#設置啟動目錄,啟動時會自動Chdir到該目錄. 所定義的目錄需要是絕對路徑. 默認值: 當前目錄,或者/目錄(chroot時)

86.

87.catch_workers_output = yes

88.#重定向運行過程中的stdout和stderr到主要的錯誤日誌文件中. 如果沒有設置, stdout 和 stderr 將會根據FastCGI的規則被重定向到 /dev/null . 默認值: 空.

當然還有一些無關緊要的設置,用到了再說吧。

一些重要的設置

php-fpm進程分配

在之前的文章中就說過了。在fasgcgi模式下,php會啟動多個php-fpm進程,來接收nginx發來的請求,那是不是進程越多,速度就越快呢?這可不一定!得根據我們的機器配置和業務量來決定。

我們先來看下,設定進程的配置在哪裡?

pm = static | dynamic | ondemand

pm可以設置成這樣3種,我們用的最多的就上前面2種。

pm = static 模式

pm = static 表示我們創建的php-fpm子進程數量是固定的,那麼就只有pm.max_children = 50這個參數生效。你啟動php-fpm的時候就會一起全部啟動51(1個主+50個子)個進程,頗為壯觀。

pm = dynamic 模式

pm = dynamic模式,表示啟動進程是動態分配的,隨著請求量動態變化的。他由 pm.max_children,pm.start_servers,pm.min_spare_servers,pm.max_spare_servers 這幾個參數共同決定。

上面已經講過,這裡再重申一下吧:

pm.max_children = 50 是最大可創建的子進程的數量。必須設置。這裡表示最多只能50個子進程。

pm.start_servers = 20 隨著php-fpm一起啟動時創建的子進程數目。默認值:min_spare_servers + (max_spare_servers – min_spare_servers) / 2。這裡表示,一起啟動會有20個子進程。

pm.min_spare_servers = 10

設置伺服器空閑時最小php-fpm進程數量。必須設置。如果空閑的時候,會檢查如果少於10個,就會啟動幾個來補上。

pm.max_spare_servers = 30

設置伺服器空閑時最大php-fpm進程數量。必須設置。如果空閑時,會檢查進程數,多於30個了,就會關閉幾個,達到30個的狀態。

到底選擇static還數dynamic?

很多人恐懼症來襲,不知道選什麼好?

一般原則是:動態適合小內存機器,靈活分配進程,省內存。靜態適用於大內存機器,動態創建回收進程對伺服器資源也是一種消耗。

如果你的內存很大,有8-20G,按照一個php-fpm進程20M算,100個就2G內存了,那就可以開啟static模式。如果你的內存很小,比如才256M,那就要小心設置了,因為你的機器裡面的其他的進程也算需要佔用內存的,所以設置成dynamic是最好的,比如:pm.max_chindren = 8, 佔用內存160M左右,而且可以隨時變化,對於一半訪問量的網站足夠了。

慢日誌查詢

我們有時候會經常飽受500,502問題困擾。當nginx收到如上錯誤碼時,可以確定後端php-fpm解析php出了某種問題,比如,執行錯誤,執行超時。

這個時候,我們是可以開啟慢日誌功能的。

slowlog = /usr/local/var/log/php-fpm.log.slow

request_slowlog_timeout = 15s

當一個請求該設置的超時時間15秒後,就會將對應的PHP調用堆棧信息完整寫入到慢日誌中。

php-fpm慢日誌會記錄下進程號,腳本名稱,具體哪個文件哪行代碼的哪個函數執行時間過長:

1.[21-Nov-2013 14:30:38] [pool www] pid 11877

2.script_filename = /usr/local/lnmp/nginx/html/

3.[0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/

通過日誌,我們就可以知道第2行的file_get_contents 函數有點問題,這樣我們就能追蹤問題了。

;

PHP怎麼處理密碼

在使用PHP開發Web應用的中,很多的應用都會要求用戶註冊,而註冊的時候就需要我們對用戶的信息進行處理了,最常見的莫過於就是郵箱和密碼了,本文意在討論對密碼的處理:也就是對密碼的加密處理。

MD5

相信很多PHP開發者在最先接觸PHP的時候,處理密碼的首選加密函數可能就是MD5了,我當時就是這樣的:

$password = md5($_POST[“password”]);

上面這段代碼是不是很熟悉?然而MD5的加密方式目前在PHP的江湖中貌似不太受歡迎了,因為它的加密演算法實在是顯得有點簡單了,而且很多破解密碼的站點都存放了很多經過MD5加密的密碼字元串,所以這裡我是非常不提倡還在單單使用MD5來加密用戶的密碼的。

SHA256 和 SHA512

其實跟前面的MD5同期的還有一個SHA1加密方式的,不過也是演算法比較簡單,所以這裡就一筆帶過吧。而這裡即將要說到的 SHA256 和 SHA512 都是來自於SHA2家族的加密函數,看名字可能你就猜的出來了,這兩個加密方式分別生成256和512比特長度的hash字串。

他們的使用方法如下:

$password = hash(“sha256”, $password);

PHP內置了 hash() 函數,你只需要將加密方式傳給 hash() 函數就好了。你可以直接指明 sha256 , sha512 , md5 , sha1 等加密方式。

鹽值

在加密的過程,我們還有一個非常常見的小夥伴:鹽值。對,我們在加密的時候其實會給加密的字元串添加一個額外的字元串,以達到提高一定安全的目的:

function generateHashWithSalt($password) {

$intermediateSalt = md5(uniqid(rand(), true));

$salt = substr($intermediateSalt, 0, 6);

return hash(“sha256”, $password . $salt);

}

Bcrypt

如果讓我來建議一種加密方式的話, Bcrypt 可能是我給你推薦的最低要求了,因為我會強烈推薦你後面會說到的 Hashing API ,不過 Bcrypt 也不失為一種比較不錯的加密方式了。

function generateHash($password) {

if (defined(“CRYPT_BLOWFISH”) CRYPT_BLOWFISH) {

$salt = ‘$2y$11$’ . substr(md5(uniqid(rand(), true)), 0, 22);

return crypt($password, $salt);

}

}

Bcrypt 其實就是 Blowfish 和 crypt() 函數的結合,我們這裡通過CRYPT_BLOWFISH 判斷 Blowfish 是否可用,然後像上面一樣生成一個鹽值,不過這裡需要注意的是, crypt() 的鹽值必須以 $2a$ 或者 $2y$ 開頭,詳細資料可以參考下面的鏈接:

更多資料可以看這裡:

Password Hashing API

這裡才是我們的重頭戲, Password Hashing API 是PHP 5.5之後才有的新特性,它主要是提供下面幾個函數供我們使用:

password_hash() – 對密碼加密.

password_verify() – 驗證已經加密的密碼,檢驗其hash字串是否一致.

password_needs_rehash() – 給密碼重新加密.

password_get_info() – 返回加密演算法的名稱和一些相關信息.

雖然說 crypt() 函數在使用上已足夠,但是 password_hash() 不僅可以使我們的代碼更加簡短,而且還在安全方面給了我們更好的保障,所以,現在PHP的官方都是推薦這種方式來加密用戶的密碼,很多流行的框架比如 Laravel 就是用的這種加密方式。

$hash = password_hash($passwod, PASSWORD_DEFAULT);

對,就是這麼簡單,一行代碼,All done。

PASSWORD_DEFAULT 目前使用的就是 Bcrypt ,所以在上面我會說推薦這個,不過因為 Password Hashing API 做得更好了,我必須鄭重地想你推薦 Password Hashing API 。這裡需要注意的是,如果你代碼使用的都是 PASSWORD_DEFAULT 加密方式,那麼在資料庫的表中,password欄位就得設置超過60個字元長度,你也可以使用 PASSWORD_BCRYPT ,這個時候,加密後字串總是60個字元長度。

這裡使用 password_hash() 你完全可以不提供鹽值 (salt) 和 消耗值 (cost),你可以將後者理解為一種性能的消耗值, cost 越大,加密演算法越複雜,消耗的內存也就越大。當然,如果你需要指定對應的鹽值和消耗值,你可以這樣寫:

$options = [

‘salt’ = custom_function_for_salt(), //write your own code to generate a suitable salt

‘cost’ = 12 // the default cost is 10

];

$hash = password_hash($password, PASSWORD_DEFAULT, $options);

密碼加密過後,我們需要對密碼進行驗證,以此來判斷用戶輸入的密碼是否正確:

if (password_verify($password, $hash)) {

// Pass

}

else {

// Invalid

}

很簡單的吧,直接使用 password_verify 就可以對我們之前加密過的字元串(存在資料庫中)進行驗證了。

然而,如果有時候我們需要更改我們的加密方式,如某一天我們突然想更換一下鹽值或者提高一下消耗值,我們這時候就要使用到 password_needs_rehash() 函數了:

if (password_needs_rehash($hash, PASSWORD_DEFAULT, [‘cost’ = 12])) {

// cost change to 12

$hash = password_hash($password, PASSWORD_DEFAULT, [‘cost’ = 12]);

// don’t forget to store the new hash!

}

只有這樣,PHP的 Password Hashing API 才會知道我們重現更換了加密方式,這樣的主要目的就是為了後面的密碼驗證。

簡單地說一下 password_get_info() ,這個函數一般可以看到下面三個信息:

algo – 演算法實例

algoName – 演算法名字

options – 加密時候的可選參數

所以,現在就開始用PHP 5.5吧,別再糾結低版本了。

php中如何處理用戶輸入內容中的換行呢?

俺來說說我的做法:1、保存的時候不做任何處理,直接保存換行符號,無論是存到db還是存到文本文件里。2、顯示的時候,可以用nl2br()函數把換行符轉換成

這個html標籤。如果是windows操作系統輸入的內容,用nl2br()就已經沒問題了,但如果是linux操作系統輸入的換行符,它是:\r\n;那麼它會把一個\r\n替換成兩個

,所以比較兼容的做法,是自己來替換它。用正則表達式替換的代碼示例如下:echo preg_replace(‘/(?:\r\n|\n)/’, ”, $html);

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258673.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-15 12:50
下一篇 2024-12-15 12:50

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python熱重載技術

    Python熱重載技術是現代編程的關鍵功能之一。它可以幫助我們在程序運行的過程中,更新代碼而無需重新啟動程序。本文將會全方位地介紹Python熱重載的實現方法和應用場景。 一、實現…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • Python包絡平滑技術解析

    本文將從以下幾個方面對Python包絡平滑技術進行詳細的闡述,包括: 什麼是包絡平滑技術? Python中使用包絡平滑技術的方法有哪些? 包絡平滑技術在具體應用中的實際效果 一、包…

    編程 2025-04-29
  • 微信小程序重構H5技術方案設計 Github

    本文旨在探討如何在微信小程序中重構H5技術方案,以及如何結合Github進行代碼存儲和版本管理。我們將從以下幾個方面進行討論: 一、小程序與H5技術對比 微信小程序與H5技術都可以…

    編程 2025-04-28
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • HTML sprite技術

    本文將從多個方面闡述HTML sprite技術,包含基本概念、使用示例、實現原理等。 一、基本概念 1、什麼是HTML sprite? HTML sprite,也稱CSS spri…

    編程 2025-04-28
  • Python工作需要掌握什麼技術

    Python是一種高級編程語言,它因其簡單易學、高效可靠、可擴展性強而成為最流行的編程語言之一。在Python開發中,需要掌握許多技術才能讓開發工作更加高效、準確。本文將從多個方面…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若伺服器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27

發表回復

登錄後才能評論