1: $Id: UPGRADING.INTERNALS,v 1.1.1.3 2014/06/15 20:03:41 misho Exp $
2:
3: UPGRADE NOTES - PHP X.Y
4:
5: 1. Internal API changes
6: a. virtual_file_ex
7: b. stat/lstat support
8: c. readlink support
9: d. layout of some core ZE structures (zend_op_array, zend_class_entry, ...)
10: e. Zend\zend_fast_cache.h has been removed
11: f. streams that enclose private streams
12: g. leak_variable
13: h. API Signature changes
14: i. new TSRM function expand_filepath_with_mode
15: j. unserialization of manipulated object strings
16:
17: 2. Build system changes
18: a. Unix build system changes
19: b. Windows build system changes
20:
21:
22: ========================
23: 1. Internal API changes
24: ========================
25:
26: a. virtual_file_ex
27:
28: virtual_file_ex takes now a TSRM context as last parameter:
29: CWD_API int virtual_file_ex(cwd_state *state, const char *path,
30: verify_path_func verify_path, int use_realpath TSRLS_DC);
31:
32:
33: b. stat/lstat support
34:
35: lstat is now available on all platforms. On unix-like platform
36: php_sys_lstat is an alias to lstat (when avaible). On Windows it is now
37: available using php_sys_lstat. php_sys_stat and php_sys_lstat usage is recommended
38: instead of calling lstat directly, to ensure portability.
39:
40:
41: c. readlink support
42:
43: readlink is now available on all platforms. On unix-like platform
44: php_sys_readlink is an alias to readlink (when avaible). On Windows it is now
45: available using php_sys_readlink. php_sys_readlink usage is recommended
46: instead of calling readlink directly, to ensure portability.
47:
48:
49: d. layout of some core ZE structures (zend_op_array, zend_class_entry, ...)
50:
51: . zend_function.pass_rest_by_reference is replaced by
52: ZEND_ACC_PASS_REST_BY_REFERENCE in zend_function.fn_flags
53: . zend_function.return_reference is replaced by ZEND_ACC_RETURN_REFERENCE
54: in zend_function.fn_flags
55: . zend_arg_info.required_num_args removed. it was needed only for internal
56: functions. Now the first arg_info for internal function (which has special
57: meaning) is represented by zend_internal_function_info structure.
58: . zend_op_array.size, size_var, size_literal, current_brk_cont,
59: backpatch_count moved into CG(context), because they are used only during
60: compilation.
61: . zend_op_array.start_op is moved into EG(start_op), because it's used
62: only for 'interactive' execution of single top-level op-array.
63: . zend_op_array.done_pass_two is replaced by ZEND_ACC_DONE_PASS_TWO in
64: zend_op_array.fn_flags.
65: . op_array.vars array is trimmed (reallocated) during pass_two.
66: . zend_class_entry.constants_updated is replaced by
67: ZEND_ACC_CONSTANTS_UPDATED in zend_class_entry.ce_flags
68: . the size of zend_class_entry is reduced by sharing the same memory space
69: by different information for internal and user classes.
70: See zend_class_inttry.info union.
71:
72:
73: e. Zend\zend_fast_cache.h
74:
75: It should not have been used anymore since php5, but now this header has
76: been removed. The following macros are not available anymore:
77:
78: ZEND_FAST_ALLOC(p, type, fc_type)
79: ZEND_FAST_FREE(p, fc_type)
80: ZEND_FAST_ALLOC_REL(p, type, fc_type)
81: ZEND_FAST_FREE_REL(p, fc_type)
82:
83: Use emalloc, emalloc_rel, efree or efree_rel instead.
84:
85:
86: f. Streams that enclose private streams
87:
88: Some streams, like the temp:// stream, may enclose private streams. If the
89: outer stream leaks due to a programming error or is not exposed through a
90: zval (and therefore is not deleted when all the zvals are gone), it will
91: be destroyed on shutdown.
92: The problem is that the outer usually wants itself to close the inner stream,
93: so that it may do any other shutdown action that requires the inner stream to
94: be live (e.g. commit data to it). If the outer stream is exposed through a
95: zval and the inner one isn't, this is not a problem because the outer stream
96: will be freed when the zval is destroyed, which happens before the resources
97: are destroyed on shutdown.
98: On resource list shutdown, the cleanup happens in reverse order of resource
99: creation, so if the inner stream was created in the opener of the outer stream,
100: it will be destroyed first.
101: The following functions were added to the streams API to force a predictable
102: destruction order:
103:
104: PHPAPI php_stream *php_stream_encloses(php_stream *enclosing, php_stream *enclosed);
105: #define php_stream_free_enclosed(stream_enclosed, close_options)
106: PHPAPI int _php_stream_free_enclosed(php_stream *stream_enclosed, int close_options TSRMLS_DC);
107:
108: Additionally, the following member was added to php_stream:
109:
110: struct _php_stream *enclosing_stream;
111:
112: and the following macro was added:
113:
114: #define PHP_STREAM_FREE_IGNORE_ENCLOSING 32
115:
116: The function php_stream_encloses declares the first stream encloses the second.
117: This has the effect that, when the inner stream is closed from a resource
118: destructor it will abort and try to free its enclosing stream instead.
119: To prevent this from happening when the inner stream is freed from the outer
120: stream, the macro php_stream_free_enclosed should be used instead of
121: php_stream_free/php_stream_close/php_stream_pclose, or the flag
122: PHP_STREAM_FREE_IGNORE_ENCLOSING should be directly passed to php_stream_free.
123: The outer stream cannot abstain, in its close callback, from closing the inner
124: stream or clear the enclosing_stream pointer in its enclosed stream by calling
125: php_stream_encloses with the 2nd argument NULL. If this is not done, there will
126: be problems, so observe this requirement when using php_stream_encloses.
127:
128:
129: g. leak_variable
130:
131: The function leak_variable(variable [, leak_data]) was added. It is only
132: available on debug builds. It increments the refcount of a zval or, if the
133: second argument is true and the variable is either an object or a resource
134: it increments the refcounts of those objects instead.
135:
136:
137: h. API Signature changes
138:
139: . zend_list_insert
140: ZEND_API int zend_list_insert(void *ptr, int type TSRMLS_DC);
141: call: zend_list_insert(a, SOMETYPE TSRMLS_CC);
142: NB: If zend_list_insert is used to register a resource,
143: ZEND_REGISTER_RESOURCE could be used instead.
144:
145: . php_le_stream_context(TSRMLS_C)
146: PHPAPI php_stream_context *php_stream_context_alloc(TSRMLS_D)
147: call: context = php_stream_context_alloc(TSRMLS_C);
148:
149: . php_stream_context_alloc
150: PHPAPI php_stream_context *php_stream_context_alloc(TSRMLS_D);
151: call: context = php_stream_context_alloc(TSRMLS_C);
152:
153: . sapi_get_request_time(TSRMLS_D);
154: SAPI_API double sapi_get_request_time(TSRMLS_D);
155:
156: . sapi_register_default_post_reader
157: SAPI_API int sapi_register_default_post_reader(void (*default_post_reader)(TSRMLS_D) TSRMLS_DC);
158:
159: . sapi_register_treat_data
160: SAPI_API int sapi_register_treat_data(void (*treat_data)(int arg, char *str, zval *destArray TSRMLS_DC) TSRMLS_DC);
161:
162: . sapi_register_input_filter
163: SAPI_API int sapi_register_input_filter(unsigned int (*input_filter)(int arg, char *var, char **val, unsigned int val_len, unsigned int *new_val_len TSRMLS_DC), unsigned int (*input_filter_init)(TSRMLS_D) TSRMLS_DC);
164:
165: . tsrm_win32_access
166: TSRM_API int tsrm_win32_access(const char *pathname, int mode TSRMLS_DC);
167:
168: . popen_ex (win32)
169: TSRM_API FILE *popen_ex(const char *command, const char *type, const char *cwd, char *env TSRMLS_DC);
170:
171: . php_get_current_user
172: PHPAPI php_get_current_user(TSRMLS_D)
173: Call: char *user = php_get_current_user(TSRMLS_C);
174:
175: . php_idate
176: PHPAPI php_idate(char format, time_t ts, int localtime TSRMLS_DC)
177: Call: int ret = php_idate(format, ts, localtime TSRMLS_CC)
178:
179: . php_escape_html_entities
180: (size_t parameters were ints, previous "quote_style" (now flags) has expanded meaning)
181: PHPAPI char *php_escape_html_entities(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset TSRMLS_DC);
182:
183: . php_escape_html_entities_ex
184: PHPAPI char *php_escape_html_entities_ex(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset, zend_bool double_encode TSRMLS_DC);
185:
186: . php_unescape_html_entities
187: PHPAPI char *php_unescape_html_entities(unsigned char *old, size_t oldlen, size_t *newlen, int all, int flags, char *hint_charset TSRMLS_DC);
188:
189: i.
190: PHPAPI char *expand_filepath_with_mode(const char *filepath, char *real_path, const char *relative_to, size_t relative_to_len, int realpath_mode TSRMLS_DC);
191: expand_filepath_with_mode lets define how realpath will behave, using one of the existing mode: CWD_EXPAND , CWD_FILEPATH or CWD_REALPATH.
192:
193: j.
194: Strings requiring unserialization of objects are now explicitly checked
195: whether the object they contain implements the Serializable interface.
196: This solves the situation where manipulated strings could be passed for
197: objects using Serializable to disallow serialization. An object
198: implementing Serializable will always start with "C:" in the serialized
199: string, all other objects are represented with starting "O:". Objects
200: implementing Serializable to disable serialization using
201: zend_class_unserialize_deny and zend_class_serialize_deny, when
202: instantiated from the serializer with a manipulated "O:" string at the
203: start, will most likely be defectively initialized. This is now
204: fixed at the appropriate place by checking for the presence of the
205: serialize callback in the class entry.
206:
207: ========================
208: 2. Build system changes
209: ========================
210:
211: a. Unix build system changes
212:
213: - Changes in SAPI module build:
214: . When adding new binary SAPI (executable, like CLI/CGI/FPM) use CLI config.m4 and Makefile.frag files as templates and replace CLI/cli with your SAPI name.
215:
216: - New macros:
217: . PHP_INIT_DTRACE(providerdesc, header-file, sources [, module])
218:
219:
220: b. Windows build system changes
221: -
222:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>