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

Тема в разделе "Как сделать...", создана пользователем Inviseble_Demon, 30 апр 2009.

Статус темы:
Закрыта.
  1. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    Итак дела с многопоточностью у меня не очень - подумал может есть люди готовые за это взяться....!?

    Что нужно?
    Нужен скрипт разработанный на основе имеющегося скрипта для многопоточного распознания капчей через известного сервиса http://anti-captcha.com/

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

    Исходный код
    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($chCURLOPT_URL,             'http://www.anti-captcha.com/in.php');
        
    curl_setopt($chCURLOPT_RETURNTRANSFER,     1);
        
    curl_setopt($chCURLOPT_TIMEOUT,             60);
        
    curl_setopt($chCURLOPT_POST,                 1);
        
    curl_setopt($chCURLOPT_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;
        }
    }
    ?> 
     
  2. _king

    _king Постоялец

    Регистр.:
    25 июн 2008
    Сообщения:
    120
    Симпатии:
    3
    а что мешает запустить несколько копий скрипта??
    какой смысл этой затеи? многопоточность в пхп стремится к 0. В скорости выиграша не будет.
     
  3. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    Как по вашему запуститть несколько копий из по PHP ? Один хрен пока не ответит первый ко второму не обратиться..

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

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

    -
    Если 1 из капчей будут распозновать очень долго то это затянет весь процес так как пока все потоки не ответят данные не вернуться!
     
  4. _king

    _king Постоялец

    Регистр.:
    25 июн 2008
    Сообщения:
    120
    Симпатии:
    3
    из пхп - никак)) кроном.

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

    http://blog.gtalex.ru/mnogopotochnost-v-php
    http://www.stableversion.com/node/3
     
  5. OneWinged

    OneWinged Постоялец

    Регистр.:
    7 ноя 2007
    Сообщения:
    127
    Симпатии:
    54
    очень просто, в curl уже есть многопоточность, скопость подымается сильно.
    смотри
    http://us2.php.net/curl_multi_init
    например два потока:

    PHP:
    // set URL and other appropriate options
    curl_setopt($ch1CURLOPT_URL"http://www.example.com/");
    curl_setopt($ch1CURLOPT_HEADER0);
    curl_setopt($ch2CURLOPT_URL"http://www.php.net/");
    curl_setopt($ch2CURLOPT_HEADER0);

    //create the multiple cURL handle
    $mh curl_multi_init();

    //add the two handles
    curl_multi_add_handle($mh,$ch1);
    curl_multi_add_handle($mh,$ch2);

    $running=null;
    //execute the handles
    do {
        
    curl_multi_exec($mh,$running);
    } while (
    $running 0);
    //close the handles
    curl_multi_remove_handle($mh$ch1);
    curl_multi_remove_handle($mh$ch2);
    curl_multi_close($mh);
     
  6. Inviseble_Demon

    Inviseble_Demon

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

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

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

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
  8. zetar

    zetar

    Регистр.:
    18 май 2007
    Сообщения:
    497
    Симпатии:
    348
    можно эмулировать логику fork
    http://ru.wikipedia.org/wiki/Fork
    могу сделать пример
     
  9. Inviseble_Demon

    Inviseble_Demon

    Регистр.:
    11 дек 2008
    Сообщения:
    482
    Симпатии:
    351
    admLoki Ещё раз спасибо!
    Класная и обнодеживающая статья. Буду жувать...

    zetar Ваш метод слишком убийственен ! И к примеру на простом хостинге вам точно ни кто не даст процес дочерний открыть !
     
  10. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Кто на обычном хостинге будет ставить сервис, в котором будет нужна антикапча? Ы?
     
Статус темы:
Закрыта.