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