#include "php_http_request_method_api.h"
#ifdef HTTP_HAVE_CURL
# include "php_http_request_api.h"
+# include "php_http_request_pool_api.h"
# include "php_http_request_datashare_api.h"
# ifdef HTTP_HAVE_PERSISTENT_HANDLES
# include "php_http_persistent_handle_api.h"
#ifdef HTTP_HAVE_CURL
# ifdef HTTP_HAVE_PERSISTENT_HANDLES
(SUCCESS != PHP_MINIT_CALL(http_persistent_handle)) ||
+ (SUCCESS != PHP_MINIT_CALL(http_request_pool)) ||
# endif
(SUCCESS != PHP_MINIT_CALL(http_request)) ||
# ifdef ZEND_ENGINE_2
#include "php_http_request_datashare_api.h"
#include "php_http_request_api.h"
#include "php_http_request_object.h"
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+# include "php_http_persistent_handle_api.h"
+#endif
#ifndef HAVE_CURL_SHARE_STRERROR
# define curl_share_strerror(dummy) "unknown error"
# define curl_easy_strerror(dummy) "unknown error"
#endif
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+# define HTTP_CURL_SHARE_CTOR(ch) (SUCCESS == http_persistent_handle_acquire("http_request_datashare", &(ch)))
+# define HTTP_CURL_SHARE_DTOR(chp) http_persistent_handle_release("http_request_datashare", (chp))
+#else
+# define HTTP_CURL_SHARE_CTOR(ch) ((ch) = curl_share_init())
+# define HTTP_CURL_SHARE_DTOR(chp) curl_share_cleanup(*(chp)); *(chp) = NULL
+#endif
+
static HashTable http_request_datashare_options;
static http_request_datashare http_request_datashare_global;
static int http_request_datashare_compare_handles(void *h1, void *h2);
{
curl_lock_data val;
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+ if (SUCCESS != http_persistent_handle_provide("http_request_datashare", curl_share_init, (http_persistent_handle_dtor) curl_share_cleanup)) {
+ return FAILURE;
+ }
+#endif
+
+ if (!http_request_datashare_init_ex(&http_request_datashare_global, 1)) {
+ return FAILURE;
+ }
+
zend_hash_init(&http_request_datashare_options, 4, NULL, NULL, 1);
#define ADD_DATASHARE_OPT(name, opt) \
val = opt; \
ADD_DATASHARE_OPT("ssl", CURL_LOCK_DATA_SSL_SESSION);
ADD_DATASHARE_OPT("connect", CURL_LOCK_DATA_CONNECT);
- http_request_datashare_init_ex(&http_request_datashare_global, 1);
-
return SUCCESS;
}
}
memset(share, 0, sizeof(http_request_datashare));
- HTTP_CHECK_CURL_INIT(share->ch, curl_share_init(), ;);
- if (!share->ch) {
+ if (!HTTP_CURL_SHARE_CTOR(share->ch)) {
if (free_share) {
pefree(share, persistent);
}
zend_llist_destroy(share->handles);
efree(share->handles);
}
- curl_share_cleanup(share->ch);
+ HTTP_CURL_SHARE_DTOR(&share->ch);
#ifdef ZTS
if (share->persistent) {
int i;
#include "php_http_request_object.h"
#include "php_http_request_pool_api.h"
#include "php_http_requestpool_object.h"
+#include "php_http_persistent_handle_api.h"
#ifndef HTTP_DEBUG_REQPOOLS
# define HTTP_DEBUG_REQPOOLS 0
# define curl_multi_strerror(dummy) "unknown error"
#endif
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+# define HTTP_CURL_MULTI_CTOR(ch) (SUCCESS == http_persistent_handle_acquire("http_request_pool", &(ch)))
+# define HTTP_CURL_MULTI_DTOR(chp) http_persistent_handle_release("http_request_pool", (chp))
+#else
+# define HTTP_CURL_MULTI_CTOR(ch) ((ch) = curl_multi_init())
+# define HTTP_CURL_MULTI_DTOR(chp) curl_multi_cleanup(*(chp)); *(chp) = NULL
+#endif
+
static int http_request_pool_compare_handles(void *h1, void *h2);
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+PHP_MINIT_FUNCTION(http_request_pool)
+{
+ if (SUCCESS != http_persistent_handle_provide("http_request_pool", curl_multi_init, (http_persistent_handle_dtor) curl_multi_cleanup)) {
+ return FAILURE;
+ }
+ return SUCCESS;
+}
+#endif
+
/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */
PHP_HTTP_API http_request_pool *_http_request_pool_init(http_request_pool *pool TSRMLS_DC)
{
pool->ch = NULL;
}
- HTTP_CHECK_CURL_INIT(pool->ch, curl_multi_init(), ;);
- if (!pool->ch) {
+ if (!HTTP_CURL_MULTI_CTOR(pool->ch)) {
if (free_pool) {
efree(pool);
}
pool->unfinished = 0;
zend_llist_clean(&pool->finished);
zend_llist_clean(&pool->handles);
- curl_multi_cleanup(pool->ch);
+ HTTP_CURL_MULTI_DTOR(&pool->ch);
}
/* }}} */
<license>BSD, revised</license>
<notes><![CDATA[
+ Added HttpMessage::fromEnv(int type[, string class_name = "HttpMessage"]) (Clay Loveless)
-+ Added --enable-http-persistent-handles (Clay Loveless)
++ Added --enable-http-persistent-handles (per-process persistent cURL handles) (Clay Loveless)
++ Added http_persistent_handles_count(), http_persistent_handles_clean([string name])
]]></notes>
<contents>
<dir name="/">
typedef int (*http_request_pool_apply_func)(http_request_pool *pool, zval *request TSRMLS_DC);
typedef int (*http_request_pool_apply_with_arg_func)(http_request_pool *pool, zval *request, void *arg TSRMLS_DC);
+#ifdef HTTP_HAVE_PERSISTENT_HANDLES
+PHP_MINIT_FUNCTION(http_request_pool);
+#endif
+
#define http_request_pool_responsehandler(p, r, c) _http_request_pool_responsehandler((p), (r), (c) TSRMLS_CC)
extern int _http_request_pool_responsehandler(http_request_pool *pool, zval *req, void *ch TSRMLS_DC);