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