
$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=localhostdbname=test"
$db= new PDO($dbh,'xueyanxiang','xueyanxiang')
$objQuery= $db->query("select * from user")
$res= $objQuery->fetchAll(PDO::FETCH_ASSOC)
不填写参数的话,默认是关联和索引都有,如下图
们都知道,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数据库的具体实现,需要的朋友可以参考下实例:
代码如下:
<?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1")
mysql_select_db("db1",
$conn1)
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2")
mysql_select_db("db2",
$conn2)
$sql
=
"select
*
from
ip"
$query
=
mysql_query($sql)
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n"
$sql
=
"select
*
from
web
"
$query
=
mysql_query($sql)
if($row
=
mysql_fetch_array($query))
echo
$row[0]
?>
这段代码存在问题,在程序执行时会报错:PHP
Warning:
mysql_fetch_array()
expects
parameter
1
to
be
resource,
boolean
given
in
....
原因分析:
程序开始建立两个数据库链接,函数mysql_query()原型:
resource
mysql_query
(
string
$query
[,
resource
$link_identifier
]
)
向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询。如果没有指定
link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用
mysql_connect()
函数来建立一个连接并使用之。查询结果会被缓存。
在本例中由于没有指定link_identifier,所以,在执行第一条sql时,默认使用的是上一个打开的链接,即$conn2,而实际上第一条sql语句应该使用的是$conn1,所以导致报错,所以为了能够链接多个mysql数据库,可以使用如下方法:
方法1:在mysql_query函数中指定所用连接,即:
代码如下:
<?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1")
mysql_select_db("Muma",
$conn1)
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2")
mysql_select_db("product",
$conn2)
$sql
=
"select
*
from
ip"
$query
=
mysql_query($sql,$conn1)
//添加连接$conn1
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n"
$sql
=
"select
*
from
web
"
$query
=
mysql_query($sql,
$conn2)
if($row
=
mysql_fetch_array($query))
echo
$row[0]
?>
方法2:在sql语句中关联所用数据库,此时可以省略mysql_query的第二个参数,即:
代码如下:
<?php
$conn1
=
mysql_connect("127.0.0.1",
"root","root","db1")
mysql_select_db("db1",
$conn1)
$conn2
=
mysql_connect("127.0.0.1",
"root","root","db2")
mysql_select_db("db2",
$conn2)
$sql
=
"select
*
from
db1.ip"
//关联数据库
$query
=
mysql_query($sql)
if($row
=
mysql_fetch_array($query))
echo
$row[0]."n"
$sql
=
"select
*
from
db2.web
"
$query
=
mysql_query($sql)
if($row
=
mysql_fetch_array($query))
echo
$row[0]
?>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)