使用cURL从PHP触发页面脚本的最快方法,不要等待响应

时间:2015-12-09 09:12:53

标签: php curl

现在我正在使用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个脚本。

3 个答案:

答案 0 :(得分: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);
}
?>

答案 1 :(得分:0)

您可以使用一个队列系统,将您的代码添加到这些URL,将其作为作业和多个工作人员进行CURL调用。

这将使您的代码异步(不等待curl调用的响应)。

您可以使用的优秀PHP库 https://github.com/chrisboulton/php-resque

答案 2 :(得分:0)

curl multi

<?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 );
?>