Laravel 5.4 给出错误的 COM_STMT_PREPARE 响应大小
Laravel 5.4 gives Wrong COM_STMT_PREPARE response size
我在一个网站上工作,过去一个月运行良好,昨天突然崩溃并显示 Wrong COM_STMT_PREPARE response size. Received 7
。
这是我在控制器中的代码:
public function newsFeed()
{
// get all data needed for the news page
try{
$news = DB::SELECT("SELECT
n.newId
,n.title_en
,n.title_es
,n.description_en
,n.description_es
,n.newMainImg
,n.tags
,DATE_FORMAT(n.createDate, '%b - %e - %Y') as publishDate_en
,DATE_FORMAT(n.createDate, '%e - %b - %Y') as publishDate_es
,concat(u.firstName,' ',u.lastName) as author
FROM NEWS n
inner join USERS u
on u.userId = n.author
and u.statusId = 1
order by n.createDate desc limit 20");
$favorites = DB::SELECT("SELECT
n.newId
,n.title_en
,n.title_es
,n.newMainImg
FROM
NEWS n
WHERE viewsCount > 0
and viewsCount is not null
order by viewsCount desc limit 6");
$data = array(
'news' => $news,
'favorites' => $favorites
);
return view('news/newsFeed')->with('data', $data);
}catch(Exception $exc){
echo $exc->getMessage();
}
}
我还没有找到任何解决方案。任何帮助将不胜感激。
更新:
如果服务器在 000webhost 中,我看到很多人遇到同样的问题。
更新 2
错误说问题出在Connection.php第647行
这是围绕它的代码:
protected function run($query, $bindings, Closure $callback)
{
$this->reconnectIfMissingConnection();
$start = microtime(true);
// Here we will run this query. If an exception occurs we'll determine if it was
// caused by a connection that has been lost. If that is the cause, we'll try
// to re-establish connection and re-run the query with a fresh connection.
try {
$result = $this->runQueryCallback($query, $bindings, $callback);
} catch (QueryException $e) {
$result = $this->handleQueryException(
$e, $query, $bindings, $callback
);
}
// Once we have run the query we will calculate the time that it took to run and
// then log the query, bindings, and execution time so we will report them on
// the event that the developer needs them. We'll log time in milliseconds.
$this->logQuery(
$query, $bindings, $this->getElapsedTime($start)
);
return $result;
}
和
protected function runQueryCallback($query, $bindings, Closure $callback)
{
// To execute the statement, we'll simply call the callback, which will actually
// run the SQL against the PDO connection. Then we can calculate the time it
// took to execute and log the query SQL, bindings and time in our memory.
try {
$result = $callback($query, $bindings);
}
// If an exception occurs when attempting to run a query, we'll format the error
// message to include the bindings with SQL, which will make this exception a
// lot more helpful to the developer instead of just the database's errors.
catch (Exception $e) {
throw new QueryException(
$query, $this->prepareBindings($bindings), $e
);
}
return $result;
}
我通过将 PDO 属性 PDO::ATTR_EMULATE_PREPARES
设置为 true 解决了这个问题。您可以在 config/database.php 下向您的数据库连接添加一个选项。
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
//.......
'options' => [PDO::ATTR_EMULATE_PREPARES => true,]
],
我在 Laravel 7.5 + PHP 7.4
中遇到了同样的错误,但在 pcntl_fork()
之后。
错误日志显示此错误来自代码的不同部分 运行 同时在子进程中。
在所有子进程中重新连接到数据库(在分叉之后)解决了这个问题。
我在一个网站上工作,过去一个月运行良好,昨天突然崩溃并显示 Wrong COM_STMT_PREPARE response size. Received 7
。
这是我在控制器中的代码:
public function newsFeed()
{
// get all data needed for the news page
try{
$news = DB::SELECT("SELECT
n.newId
,n.title_en
,n.title_es
,n.description_en
,n.description_es
,n.newMainImg
,n.tags
,DATE_FORMAT(n.createDate, '%b - %e - %Y') as publishDate_en
,DATE_FORMAT(n.createDate, '%e - %b - %Y') as publishDate_es
,concat(u.firstName,' ',u.lastName) as author
FROM NEWS n
inner join USERS u
on u.userId = n.author
and u.statusId = 1
order by n.createDate desc limit 20");
$favorites = DB::SELECT("SELECT
n.newId
,n.title_en
,n.title_es
,n.newMainImg
FROM
NEWS n
WHERE viewsCount > 0
and viewsCount is not null
order by viewsCount desc limit 6");
$data = array(
'news' => $news,
'favorites' => $favorites
);
return view('news/newsFeed')->with('data', $data);
}catch(Exception $exc){
echo $exc->getMessage();
}
}
我还没有找到任何解决方案。任何帮助将不胜感激。
更新:
如果服务器在 000webhost 中,我看到很多人遇到同样的问题。
更新 2
错误说问题出在Connection.php第647行
这是围绕它的代码:
protected function run($query, $bindings, Closure $callback)
{
$this->reconnectIfMissingConnection();
$start = microtime(true);
// Here we will run this query. If an exception occurs we'll determine if it was
// caused by a connection that has been lost. If that is the cause, we'll try
// to re-establish connection and re-run the query with a fresh connection.
try {
$result = $this->runQueryCallback($query, $bindings, $callback);
} catch (QueryException $e) {
$result = $this->handleQueryException(
$e, $query, $bindings, $callback
);
}
// Once we have run the query we will calculate the time that it took to run and
// then log the query, bindings, and execution time so we will report them on
// the event that the developer needs them. We'll log time in milliseconds.
$this->logQuery(
$query, $bindings, $this->getElapsedTime($start)
);
return $result;
}
和
protected function runQueryCallback($query, $bindings, Closure $callback)
{
// To execute the statement, we'll simply call the callback, which will actually
// run the SQL against the PDO connection. Then we can calculate the time it
// took to execute and log the query SQL, bindings and time in our memory.
try {
$result = $callback($query, $bindings);
}
// If an exception occurs when attempting to run a query, we'll format the error
// message to include the bindings with SQL, which will make this exception a
// lot more helpful to the developer instead of just the database's errors.
catch (Exception $e) {
throw new QueryException(
$query, $this->prepareBindings($bindings), $e
);
}
return $result;
}
我通过将 PDO 属性 PDO::ATTR_EMULATE_PREPARES
设置为 true 解决了这个问题。您可以在 config/database.php 下向您的数据库连接添加一个选项。
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
//.......
'options' => [PDO::ATTR_EMULATE_PREPARES => true,]
],
我在 Laravel 7.5 + PHP 7.4
中遇到了同样的错误,但在 pcntl_fork()
之后。
错误日志显示此错误来自代码的不同部分 运行 同时在子进程中。
在所有子进程中重新连接到数据库(在分叉之后)解决了这个问题。