nikitasius: пока не забанили, но я заметил интересную особенность: в сутки в статистике получается ровно 2тб трафа на аккаунт, не больше.
Скорее всего, это значит что у них лимит по полосе для одного юзера около 100мбит/с
там в цикле $db1->prepare('update files set `time` = NOW() where id_file = ? ')->execute([$row['id_file']]);
и оно висит наверное лок таймаут ждет grab.by/D6RU
FanatPHP: с этим способом есть проблемы...
Например, если мне надо процессить таблицу и заносить туда данные что я обработал строчку.
Такой вариант совсем не канает (LIMIT 1000 стоит чтобы долго не ждать)
<?php
$db = new PDO("mysql:host=localhost;dbname=dwl", 'root', 'root');
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$q = $db->prepare("SELECT * FROM files ORDER BY id_file ASC LIMIT 1000");
$q->execute();
while ($row = $q->fetch()) {
echo "$row[id_file] \n";
$db->prepare('update files set `time` = NOW() where id_file = ? ')->execute([$row['id_file']]);
}
?>
данные не обновляются, потому что как оказалось при unbuffered query нельзя выполнять другие запросы в этом же коннекте.
А вариант с отдельным коннектом $db1
<?php
$db = new PDO("mysql:host=localhost;dbname=dwl", 'root', 'root');
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$q = $db->prepare("SELECT * FROM files ORDER BY id_file ASC LIMIT 1000");
$q->execute();
$db1 = new PDO("mysql:host=localhost;dbname=dwl", 'root', 'root');
while ($row = $q->fetch()) {
echo "$row[id_file] \n";
$db->prepare('update files set `time` = NOW() where id_file = ? ')->execute([$row['id_file']]);
}
?>
привносит какой-то коллапс, видимо табла лочится, запросы ставятся в очередь, там обновилось всего около сотки строчек и выдало ошибку
Warning: Empty row packet body in /Users/evgenij/projects/snip/fetch.php on line 8
PHP Warning: Empty row packet body in /Users/evgenij/projects/snip/fetch.php on line 8
Jodes: это быстрее выполняется чем с лимитами
<?php
$db = new PDO("mysql:host=localhost;dbname=dwl", 'root', 'root');
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
$q = $db->prepare("SELECT * FROM files ORDER BY id_file ASC");
$q->execute();
while ($row = $q->fetch()) {
echo "$row[id_file] \n";
}
FanatPHP: Вот ты меня озадачил. Я наконец понял что ты имел в виду так называемый datareader, но у меня не получается реализовать на pdo, не подскажешь как?
вот вариант "в лоб" grab.by/D6Ge
вот покумекал с курсором grab.by/D6Hu
ну а вот вариант с батчами по 10к grab.by/D6IQ
в таблице около 230к записей
Jodes: Обычно такие задачи стоят ТОЛЬКО перед сервис-скриптами. Ну например, надо базу текстов песен переложить на эластик поиск, для этого хочешь не хочешь придется вытащить все записи, и тащить порциями зачастую единственный вариант.
Но если вся таблица с овер 10к записями тащится через орм, то это уже нездоровая фигня.