Как я могу поддерживать постоянную связь mysqli с родителем и детьми cURL - PullRequest
0 голосов
/ 15 января 2019

Я получаю ошибки (слишком много подключений), когда я отбираю у одного из родителей несколько детей и выполняю запросы mysqli

Я пытался использовать постоянные соединения только для родителя, а также для родителя и потомков. Когда я проверяю от родителя до 25 детей в качестве теста, примерно 20 будет обрабатываться, а затем я получаю ошибку «слишком много соединений». Журналы подтверждают, что не все дочерние процессы выполняются.

Вот код для родителя:

<!-- parent start -->

$link = mysqli_connect('p:host', 'user', 'password', 'database');

$sql = mysqli_query($link, "SELECT * FROM t1");
$rowcount = mysqli_num_rows($sql);

if ($rowcount > '0') {
    $mh = curl_multi_init();
    $active = null;
}

while ($row = mysqli_fetch_assoc($sql)) {
    $sql2 = mysqli_query($link, "SELECT id FROM t2 WHERE field1 = 'Waiting'");

    $row2 = mysqli_fetch_assoc($sql2);
    extract($row2);

    // spawn child process

    $ch = '$ch' . $id;
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, 'loadtest.child.php');
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_USERAGENT, 'loadtest.parent.php');
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);

    $curl_data = 'jid=' . $id;

    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_data);

    curl_multi_add_handle($mh,$ch);
}

do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

curl_multi_remove_handle($mh, $ch);
curl_multi_close($mh);

?>
<!-- parent end -->

и ребенок:

<!-- child start -->

$link = mysqli_connect('p:host', 'user', 'password', 'database');
$sql = mysqli_query($link, "SELECT * FROM t3 WHERE field1 ='" . $jid . "' LIMIT 1");
$row = mysqli_fetch_assoc($sql);
extract($row);

$sql2 = mysqli_query($link, "SELECT * FROM t4 WHERE field1='" . $jid . "' LIMIT 1");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'loadtest.script.php);
$result = curl_exec($ch);
curl_close($ch);

$sql_update = mysqli_query($link, "UPDATE t1 SET status = 'Processed' WHERE field1 = '$jid'");

<!-- child end -->

Я удалил некоторый код из родительского и дочернего, который записывает в журналы, и ссылка в child на loadtest.script.php - это заполнитель, который не делает ничего, кроме записи одной строки в текстовый файл.

Сейчас я нахожусь на общем сервере и имею максимум 240 подключений, которые я не могу изменить. Я буду ходить на выделенный сервер в ближайшее время.

Любые предложения о том, как заставить детей работать на том же постоянном соединении и избежать ошибки mysql «слишком много соединений»?

Также приветствуются любые другие предложения.

Спасибо.

...