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