Многопоточная работа с AC

Статус
В этой теме нельзя размещать новые ответы.

Inviseble_Demon

Мой дом здесь!
Регистрация
11 Дек 2008
Сообщения
478
Реакции
377
Итак дела с многопоточностью у меня не очень - подумал может есть люди готовые за это взяться....!?

Что нужно?
Нужен скрипт разработанный на основе имеющегося скрипта для многопоточного распознания капчей через известного сервиса Для просмотра ссылки Войди или Зарегистрируйся

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

Исходный код
PHP:
<?php
/*
$filename - полный путь к файлу
$apikey   - ключ для работы
$rtimeout - задержка между опросами статуса капчи
$mtimeout - время ожидания ввода капчи

включить/выключить verbose mode (комментирование происходящего):
$is_verbose - false(выключить),  true(включить)

дополнительно (дефолтные параметры править не нужно без необходимости):
$is_phrase - 0 либо 1 - флаг "в капче 2 и более слов"
$is_regsense - 0 либо 1 - флаг "регистр букв в капче имеет значение"
$is_numeric -  0 либо 1 - флаг "капча состоит только из цифр"
$min_len    -  0 (без ограничений), любая другая цифра указывает минимальную длину текста капчи
$max_len    -  0 (без ограничений), любая другая цифра указывает максимальную длину текста капчи

пример:
$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",true);

$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",false);  //отключено комментирование

$text=recognize("/path/to/file/captcha.jpg","ваш_ключ_из_админки",false,1,0,0,5);  //отключено комментирование, капча состоит из двух слов, общая минимальная длина равна 5 символам

*/



function recognize($filename, $apikey, $is_verbose = true, $rtimeout = 5, $mtimeout = 120, $is_phrase = 0, $is_regsense = 0, $is_numeric = 0, $min_len = 0, $max_len = 0)
{
	if (!file_exists($filename))
	{
		if ($is_verbose) echo "file $filename not found\n";
		return false;
	}
    $postdata = array(
        'method'    => 'post', 
        'key'       => $apikey, 
        'file'      => '@'.$filename, //полный путь к файлу
        'phrase'	=> $is_phrase,
        'regsense'	=> $is_regsense,
        'numeric'	=> $is_numeric,
        'min_len'	=> $min_len,
        'max_len'	=> $max_len,
        
    );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,             'http://www.anti-captcha.com/in.php');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,     1);
    curl_setopt($ch, CURLOPT_TIMEOUT,             60);
    curl_setopt($ch, CURLOPT_POST,                 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS,         $postdata);
    $result = curl_exec($ch);
    if (curl_errno($ch)) 
    {
    	if ($is_verbose) echo "CURL returned error: ".curl_error($ch)."\n";
        return false;
    }
    curl_close($ch);
    if (strpos($result, "ERROR")!==false)
    {
    	if ($is_verbose) echo "server returned error: $result\n";
        return false;
    }
    else
    {
        $ex = explode("|", $result);
        $captcha_id = $ex[1];
    	if ($is_verbose) echo "captcha sent, got captcha ID $captcha_id\n";
        $waittime = 0;
        if ($is_verbose) echo "waiting for $rtimeout seconds\n";
        sleep($rtimeout);
        while(true)
        {
            $result = file_get_contents('http://anti-captcha.com/res.php?key='.$apikey.'&action=get&id='.$captcha_id);
            if (strpos($result, 'ERROR')!==false)
            {
            	if ($is_verbose) echo "server returned error: $result\n";
                return false;
            }
            if ($result=="CAPCHA_NOT_READY")
            {
            	if ($is_verbose) echo "captcha is not ready yet\n";
            	$waittime += $rtimeout;
            	if ($waittime>$mtimeout) 
            	{
            		if ($is_verbose) echo "timelimit ($mtimeout) hit\n";
            		break;
            	}
        		if ($is_verbose) echo "waiting for $rtimeout seconds\n";
            	sleep($rtimeout);
            }
            else
            {
            	$ex = explode('|', $result);
            	if (trim($ex[0])=='OK') return trim($ex[1]);
            }
        }
        
        return false;
    }
}
?>
 
а что мешает запустить несколько копий скрипта??
какой смысл этой затеи? многопоточность в пхп стремится к 0. В скорости выиграша не будет.
 
а что мешает запустить несколько копий скрипта??
какой смысл этой затеи? многопоточность в пхп стремится к 0. В скорости выиграша не будет.

Как по вашему запуститть несколько копий из по PHP ? Один хрен пока не ответит первый ко второму не обратиться..

На счет скорости вы это зря! Она возрастет.

+
10 капчей одновременно (почти)) ) отправятся AC и общее распознание займет менее минуты

-
Если 1 из капчей будут распозновать очень долго то это затянет весь процес так как пока все потоки не ответят данные не вернуться!
 
Как по вашему запуститть несколько копий из по PHP ? Один хрен пока не ответит первый ко второму не обратиться..
из пхп - никак)) кроном.

На счет скорости вы это зря! Она возрастет.
да, возрастает если есть многопоточность. Но нету оной в php.
только эмуляция.
как вариант - неблокирующие сокеты
 
очень просто, в curl уже есть многопоточность, скопость подымается сильно.
смотри

например два потока:
 
_king Я прекрасно знаю что её не существует ! И что это только жалкая эмуляция - но всеже вы е правы... Я тоже не люблю этот гемор с псевдопоточностью в PHP (по этому и не лез в неё !) на неблокируемых сокетах работал (чекер проксей многопоточны (проц жрал как с перепугу на 100 потоках)) но всеже отправка на AC черех эти убогие потоки всеже поднимет скорость! пусть и будет все тормазить в случии подвисания 1 из потоков но всеже это бы и так преостоновило работу при 1 поточной работе.

Кароче не знаю к чему я тут все вел )) но итог в том что я вас и поддерживаю и не поддерживаю:D

ИМХО: В PHP многопоточность как таковая не существует но редкое использование жалкого уподобления спасает не 1 десяток минут !
 
можно эмулировать логику fork

могу сделать пример
 
admLoki Ещё раз спасибо!
Класная и обнодеживающая статья. Буду жувать...

zetar Ваш метод слишком убийственен ! И к примеру на простом хостинге вам точно ни кто не даст процес дочерний открыть !
 
Кто на обычном хостинге будет ставить сервис, в котором будет нужна антикапча? Ы?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху