У меня есть php-код, который должен синхронизировать данные из тысяч http-ссылок каждые 2 минуты и обновлять базу данных.
Однако некоторые сайты работают слишком медленно, и мой текущий подход, который использует foreach и просматривает ссылки по одной, занимает около 15 минут.
Есть ли лучший способ решить эту задачу в более короткие сроки?
foreach($email as $emails) {
imap_open(......);
// update db
}
Спасибо
Без примера кода советовать сложно. Однако может случиться так, что вы используете метод подключения, который «блокирует» до получения ответа. Это означает, что PHP останавливается, пока этот запрос не будет выполнен по одному.
Что вам нужно, это подключиться к нескольким системам одновременно и опросить ответы.
fsockopen () может сделать это, если вы установили stream_set_blocking () на сокете перед записью заголовков HTTP-запроса. Тогда фред может
Альтернативное решение состоит в том, чтобы разбить PHP на множество процессов, каждый из которых запрашивает другой источник.
Этого достаточно, чтобы указать вам правильное направление? Если нет, пожалуйста, включите пример кода, чтобы мы знали, какие методы вы используете в настоящее время, и кто-то может расширить его, чтобы сделать то, что вам нужно.
Да, делай их параллельно.
Одним из решений было бы добавление текущего списка URL-адресов, скажем, в 20 потоков. Вы не показали нам свой код, но воображаете, что он в настоящее время делает что-то вроде этого:
$urls=mysqli_query($link,
"SELECT url FROM list");
while ($r=mysqli_fetch_assoc($urls)) {
...
Вы можете попробовать что-то вроде следующего, чтобы осколить набор данных:
$instance=(integer)$argv[1];
if (0==$instance) {
die("Next time start me with a number between 1 and 20 indicating the thread");
}
$urls=mysqli_query($link,
"SELECT url FROM list WHERE $instance-1 = CONVERT(
CONV(SUBSTR(MD5(url),4), 16, 10) USING SIGNED INTEGER)
) % 20
");
В качестве альтернативы вы можете сгруппировать HTTP-запросы в одном потоке PHP и вызвать их с помощью текущего curl_multi_exec