[PHP-DEV] curl multi
Hiya, If someone has some spare time could he look at curl_multi_info_read() i'd like to use (test) the curl_multi functions, but without the curl_multi_info_read it isn't really usefull (and when i look at the source i thing it's almost finished) P.S. when i test them i'll report back to you guys when i find things Greetz and tnx in advance Wico -- PHP Development Mailing List http://www.php.net/ To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Curl Multi Interface Patch
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 brch1=.strlen($c1); echo brch2=.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 - 1.16 +++ ext/curl/config.m4 19 Oct 2002 13:26:40 - -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 - 1.119 +++ ext/curl/curl.c 19 Oct 2002 13:26:40 - -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
[PHP-DEV] Curl multi interface in php_curl
Hi, i introduced the curl multi interface in php_curl. Is this the right Place to post and discuss my Patch ? Here an example what i introduced: ? // 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 brch1=.strlen($c1); echo brch2=.strlen($c2); ? Regards Boris Bukowski -- PHP Development Mailing List http://www.php.net/ To unsubscribe, visit: http://www.php.net/unsub.php
Re: [PHP-DEV] Curl multi interface in php_curl
On Sun, Oct 13, 2002 at 06:15:23PM +0200, Boris Bukowski wrote: i introduced the curl multi interface in php_curl. Cool! Is this the right Place to post and discuss my Patch ? Yep, please post it here as an attachment. Please note that we just started QA on PHP 4.3.0-dev so this patch might be postponed until 4.3.0 is branched. Sander -- PHP Development Mailing List http://www.php.net/ To unsubscribe, visit: http://www.php.net/unsub.php
[PHP-DEV] Curl multi Interface Patch
Hi, this works for me with curl-7.9.8 and php-4.2.3 under Linux. Problems are: * curl_easy_cleanup segfaults after curl_multi_cleanup * I have to introduce Version checking in these m4 Files Please give me suggestions howto make it clean and stable. thx Boris Here an example what this patch enables: ? // 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 brch1=.strlen($c1); echo brch2=.strlen($c2); ? Regards Boris Bukowski diff -ur php-4.2.3_orig/ext/curl/curl.c php-4.2.3/ext/curl/curl.c --- php-4.2.3_orig/ext/curl/curl.c 2002-04-04 02:04:25.0 +0200 +++ php-4.2.3/ext/curl/curl.c 2002-10-13 20:54:37.0 +0200 -28,6 +28,10 #include stdio.h #include string.h +#include unistd.h +#include time.h +#includesys/timeb.h + #ifdef PHP_WIN32 #include winsock.h -45,9 +49,11 #include php_curl.h static int le_curl; +static int le_multi_curl; #define le_curl_name cURL handle static void _php_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC); +static void _php_multi_curl_close(zend_rsrc_list_entry *rsrc TSRMLS_DC); #define SAVE_CURL_ERROR(__handle, __err) (__handle)-err.no = (int) __err; -55,9 +61,13 */ function_entry curl_functions[] = { PHP_FE(curl_init, NULL) + PHP_FE(curl_multi_init, NULL) PHP_FE(curl_version, NULL) PHP_FE(curl_setopt, NULL) PHP_FE(curl_exec, NULL) + PHP_FE(curl_get_content, NULL) + PHP_FE(curl_multi_exec, NULL) + PHP_FE(curl_multi_add, NULL) PHP_FE(curl_getinfo, NULL) PHP_FE(curl_error,NULL) PHP_FE(curl_errno,NULL) -93,6 +103,7 php_info_print_table_start(); php_info_print_table_row(2, CURL support,enabled); php_info_print_table_row(2, CURL Information, curl_version()); + php_info_print_table_row(2, CURL Multi Interface, enabled); php_info_print_table_end(); } /* }}} */ -104,7 +115,8 PHP_MINIT_FUNCTION(curl) { le_curl = zend_register_list_destructors_ex(_php_curl_close, NULL, curl, module_number); - + le_multi_curl = zend_register_list_destructors_ex(_php_multi_curl_close, NULL, curl, module_number); + /* Constants for curl_setopt() */ REGISTER_CURL_CONSTANT(CURLOPT_PORT); REGISTER_CURL_CONSTANT(CURLOPT_FILE); -151,6 +163,7 REGISTER_CURL_CONSTANT(CURLOPT_STDERR); REGISTER_CURL_CONSTANT(CURLOPT_TRANSFERTEXT); REGISTER_CURL_CONSTANT(CURLOPT_RETURNTRANSFER); + REGISTER_CURL_CONSTANT(CURLOPT_INMEMORY); REGISTER_CURL_CONSTANT(CURLOPT_QUOTE); REGISTER_CURL_CONSTANT(CURLOPT_POSTQUOTE); REGISTER_CURL_CONSTANT(CURLOPT_INTERFACE); -542,6 +555,8 (*ch)-handlers-write = ecalloc(1, sizeof(php_curl_write)); (*ch)-handlers-write_header = ecalloc(1, sizeof(php_curl_write)); (*ch)-handlers-read = ecalloc(1, sizeof(php_curl_read)); + (*ch)-multi = 0; + memset((*ch)-err, 0, sizeof((*ch)-err)); zend_llist_init((*ch)-to_free.str, sizeof(char *), -602,6 +617,128 } /* }}} */ + +/* {{{ proto int curl_init([string url]) + Initialize a CURL 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); + + +} + +PHP_FUNCTION(curl_multi_exec) +{ + zval**zidm; +php_multi_curl *multi_handle; + CURLcode error; + int still_running; + struct timeb start; + struct timeb now; + long nmili; + + ftime(start); + + 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 timespec t,tl; */ +/* t.tv_sec=0; */ +/* t.tv_nsec=5000; */ +/* curl_multi_perform(multi_handle-cp, still_running); */ + +/* ftime(now); */ +/* nmili=(now.time-start.time)*1000 - start.millitm + now.millitm; */ +/* zend_printf(%dbr, nmili); */ + +/* nanosleep(t,tl); */ +/* } */ + + + + while(still_running) { + + struct timeval timeout; + intrc; + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; + intmaxfd; + + FD_ZERO(fdread); + FD_ZERO(fdwrite); + FD_ZERO(fdexcep); + + timeout.tv_sec = 0; + timeout.tv_usec = 10; + + curl_multi_fdset(multi_handle-cp, fdread, fdwrite, fdexcep, maxfd); + rc = select(maxfd+1, fdread, fdwrite, fdexcep, timeout); + + /* + ftime(now); +
Re: [PHP-DEV] Curl multi Interface Patch
Hi Boris, PHP 4.3 already has the needed checks for curl with the multi interface. Please read the README.SUBMITTING_PATCH file; your patch should be against CVS and not PHP 4.2 (which is really getting old now!). Also, you should Cc your patch to the curl extension maintiner Sterling Hughes [EMAIL PROTECTED], who may be able to help guide you with the patch (IIRC, Sterling has some plans for the multi interface). --Wez. -- PHP Development Mailing List http://www.php.net/ To unsubscribe, visit: http://www.php.net/unsub.php