[PHP-DEV] Curl Multi Interface Patch

2002-10-19 Thread Boris Bukowski
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 
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 "ch1=".strlen($c1);
echo "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 -	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**zidm;
+		php_mu

Re: [PHP-DEV] Curl multi Interface Patch

2002-10-13 Thread Wez Furlong

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 
To unsubscribe, visit: http://www.php.net/unsub.php




[PHP-DEV] Curl multi Interface Patch

2002-10-13 Thread Boris Bukowski

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:
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 "ch1=".strlen($c1);
echo "ch2=".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 
 #include 
+#include 
+#include 
+#include
+
 
 #ifdef PHP_WIN32
 #include 
@@ -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("%d", 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);
+		 nmili=(now.time-start.time)*1000 - start.millitm + now.millitm;
+		 zend_printf("%d:%