@docwhat's 的答案看起来不错,但在共享托管服务器上,并非所有人都可以触摸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 检验)。