回复: [PHP-DEV] [DICUSS]Cleanup resource handling APIs
| From: | Wei Dai | Date: | Mon, 02 Feb 2015 08:02:29 +0000 |
| Subject: | 回复: [PHP-DEV] [DICUSS]Cleanup resource handling APIs | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-81559@lists.php.net to get a copy of this message | ||
> > De : Xinchen Hui [mailto:laruence@php.net]
> > we used to use lval of zval as a handle to access resource type..
> >
> > but now, we introduced a new type IS_RESOURCE, which make the
> > handle(id) sort of redundant .
> >
>
>
> Wrong. The IS_RESOURCE type has nothing to do with PHP 7. Only zend_resource is new. And handle
> is not redundant.
>
> > further more, the common usage when handling resource is like:
> >
> > if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl", &result,
> > &offset) == FAILURE) {
> > return;
> > }
> > ZEND_FETCH_RESOURCE(mysql_result, MYSQL_RES *, result, -1, "MySQL
> > result", le_result);
> >
> > as you can see, we use "r" to receive a IS_RESOURCE type, that
> > means, check the type in ZEND_FETCH_RESOURCE is overhead..
> >
>
>
> There's no overhead here. Zend_parse_parameters checks that received arg is IS_RESOURCE.
> Fetch then checks that received resource is one of the accepted resource types. Sorry to say that,
> but are you sure you understand the difference between zval types and resource types ?
Are you kidding? he is one of the main authors of PHP7..
>
> > ZEND_API void *zend_fetch_resource(zval *passed_id, int default_id,
> > const char *resource_type_name, int *found_resource_type, int
> > num_resource_types, ...)
> >
> > we use va_args to passing resource type, that means, the rescue
> > type arguments can not be passed by register but by stack.. which is a
> > little low effiicient .
> >
>
>
> What do you mean with 'rescue' type ?
>
> Fetch is supposed to check for a variable number of possible resource types. It could probably
> be restricted to 2 possible types as, generally, it is the maximum (one for non-persistent, one for
> persistent). But I am not sure the overhead of passing arg on the stack justifies a change. Remember
> that id is searched in an array, which takes probably much more time that pushing/popping one or two
> arguments.
>
> > so, I'd like propose a zend_resource handling API cleanup..
> >
> > 1. DROP ZEND_REGISTER_RESOURCE/FETCH_RESOURCE.
> >
> > 2. add :
> >
> > ZEND_API void *zend_fetch_resource(zend_resource *res, const
> > char *resource_type_name, int resource_type);
> > ZEND_API void *zend_fetch_resource2(zend_resource *res, const char
> > *resource_type_name, int *found_type, int resource_type, int
> > resource_type2);
> > ZEND_API void *zend_fetch_resource_ex(zval *res, const char
> > *resource_type_name, int resource_type);
> > ZEND_API void *zend_fetch_resource2_ex(zval *res, const char
> > *resource_type_name, int *found_type, int resource_type, int
> > resource_type2);
> >
>
>
> If you drop ZEND_REGISTER_RESOURCE, how do you register new resources ? Or do you mean you
> don't register them any more ? But registering them is mandatory if we want them to be freed
> when request ends.
>
> > furthermore, I'd like to discuss remove the handle in zend_resource struct..
> >
> > it may breaks some usage (use resource as long/double/string)
> >
> > case IS_RESOURCE: {
> > char buf[sizeof("Resource id #") + MAX_LENGTH_OF_LONG];
> > int len;
> >
> > len = snprintf(buf, sizeof(buf), "Resource id #"
> > ZEND_LONG_FMT, (zend_long)Z_RES_HANDLE_P(op));
> > return zend_string_init(buf, len, 0);
> > }
> >
>
>
> OK. You want to remove resource registration. But resources don't work this way (see
> http://devzone.zend.com/446/extension-writing-part-iii-resources/).
> If you remove the handle, you remove the whole zend_list API.
>
> The zend_resource struct is not a structure you may fill with random data. Using the handle to
> store long/double/string is not a legitimate usage.
>
> Regards
>
> François
>
>
>
>
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>
Best,
Wei Dai