首先,一些背景知识:我正在开发一个2000之前的网站,它在任何地方都使用mysql_connect
和mysql_*
个功能。目前简单地替换所有这些是不可行的。
mysqli_*
功能。我遇到了一个我需要使用mysqli_multi_query
的实例,并且想知道它是否会更好:
mysqli_connect()
功能,就像我使用mysql_connect()
功能一样,并且在我的脚本开头连接,最后在所有页面上关闭。我在决定这些问题时遇到的麻烦是 1 限制了我可以在一个页面上执行的多个查询的数量(同时还增加了需要完成的未来代码清理) ), 2 也增加了代码清理,虽然没有 1 那么多, 3 可能效率低或不安全,虽然我可以在遇到旧查询时进行清理。
该网站每月访问量超过100万。
任何人都知道在这种情况下什么是“最佳实践”?
答案 0 :(得分:0)
"最佳实践"似乎是在你的MySQL连接中使用PDO,根据最近在搜索主题时出现的文章(例如https://phpbestpractices.org/#mysql),虽然我找不到关于何时打开这些连接的任何具体指导,如果在该页面上并不严格要求它们。
我建议选择第二种选择,因为抽象使代码在未来对您和其他开发人员来说更易于管理和维护。据我所知,并排使用mysql_*
和mysqli_*
函数没有特定的缺点,建议在所有mysqli_*
上使用mysql_*
例
(请参阅http://www.php.net/manual/en/mysqlinfo.api.choosing.php,'推荐的API')下的部分。
但是,在完成转换之前,您的代码将不会像以前那样安全。
我想说的是,在没有严格要求的情况下是否打开连接是对你的判断要求 - 我倾向于只在你需要时根据效率的一般原则打开它,不过在处理遗留代码时练习它可能比它的价值更麻烦。如果你的服务器没有太慢,你可以忍受它,只要你认识到它并不是最有效的方式。
答案 1 :(得分:0)
PHP提供三种不同的API来连接MySQL:mysql(过时),mysqli和PDO扩展。
您无需在每次请求时连接到数据库。
mysqli_connect() with p: host prefix
//or
PDO::__construct() with PDO::ATTR_PERSISTENT as a driver option
http://www.php.net/mysql_pconnect
在您的情况下,我将使用PDO类型连接实现为具有“永久”连接选项的单例模式。
包含在每个脚本的顶部。
class Database {
private static $instance;
private $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
private $user = 'dbuser';
private $password = 'dbpass';
public static function getInstance() {
if(!self::$instance) {
self::$instance =
new PDO($this->dsn,
$this->user,
$this->password,
array(PDO::ATTR_PERSISTENT)
);
}
return self::$instance;
}
}
这样你可以通过以下方式获取数据库实例:
Database::getInstance();
...并且不要因为在遗留应用中使用单身而激怒我! ;)