2015-09-04 82 views
1

我有PHP/PDO和MySQLPHP PDO返回的SELECT FOUND_ROWS不一致的結果()

一個問題,當我運行一個查詢與SQL_CALC_FOUND_ROWS,然後選擇FOUND_ROWS(),其返回0,80%的時間,而其餘的時間FOUND_ROWS是準確的

我已經減少到一個簡單的測試循環,但是這對我的開發服務器正常工作,但在生產測試用例有不一致的問題。

從MySQL命令行運行相同的查詢工作正常,即使在生產,所以它似乎是一個PHP/PDO問題

PHP 5.5.28 - 使用mysqlnd 5.0.11-dev的 Percona的服務器25年6月5日-73.1-登錄CentOS 6.6(最終)

任何人都可以幫忙嗎?我試過了我能想到的所有東西,並且我正在撕掉我的頭髮

<?php 
require_once "../consts.php"; 

$nolimit_query = "select SQL_CALC_FOUND_ROWS targetusers.u_id 
    FROM 
    users targetusers 
    LEFT JOIN user_extra targetuserextra ON (targetuserextra.ue_userid = targetusers.u_id) 
    LEFT JOIN countries ON (c_id = targetusers.u_country) 
    LEFT JOIN cities ON (cities.ct_countryid = c_id and cities.ct_id = targetusers.u_city) 
    LEFT JOIN userimages ON (targetusers.u_primaryimage = userimages.ui_id and userimages.ui_userid = targetusers.u_id and userimages.ui_imagetype = 'P') 
    WHERE 
    (targetusers.u_deleted = 0) and 
    (targetusers.u_id NOT IN (19, 32, 115)) and 
    (targetusers.u_active = 1) and 
    (targetusers.u_confirmed=5) order by u_lastupdated DESC LIMIT 10, 10"; 

// already tried this soln suggested elsewhere -- defaults to off for my PHP anyway though 
ini_set("mysql.trace_mode", 0); 
ini_set("display_errors", 1); 

// set up PDO connection 
$dbh = new PDO(
    "mysql:host=" . Config::Get()->DB_SERVER . ";dbname=" . Config::Get()->DATABASE_NAME . ";charset=utf8", 
    Config::Get()->DB_USERNAME, 
    Config::Get()->DB_PASSWORD 
); 
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$dbh->setAttribute(PDO::ATTR_PERSISTENT, false); 

echo $dbh->getAttribute(PDO::ATTR_CLIENT_VERSION) . "<br>"; 
echo $dbh->getAttribute(PDO::ATTR_DRIVER_NAME) . "<br>"; 
echo $dbh->getAttribute(PDO::ATTR_SERVER_INFO) . "<br>"; 
echo $dbh->getAttribute(PDO::ATTR_SERVER_VERSION) . "<br><br>"; 

echo date("r") . "<br>"; 
for ($i=0; $i<5; $i++) 
{ 
    // run query above 
    $stmt = $dbh->prepare($nolimit_query); 
    if ($stmt === FALSE) 
    { 
     die($stmt->errorInfo()); 
    } 

    // get result set 
    if (($result = $stmt->execute()) === TRUE) 
    { 
     $a = $stmt->fetchAll(PDO::FETCH_ASSOC); 
     $stmt->closeCursor(); 
     $stmt = NULL; 

     // this query returns inconsistent results (80% of the time it returns 0!) 
     $b = $dbh->query("SELECT FOUND_ROWS() as cnt")->fetch(PDO::FETCH_ASSOC); 
     echo "FOUND ROWS = " . $b["cnt"] . "<br>";  
    } 
} 

此腳本的輸出如下。

請注意,只有2 5環路返回爲FOUND_ROWS正確的值,與其他3回來爲0

mysqlnd 5.0.11-dev - 20120503 - $Id: 15d5c781cfcad91193dceae1d2cdd127674ddb3e $ 
mysql 
Uptime: 1857223 Threads: 1 Questions: 4446069 Slow queries: 32 Opens: 465 Flush tables: 1 Open tables: 403 Queries per second avg: 2.393 
5.6.25-73.1 

Fri, 04 Sep 2015 12:01:10 +0100 
FOUND ROWS = 0 
FOUND ROWS = 0 
FOUND ROWS = 59836 
FOUND ROWS = 0 
FOUND ROWS = 59836 
+0

只是一個小點,你設置errormode to Exception但是你沒有在try/catch塊中運行db代碼 – RiggsFolly

+0

你也在不需要的循環內準備一個語句 – RiggsFolly

+1

你正在做的一切都是正確的,因爲[使用try catch來獲取基本錯誤報告只是一個妄想](http://phpdelusions.net/try-catch) –

回答

1

問題解決了。原來,NewRelic的應用程序監控後臺程序或擴展與FOUND_ROWS的)結果(

說的那麼壞干擾:(

禁用擴展和FOUND_ROWS是防彈再次

+0

newrelic正在調查。如果其他人遇到此問題,解決方法是設置newrelic.transaction_tracer.explain_enabled = false – carpii