Самый быстрый способ запуска скрипта на странице из PHP с использованием cURL, не ждите ответа

1

Сейчас я использую cURL и что-то вроде этого:

foreach ($urls as $url) {

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url ); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_exec($ch);

}

для запуска сценария php на удаленном сервере.

Мое дело в том, что я просто хочу запустить этот скрипт, и мне все равно, что он возвращает, и я хочу вызвать другой адрес, который находится в моем цикле.

Итак, как я могу устранить ожидание ответа и просто запустить скрипты на серверах (у меня есть около 200 URL-адресов в моем массиве, в котором мне нужно прокручивать и запускать каждый из этих URL-адресов).

Поэтому, в основном, я хочу просто запустить сценарий и перейти к следующему, и все равно, что он возвращает.

И еще одна моя проблема заключается в том, что если я могу переместить curl_init() вне цикла, вот так:

$ch = curl_init(); 

foreach ($urls as $url) {

    curl_setopt($ch, CURLOPT_URL, $url ); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_exec($ch);

}

Если есть более быстрый способ достижения этого без использования cURL, пожалуйста, дайте мне знать. Мне просто нужно запустить 100 скриптов на удаленных серверах из одного цикла внутри одного файла.

  • 0
    Используйте библиотеку сокетов в php для подключения 80, затем отправьте запрос http get, затем отключите, не ожидая ответа
  • 0
    Возможный дубликат поиска заголовка только в php через curl
Показать ещё 4 комментария
Теги:
curl

3 ответа

3
<?php
$fp = fsockopen("mesela.dom", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: mesela.dom\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    fclose($fp);
}
?>
  • 0
    Спасибо, вы можете редактировать этот код, используя мой цикл? например, foreach ($urls as $url) { } ? Это быстрее, чем cURL? Смогу ли я достичь 100 URL за 10 секунд, используя эту функцию? Нужно ли вообще условие? это может быть как-то урезано, чтобы быстрее выполнить?
  • 0
    Технически да, но на практике ... Вы должны попробовать ... но это также зависит от скорости интернета и характеристик вашего сервера
Показать ещё 6 комментариев
0

завиток

<?php
    function setcurloptions( $handle=false, $url=false, $cacert=false ){
        if( $handle && $url ){
            if( parse_url( $url, PHP_URL_SCHEME )=='https' ){
                curl_setopt( $handle, CURLOPT_SSL_VERIFYPEER, FALSE );
                curl_setopt( $handle, CURLOPT_SSL_VERIFYHOST, 2 );
                curl_setopt( $handle, CURLOPT_CAINFO, realpath( $cacert ) );
            }
            curl_setopt( $handle, CURLOPT_URL, $url );
            curl_setopt( $handle, CURLOPT_HEADER, false );
            curl_setopt( $handle, CURLOPT_FRESH_CONNECT, true );
            curl_setopt( $handle, CURLOPT_FORBID_REUSE, true );
            curl_setopt( $handle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );
            curl_setopt( $handle, CURLOPT_CLOSEPOLICY, CURLCLOSEPOLICY_OLDEST );
            curl_setopt( $handle, CURLOPT_BINARYTRANSFER, true );
            curl_setopt( $handle, CURLOPT_AUTOREFERER, true );
            curl_setopt( $handle, CURLOPT_CONNECTTIMEOUT, 30 );
            curl_setopt( $handle, CURLOPT_RETURNTRANSFER, true );
            curl_setopt( $handle, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] );
        }
    }


    $cacert='c:/wwwroot/cacert.pem';
    $urls=array(
        'http://www.example.com',
        'http://www.example.com',
        'http://www.example.com'
    );

    $multi = curl_multi_init();
    $handles = array();


    foreach( $urls as $i => $url ){
        $handle = curl_init();
        setcurloptions( $handle, $url, $cacert );
        curl_multi_add_handle( $multi, $handle );
        $handles[]=$handle;
    }


    $active=null;
    do {
        $mrc = curl_multi_exec( $multi, $active );
        usleep(100);
    } while( $mrc == CURLM_CALL_MULTI_PERFORM );


    while( $active && $mrc == CURLM_OK ) {
        if( curl_multi_select( $multi ) != -1 ) {
            do {
                $mrc = curl_multi_exec( $multi, $active );
            } while( $mrc == CURLM_CALL_MULTI_PERFORM );
        }
        usleep( 100 );
    }


    foreach( $handles as $i => $handle ){
        /*
        if you want to do something at all with response 
        $response=curl_multi_getcontent( $handle );
        */
        curl_multi_remove_handle( $multi, $handle );
        curl_close( $handle );
        usleep(100);
    }



    curl_multi_close( $multi );
?>
  • 0
    Вау, спасибо. ;) отлично смотрится, сейчас попробую. Btw. насколько это быстрее, чем при использовании стандартного цикла php, как я делал до сих пор?
  • 0
    Могу я спросить, что такое $cacert ? Нужно ли это или это что-то из вашего конкретного сценария, и я могу игнорировать это?
Показать ещё 6 комментариев
0

Вы можете использовать систему очередей с кодом, добавляя эти URL-адреса, которые будут называться рабочими местами, и несколько сотрудников, выполняющих вызовы CURL.

Это сделает ваш код асинхронным (не дожидаясь ответа от вызова curl).

Хорошая библиотека PHP вы можете использовать https://github.com/chrisboulton/php-resque

  • 0
    Я говорю о 24-часовом безостановочном импорте актуальной информации. Очереди не вариант для меня. Это должно быть в реальном времени, извините; (Кстати, что такое Redis?
  • 0
    Redis является обработчиком очереди. Вы можете думать об этом как о базе данных (очень легко объяснимо).
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню