本文目錄一覽:
- 1、PHP7連接mysql數據庫方法
- 2、php-fpm怎麼連接的mysql
- 3、php連接mysql數據庫原理是怎樣的
- 4、php和mysql是怎麼連接起來的
- 5、php連接mysql數據庫原理是怎樣的?如果想把一個已做好的php網站,連接到已安裝好的mysql數據庫怎麼做?
PHP7連接mysql數據庫方法
1、用 mysql_connect 的方法,PHP7會報致命錯誤
$conn= mysql_connect(‘localhost’,’xueyanxiang’,’xueyanxiang’);
Fatal error : Uncaught Error: Call to undefined function mysql_connect() in /Users/xueyanxiang/work/test/xue.php:31 Stack trace: #0 /Users/xueyanxiang/work/test/xue.php(119): xue-run() #1 {main} thrown in /Users/xueyanxiang/work/test/xue.php on line 31
原因是:
PHP5中使用mysql_connect()函數進行連接,但實際上,PHP5.5開始,MySQL就不推薦使用了,屬於廢棄函數
PHP7中貌似已經徹底不支持了,根據官網說明,取而代之的是如下兩個:
本擴展自 PHP 5.5.0 起已廢棄,並在將來會被移除。應使用 MySQLi 或 PDO_MySQL 擴展來替換之。參見 MySQL:選擇
API 指南以及相關 FAQ 以獲取更多信息。用以替代本函數的有:
mysqli_connect()
PDO::__construct()
使用時,不要在使用mysql_connect了,可以換用mysqli_connect(),用法基本類似吧,據說是面向對象的庫。
php.ini中,也只有extension=php_mysqli.dll,而不再有extension=php_mysql.dll這個拓展了。
2、可以使用mysqli,對象化,方法名與被廢棄的類似
$conn= mysqli_connect(‘localhost’,’xueyanxiang’,’xueyanxiang’);
3、PDO工具,推薦使用
$dbh= “mysql:host=localhost;dbname=test”;
$db= new PDO($dbh,’xueyanxiang’,’xueyanxiang’);
$objQuery= $db-query(“select * from user;”);
$res= $objQuery-fetchAll(PDO::FETCH_ASSOC);
不填寫參數的話,默認是關聯和索引都有,如下圖
php-fpm怎麼連接的mysql
們都知道,php是不能直接操作 mysql的,他需要通過擴展提供接口調用,php的mysql擴展也好幾個,只支持面向過程的mysql,既支持面向過程也支持面向對象的mysqli,只支持面向對象的PDO,當然無論是那個擴展,也只是php語法寫法上的區別而已,底層其實是一樣的。
今天我們不講語法這些老掉牙的東西,我們隨便找一個擴展,來分析一下 php底層 和 mysql 之間的通信原理。
首先我們來理解一下 php-fpm 的工作原理,php-fpm 是一個 php-cgi 進程管理器,其實就是一個連接池,它和nginx配合的工作原理如下。
我們先從最簡單的靜態方式入手觀察他的工作原理
vim php-fpm.ini
[www]
pm = static
pm.max_children = 5
pm.max_requests = 2
上面三句話的含義是什麼呢:
1、static 表示靜態以靜態方式生成 php-fpm 進程
2、pm.max_children = 5 表示當 php-fpm 啟動時就啟動 5 個 php-fpm 子進程 等待處理 nginx 發過來的請求
3、pm.max_requests = 2 表示每個 php-fpm 子進程處理 2 個請求就銷毀,當然父進程每次看到有銷毀的自然也就會生成新的子進程
我們來簡單驗證一下這個說法:
首先重啟 php-fpm,讓它複位一下
接下來寫一條簡單的語句輸出當前進程ID
echo “當前 php-fpm 進程ID:”.posix_getpid();
不斷刷新瀏覽器觀察輸出變化
當前 php-fpm 進程ID:24548
當前 php-fpm 進程ID:24549
當前 php-fpm 進程ID:24550
當前 php-fpm 進程ID:24547
當前 php-fpm 進程ID:24551
當前 php-fpm 進程ID:24548
當前 php-fpm 進程ID:24549
當前 php-fpm 進程ID:24550
當前 php-fpm 進程ID:24547
當前 php-fpm 進程ID:24551
當前 php-fpm 進程ID:24563
當前 php-fpm 進程ID:24564
當前 php-fpm 進程ID:24565
當前 php-fpm 進程ID:24566
當前 php-fpm 進程ID:24567
當前 php-fpm 進程ID:24563
當前 php-fpm 進程ID:24564
當前 php-fpm 進程ID:24565
當前 php-fpm 進程ID:24566
當前 php-fpm 進程ID:24567
當前 php-fpm 進程ID:24568
當前 php-fpm 進程ID:24569
當前 php-fpm 進程ID:24570
當前 php-fpm 進程ID:24571
當前 php-fpm 進程ID:24572
當前 php-fpm 進程ID:24568
當前 php-fpm 進程ID:24569
當前 php-fpm 進程ID:24570
當前 php-fpm 進程ID:24571
當前 php-fpm 進程ID:24572
可以看得出,第一批id不是按照順序執行的,進程id為24547的進程是在第四位處理的,然後從下面開始,所有id都是順序執行的而且每次生成的一批id都是遞增,是不是有種mysql自增主鍵的趕腳呢?
這裡需要注意的是,無論是靜態還是下面的動態配置方式,只要沒有設置 max_requests ,那麼進程是不會銷毀的,也就是說當一個進程裡面出現死循環或者內存溢出等導致進程僵死的情況出現的時候,處理的進程就會少一個了
好吧理解了靜態的處理方式,我們其實也很容易知道這個方式的弊端了,當然我們平時服務器不可能就開5個進程每個進程處理2個請求,我們來做一個簡單的加減乘除,看看一個服務器應該開多少個 php-fpm 合適
首先我們來看看一個簡單的echo需要多少內存:
$size = memory_get_usage();
$unit = array(‘b’,’kb’,’mb’,’gb’,’tb’,’pb’);
$memory = @round($size/pow(1024,($i=floor(log($size,1024)))),2).’ ‘.$unit[$i];
echo “當前 php-cgi 進程所使用內存:”.$memory;
觀察瀏覽器我們可以得到一下數據:
當前 php-cgi 進程所使用內存:227.17 kb
也就是說一個簡單的什麼都不幹的php就已經佔用了200多K的內存,當然這也不算多。
不過進程多了cpu切換進程速度就會變慢,所以這個數還是需要通過ab等測試工具才能測試出具體應該開多少比較合理
我們先從200開始,不斷的增加,架設增加到800的時候,效率和400一樣,那我們就沒必要開800那麼多進程浪費內存了。
那麼問題就來了,如果同一時間請求出超過400呢?有人說會排隊等待,真的會排隊等待嗎?答案明顯是 php-fpm 是沒能力排隊了,因為處理請求的php-fpm子進程都用完了,那麼等待也就只能是在 nginx 等待,通常一個 nginx 也不只是轉發請求給 php-fpm 就完事了,他還要處理靜態文件呢?如果這些php請求導致nginx的請求數過多一直在等待,那麼訪問靜態文件自然也會卡了,這時候我們就需要配置成下面的動態處理方式。
[www]
pm.max_children = 10
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
;pm.max_requests = 2
上面五句話的含義是什麼呢:
1、dynamic 表示靜態以動態方式生成 php-fpm 進程
2、pm.max_children = 10 同時活動的進程數 10個
3、pm.start_servers = 5 表示當 php-fpm 主進程啟動時就啟動 5 個 php-fpm 子進程
4、pm.min_spare_servers = 2 表示最小備用進程數
5、pm.max_spare_servers = 8 表示最大備用進程數
6、pm.max_requests = 2 上面說過就不說了
當前 php-fpm 進程ID:2270
當前 php-fpm 進程ID:2271
當前 php-fpm 進程ID:2272
當前 php-fpm 進程ID:2273
當前 php-fpm 進程ID:2274
當前 php-fpm 進程ID:2270
當前 php-fpm 進程ID:2271
當前 php-fpm 進程ID:2272
當前 php-fpm 進程ID:2273
當前 php-fpm 進程ID:2274
當前 php-fpm 進程ID:2270
當前 php-fpm 進程ID:2271
當前 php-fpm 進程ID:2272
當前 php-fpm 進程ID:2273
當前 php-fpm 進程ID:2274
php連接mysql數據庫原理是怎樣的
mysql_connect(“網站mysql的url”,”賬戶”,”密碼”);
通常情況下
網站的mysql也是服務器上的
服務器廠商會給你mysql的url地址
通常用phphmyadmin在線管理mysql
因為window和linux的根目錄不太一樣
linux的根目錄是root
而mysql通常是和php等等平級的
你在瀏覽器地址欄輸入“localhost”
你可以看到你的apache
php
phpmyadmin
mysql
等等的目錄和信息
輸入localhost/info
可以看到php的信息
一般情況下
你把xxx.sql文件放到www下
以www為根目錄
mysql在上一級
就“../”
php文件在平級
即“./”
php和mysql是怎麼連接起來的
PHP文件夾下的php.ini配置文件下找到php_mysql.dll 和php_mysqli.dll這兩個擴展把前面的;去掉,既然後重啟服務器,用 mysql_connect來新建一個到mysql的連接
php連接mysql數據庫原理是怎樣的?如果想把一個已做好的php網站,連接到已安裝好的mysql數據庫怎麼做?
外部語言只是與mysql庫裡面的函數建立關係,並操作、獲取mysql庫返回值,,所以php連接mysql原理這個問題沒有什麼好答的,第二個問題,在你的php網站要調用mysql數據庫內容的地方,直接拿mysql函數庫中的mysql_conetct等函數來操作就行了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/309614.html