@grisha2217

Как правильно использовать асинхронность в MadelineProto Php?

Всем привет. Пытаюсь написать скрипт, который проверяет доступность телеграм логинов. Для этого есть метод account.checkUsername в апи телеграма. Мне за раз надо чекнуть 100+ логинов, в однопоточном режиме это занимает больше минуты. Решил переписать на async.

Написал такой код, он работает, если отключить режим асинхронности. Включаю режим - перестает работать. Если внутри foreach сделать var_dump то будет объект генератора.

$MadelineProto->async(true);
$me = $MadelineProto->get_self();
$MadelineProto->logger($me);

function handleUsers($usernames, $MadelineProto)
{
	$i = 0;
	$count = count($usernames);
	while ($i < $count)
	{
		yield $usernames[$i]['field_value'] => $MadelineProto->account->checkUsername(['username' => $usernames[$i]['field_value']]);
		$i++;
	}
}

foreach (handleUsers($usernames, $MadelineProto) AS $login => $available)
{
	if ($available)
	{
	  // Available
	}
	else
	{
		// Not available
	}
}
  • Вопрос задан
  • 422 просмотра
Пригласить эксперта
Ответы на вопрос 2
zabudkin
@zabudkin
Инженер-системотехник, программист, админ, ТПУ!!!!
yield $usernames[$i]['field_value'] => $MadelineProto->account->contacts.search(['username' => $usernames[$i]['field_value']],1);
    $i++;

Может лучше так?
Возможно ошибся в писанине вверху, но по сути contacts.search лучше, чем чекать каждого юзера. И на сколько я знаю, и даже если юзер переименуется, то в contacts.search ты его найдёшь по старому имени, а вот в checkUsername только по тому имени, что сейчас.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Возможно, что там происходит race-condition или "состояние гонки".

Попробуйте избавиться от yield и присваивать через переменные все промежуточные значения.

Самый простой способ проверить: две проверки подряд без цикла с промежуточными переменными и сразу после каждой - var_dump всех переменных.
Коды ответа удалённого сервера - желательно тоже получить.

На крайний случай - сниффер и анализ пакетов: возможно на удалённом сервере установлен лимит на параллельные подключения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы