On Sat, 2002-10-19 at 15:42, Boris Bukowski wrote:
> Hi,
> 
> now I made a Patch that is hopefully ok for you ;^)
> 
> I introduced the following functions:
> 
> curl_multi_init();
> curl_multi_add ($multi,$ch1);
> curl_multi_add ($multi,$ch2);
> curl_multi_exec($multi);
> curl_get_content($ch1);
> 


Why would this patch be useful, your implementation of curl_multi_exec()
kinda defeats the whole purpose, doesn't it?

-Sterling

> thx, 
> 
> Boris 
> ----
> 

> <?
> // creates a multi session
> $multi = curl_multi_init();
> 
> // start of a normal easy session
> $ch1 = curl_init("http://192.168.4.2/";);
> $ch2 = curl_init("http://192.168.4.2/";);
> 
> curl_setopt($ch1,CURLOPT_RETURNTRANSFER,1);
> curl_setopt($ch2,CURLOPT_RETURNTRANSFER,1);
> 
> // adding the easy handles to the multi hndle
> curl_multi_add ($multi,$ch1);
> curl_multi_add ($multi,$ch2);
> 
> // executing all
> curl_multi_exec($multi);
> 
> // getting content
> $c1=curl_get_content($ch1);
> $c2=curl_get_content($ch2);
> 
> curl_close($ch1);
> curl_close($ch2);
> 
> echo "<br>ch1=".strlen($c1);
> echo "<br>ch2=".strlen($c2);
> ?>
> ----
> 

> Index: ext/curl/config.m4
> ===================================================================
> RCS file: /repository/php4/ext/curl/config.m4,v
> retrieving revision 1.16
> diff -u -r1.16 config.m4
> --- ext/curl/config.m4        4 Sep 2002 18:47:22 -0000       1.16
> +++ ext/curl/config.m4        19 Oct 2002 13:26:40 -0000
> @@ -9,6 +9,10 @@
>  PHP_ARG_WITH(curlwrappers, if we should use CURL for url streams,
>  [  --with-curlwrappers     Use CURL for url streams], no, no)
>  
> +dnl Temporary option while we develop this aspect of the extension
> +PHP_ARG_WITH(curl-multi, if we should use CURL for url streams,
> +[  --with-curl-multi     Use CURL Multi Interface], no, no)
> +
>  if test "$PHP_CURL" != "no"; then
>    if test -r $PHP_CURL/include/curl/easy.h; then
>      CURL_DIR=$PHP_CURL
> @@ -63,6 +67,10 @@
>  
>    if test "$PHP_CURLWRAPPERS" != "no" ; then
>       AC_DEFINE(PHP_CURL_URL_WRAPPERS,1,[ ])
> +  fi
> +
> +  if test "$PHP_CURL_MULTI" != "no" ; then
> +     AC_DEFINE(PHP_CURL_MULTI,1,[ ])
>    fi
>  
>    PHP_NEW_EXTENSION(curl, curl.c curlstreams.c, $ext_shared)
> Index: ext/curl/curl.c
> ===================================================================
> RCS file: /repository/php4/ext/curl/curl.c,v
> retrieving revision 1.119
> diff -u -r1.119 curl.c
> --- ext/curl/curl.c   2 Oct 2002 16:44:48 -0000       1.119
> +++ ext/curl/curl.c   19 Oct 2002 13:26:40 -0000
> @@ -47,6 +47,11 @@
>  static int  le_curl;
>  #define le_curl_name "cURL handle"
>  
> +#ifdef PHP_CURL_MULTI
> +static int  le_multi_curl;
> +static void _php_multi_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC);
> +#endif
> +
>  static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC);
>  
>  #define SAVE_CURL_ERROR(__handle, __err) (__handle)->err.no = (int) __err;
> @@ -62,6 +67,12 @@
>       PHP_FE(curl_error,    NULL)
>       PHP_FE(curl_errno,    NULL)
>       PHP_FE(curl_close,    NULL)
> +#ifdef PHP_CURL_MULTI
> +     PHP_FE(curl_multi_init,  NULL)
> +     PHP_FE(curl_multi_exec,  NULL)
> +     PHP_FE(curl_multi_add,   NULL)
> +     PHP_FE(curl_get_content, NULL)
> +#endif
>       {NULL, NULL, NULL}
>  };
>  /* }}} */
> @@ -104,7 +115,11 @@
>  PHP_MINIT_FUNCTION(curl)
>  {
>       le_curl = zend_register_list_destructors_ex(_php_curl_close, NULL, "curl", 
>module_number);
> -     
> +
> +#ifdef PHP_CURL_MULTI
> +     le_multi_curl = zend_register_list_destructors_ex(_php_multi_curl_close, NULL, 
>"multi_curl", module_number);
> +#endif
> +
>       /* Constants for curl_setopt() */
>       REGISTER_CURL_CONSTANT(CURLOPT_DNS_USE_GLOBAL_CACHE);
>       REGISTER_CURL_CONSTANT(CURLOPT_DNS_CACHE_TIMEOUT);
> @@ -931,7 +946,7 @@
>       if (ch->handlers->write->method == PHP_CURL_RETURN && 
>ch->handlers->write->buf.len > 0) {
>               if (ch->handlers->write->type != PHP_CURL_BINARY) 
>                       smart_str_0(&ch->handlers->write->buf);
> -             RETURN_STRINGL(ch->handlers->write->buf.c, 
>ch->handlers->write->buf.len, 0);
> +             RETURN_STRINGL(ch->handlers->write->buf.c, 
>ch->handlers->write->buf.len, 1);
>       }
>  
>       RETURN_TRUE;
> @@ -1117,6 +1132,138 @@
>       efree(ch);
>  }    
>  /* }}} */
> +
> +
> +#ifdef PHP_CURL_MULTI
> +
> +/* {{{ proto void curl_multi_init(int ch)
> +   Initialize a CURL-Multi session */
> +PHP_FUNCTION(curl_multi_init)
> +{
> +        php_multi_curl    *multi_handle;
> +        multi_handle=emalloc(sizeof(php_multi_curl));
> +        multi_handle->cp = curl_multi_init();
> +        ZEND_REGISTER_RESOURCE(return_value, multi_handle, le_multi_curl);
> +        multi_handle->id = Z_LVAL_P(return_value);
> +
> +
> +}
> +
> +/* {{{ proto void curl_multi_add(int ch, int ch)
> +   Add a CURL Session to a CURL Multi session */
> +PHP_FUNCTION(curl_multi_add)
> +{
> +        zval            **zidm;
> +        zval            **zidc;
> +        php_curl         *ch;
> +    php_multi_curl   *multi_handle;
> +        CURLcode          error;
> +
> +        if (ZEND_NUM_ARGS() != 2 ||
> +            zend_get_parameters_ex(2, &zidm, &zidc) == FAILURE
> +) {
> +                WRONG_PARAM_COUNT;
> +        }
> +
> +        ZEND_FETCH_RESOURCE(multi_handle, php_multi_curl *, zidm, -1, le_curl_name, 
>le_multi_curl);
> +        ZEND_FETCH_RESOURCE(ch, php_curl *, zidc, -1, le_curl_name, le_curl);
> +
> +        error = curl_multi_add_handle(multi_handle->cp, ch->cp);
> +        SAVE_CURL_ERROR(ch, error);
> +        if (error != CURLE_OK) {
> +                RETURN_FALSE;
> +        }
> +
> +        RETURN_TRUE;
> +}
> +/* }}} */
> +
> +/* {{{ proto void curl_multi_exec(int ch)
> +   Perform a Multi-CURL session */
> +PHP_FUNCTION(curl_multi_exec)
> +{
> +        zval            **zidm;
> +             php_multi_curl   *multi_handle;
> +        CURLcode          error;
> +        int               still_running;
> +        long           nmili;
> +
> +        if ( ZEND_NUM_ARGS() != 1  ||    zend_get_parameters_ex(1, &zidm) == 
>FAILURE) {
> +                WRONG_PARAM_COUNT;
> +        }
> +        ZEND_FETCH_RESOURCE(multi_handle, php_multi_curl *, zidm, -1, le_curl_name, 
>le_multi_curl);
> +
> +
> +        while(still_running) {
> +
> +                struct timeval timeout;
> +                int            rc;
> +                fd_set         fdread;
> +                fd_set         fdwrite;
> +                fd_set         fdexcep;
> +                int            maxfd;
> +
> +                FD_ZERO(&fdread);
> +                FD_ZERO(&fdwrite);
> +                FD_ZERO(&fdexcep);
> +
> +                timeout.tv_sec = 0;
> +                timeout.tv_usec = 10000;
> +
> +                curl_multi_fdset(multi_handle->cp, &fdread, &fdwrite, &fdexcep, 
>&maxfd);
> +                rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
> +
> +                switch(rc) {
> +                case -1:
> +                        break;
> +                case 0:
> +                default:
> +                        curl_multi_perform(multi_handle->cp, &still_running);
> +                }
> +
> +        }
> +        curl_multi_cleanup(multi_handle->cp);
> +             zend_list_delete(Z_LVAL_PP(zidm));
> +}
> +/* }}} */
> +
> +
> +/* {{{ proto void curl_get_content(int ch)
> +   Returns the Content if RETURNTRANSFER is set */
> +PHP_FUNCTION(curl_get_content)
> +{
> +        zval      **zid;
> +        php_curl   *ch;
> +        CURLcode    error;
> +
> +        if (ZEND_NUM_ARGS() != 1 ||
> +            zend_get_parameters_ex(1, &zid) == FAILURE) {
> +                WRONG_PARAM_COUNT;
> +        }
> +        ZEND_FETCH_RESOURCE(ch, php_curl *, zid, -1, le_curl_name, le_curl);
> +
> +
> +        if (ch->handlers->write->method == PHP_CURL_RETURN && 
>ch->handlers->write->buf.len > 0) {
> +                if (ch->handlers->write->type != PHP_CURL_BINARY)
> +                        smart_str_0(&ch->handlers->write->buf);
> +                RETURN_STRINGL(ch->handlers->write->buf.c, 
>ch->handlers->write->buf.len, 0);
> +        }
> +
> +        RETURN_FALSE;
> +}
> +/* }}} */
> +
> +/* {{{ _php_multi_curl_close()
> +   Destructor for mult-curl handles */
> +static void _php_multi_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC)
> +{
> +        php_multi_curl *multi_handle = (php_multi_curl *) rsrc->ptr;
> +        efree(multi_handle);
> +}
> +/* }}} */
> +
> +#endif
> +
>  
>  #endif
>  
> Index: ext/curl/php_curl.h
> ===================================================================
> RCS file: /repository/php4/ext/curl/php_curl.h,v
> retrieving revision 1.28
> diff -u -r1.28 php_curl.h
> --- ext/curl/php_curl.h       12 Aug 2002 15:56:13 -0000      1.28
> +++ ext/curl/php_curl.h       19 Oct 2002 13:26:40 -0000
> @@ -53,6 +53,13 @@
>  PHP_FUNCTION(curl_errno);
>  PHP_FUNCTION(curl_close);
>  
> +#ifdef PHP_CURL_MULTI
> +PHP_FUNCTION(curl_multi_init);
> +PHP_FUNCTION(curl_multi_exec);
> +PHP_FUNCTION(curl_multi_add);
> +PHP_FUNCTION(curl_get_content);
> +#endif
> +
>  typedef struct {
>       zval         *func;
>       FILE         *fp;
> @@ -93,6 +100,15 @@
>       struct _php_curl_free    to_free;
>       long                     id;
>  } php_curl;
> +
> +#ifdef PHP_CURL_MULTI
> +typedef struct {
> +        CURLM                   *cp;
> +        struct _php_curl_error   err;
> +        long                     id;
> +} php_multi_curl;
> +#endif
> +
>  
>  /* streams support */
>  


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to