如何与cURL父级和子级保持持久的mysqli连接

时间:2019-01-15 02:08:52

标签: php mysqli connection persistent

从父级到多个子级进行cURL并执行mysqli查询时,出现错误(连接过多)

我尝试过仅在父级以及父级和子级中使用持久性连接。当我从父母到25个孩子进行URL测试时,大约要处理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 -->

我从父级和子级中删除了一些写入日志的代码,并且子级中对loadtest.script.php的引用是一个占位符,该占位符只不过是在文本文件中写了一行。

现在,我位于共享服务器上,最多无法更改240个连接。我将在不久的将来使用专用服务器。

关于如何使子代在相同的持久连接上运行并避免“太多连接” mysql错误的任何建议?

还有其他建议。

谢谢。

0 个答案:

没有答案