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

Reply via email to