如何摆脱MySQL错误“准备的语句需要重新准备”
我已经重写了我的网站php代码并添加了MySQL存储过程。
在我的本地版本中,一切正常,但是在我将我的网站上传到托管服务器后,我经常收到致命错误“准备语句需要重新准备”。
有时页面加载,有时加载失败,我看到此错误。什么?
我已经重写了我的网站php代码并添加了MySQL存储过程。
在我的本地版本中,一切正常,但是在我将我的网站上传到托管服务器后,我经常收到致命错误“准备语句需要重新准备”。
有时页面加载,有时加载失败,我看到此错误。什么?
@docwhat的答案似乎不错,但在共享主机服务器上,并非每个人都可以触摸或选项。table_open_cache
table_definition_cache
由于此错误与预准备语句有关,因此我尝试通过提供以下选项来“模拟”PDO 中的错误:
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, [
PDO::ATTR_EMULATE_PREPARES => true
]);
注意:实际上这是在Laravel 5.6项目中,我在以下位置添加了该选项:config/database.php
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
'options' => [
PDO::ATTR_EMULATE_PREPARES => true,
],
],
(...)
],
我还没有测试模拟预准备语句对加载我的网站的持续时间的影响,但它可以防止我得到的错误。SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared
性能更新:模拟版本似乎稍快(模拟32.7±1.4ms,正常35.0±2.3ms,n=10,p值=0.027(双尾学生T检验)。