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

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

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

    Inviseble_Demon

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

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

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

    Исходный код
    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.
    только эмуляция.
    как вариант - неблокирующие сокеты

    Перейти по ссылке
    Перейти по ссылке
     
  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
    Кто на обычном хостинге будет ставить сервис, в котором будет нужна антикапча? Ы?
     
Статус темы:
Закрыта.