многопоточность в пхп

Тема в разделе "PHP", создана пользователем zaartix, 14 июл 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. zaartix

    zaartix Постоялец

    Регистр.:
    15 май 2006
    Сообщения:
    73
    Симпатии:
    27
    Господа, вот столкнулся с такой проблемой, пишу индексатор на пхп, в один поток индексировать - это довольно тормозно. Может кто уже сталкивался с подобными проблемами? как решали?

    модераторам:
    в правилах раздела указана эта тема в качестве примера, однако ответа на этот вопрос я так и не нашел :(
     
  2. bork1234

    bork1234 Постоялец

    Регистр.:
    25 июн 2008
    Сообщения:
    65
    Симпатии:
    13
    Основной php файл, который запускает другие на фоне:

    PHP:
    <? // index.php
    system('php -f thread1.php &');
    system('php -f thread2.php &');
    ?>
     
  3. pslava

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
  4. cds

    cds Постоялец

    Регистр.:
    28 янв 2007
    Сообщения:
    90
    Симпатии:
    8
    Там все на сокетах. Странно...

    PHP:
    <? // index.php 
    system('php -f thread1.php &'); 
    system('php -f thread2.php &'); 
    ?>
    ведь так намного элегантнее, тем более можно параметры передавать свои скрипту
     
  5. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Ну можно конечно и fork'аться все время, стартонуть сотню php-интерпретаторов параллельно, процессов апача еще туда же, и в них потом друг другу кидать сообщения через файлы. Но не думаю, что это можно назвать "элегантно".

    Вот правильный многопоточный спайдер:

    PHP:
    //Author: Esrun - http://www.onlinehoster.com

    $urls = array("http://www.google.com",
    "http://www.yahoo.com"
    "http://www.msn.com"
    "http://www.ask.com",
    "http://www.esrun.co.uk"
    "http://www.onlinehoster.com");

    $socketh curl_multi_init();

    foreach(
    $urls as $i => $url){
      
    $socket[$i] = curl_init($url);
      
    curl_setopt(
         
    $socket[$i], CURLOPT_RETURNTRANSFER1);
      
    curl_setopt(
         
    $socket[$i], CURLOPT_FOLLOWLOCATION1);
      
    curl_multi_add_handle($socketh$socket[$i]);
    }

    do { 
       
    $x curl_multi_exec($socketh$working); 
    } while (
    $working);

    foreach(
    $urls as $i => $url) {
      
    $data[] = curl_multi_getcontent($socket[$i]);
      
    curl_close($socket[$i]);
    }

    print_r($data);

    Да, он на сокетах :)
     
  6. cds

    cds Постоялец

    Регистр.:
    28 янв 2007
    Сообщения:
    90
    Симпатии:
    8
    А если не спайдер нужен, а, к примеру, по окончании работы скрипта статистику собрать? Как тогда отпочковать поток, чтобы текущий скрипт завершил работу и не заставлял больше юзера ждать?
     
  7. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Закрыто. В поиск.
     
Статус темы:
Закрыта.