Я использую собственный драйвер MySQL для PHP, чтобы выполнять асинхронные параллельные запросы из приложения PHP к базе данных MySQL.
У меня есть функция, которая получает массив строк запросов и выполняет их параллельно.
По какой-то причине, хотя, в одной конкретной среде, где я использую эту функцию, следующее предупреждение PHP выводится на Apache error_log
в массе:
PHP Warning: mysqli_poll(): Parameter 1 not a mysqli object
Я предполагаю, что это происходит, когда одна или несколько переменных подключения к БД передаются в массив для первого аргумента mysqli_poll
Функция не является допустимым объектом MySQLi, но, глядя на мой код, я не понимаю, как она могла бы достичь этой точки с самого начала.
В частности, вот код, о котором идет речь:
function makeAsyncQueries($queries) {
$allLinks = [];
$allLinkThreadIds = [];
$allResults = [];
foreach ($queries as $query) {
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME, DB_PORT);
$result = mysqli_query($link, $query, MYSQLI_ASYNC);
if ($result !== false) {
$allLinks[] = $link;
$allLinkThreadIds[] = mysqli_thread_id($link);
} else {
// Attempting to log. This condition is never met.
}
}
$processed = 0;
while ($processed < count($allLinks)) {
$links = $errors = $reject = [];
foreach ($allLinks as $link) {
$links[] = $errors[] = $reject[] = $link;
}
if (mysqli_poll($links, $errors, $reject, 0, 0)) { // This causes the error.
foreach ($links as $link) {
if ($results = mysqli_reap_async_query($link)) {
$idx = array_search(mysqli_thread_id($link), $allLinkThreadIds);
if ($results !== false) {
$allResults[$idx] = processDbResults($results); // Custom function
} else {
// Attempting to log. This condition is never met.
}
freeResults($link); // Custom function
$processed++;
}
}
}
}
ksort($allResults);
return $allResults;
}
Если по какой-то причине результат mysqli_query
неверно, то $result
переменная должна быть false
, право? Но остальная часть if ($result !== false)
никогда не будет удовлетворен, поэтому можно ли предположить, что $result
действует и что $link
является допустимым объектом MySQLi?
Если это так, то как я могу получить предупреждение PHP от mysqli_poll
вызов функции?
Любые указатели, которые помогут мне понять, где я что-то неправильно понимаю, будут чрезвычайно полезны.
Благодарю.
Задача ещё не решена.
Других решений пока нет …