php: Stop using dl()
With modern PHP it only works with the CLI version of PHP, so it's better to direct users to load the extension via "extension=" in php.ini. Suggested by ferdynator in #1529.
This commit is contained in:
parent
1eabe1b29b
commit
586eb24efe
6 changed files with 43 additions and 36 deletions
|
|
@ -152,9 +152,9 @@ If the module is in PHP's default extension directory, you can omit the path.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
For some SAPIs (for example, the CLI SAPI) you can instead use the
|
If you're using the PHP CLI SAPI it's possible (but not recommended) to use the
|
||||||
<a href="https://www.php.net/manual/en/function.dl.php">dl() function</a> to load
|
<a href="https://www.php.net/manual/en/function.dl.php">dl() function</a> to
|
||||||
an extension at run time, by adding a line like this to the start of each
|
load an extension at run time, by adding a line like this to the start of each
|
||||||
PHP script which uses your extension:
|
PHP script which uses your extension:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
@ -163,25 +163,22 @@ PHP script which uses your extension:
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
But note that <tt>dl()</tt> isn't supported when running PHP through a
|
But to do this portably you need to take into account that pathnames and the
|
||||||
webserver - you'll need to use <tt>extension</tt> in <tt>php.ini</tt> as
|
filename extension vary by platform, and for security reasons PHP no longer
|
||||||
|
supports <tt>dl()</tt> when running PHP through a webserver. Overall it's
|
||||||
|
probably better to instead use <tt>extension</tt> in <tt>php.ini</tt> as
|
||||||
described above.
|
described above.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
The PHP module which SWIG generates will also attempt to do the <tt>dl()</tt>
|
SWIG also generates a PHP module which defines PHP classes for the wrapped
|
||||||
call for you if the extension isn't already loaded:
|
API, which you'll need to load, for example:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="code"><pre>
|
<div class="code"><pre>
|
||||||
include("example.php");
|
include("example.php");
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
<p>
|
|
||||||
This PHP module also defines the PHP classes for the wrapped API, so you'll
|
|
||||||
almost certainly want to include it anyway.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<H2><a name="Php_nn2">32.2 Basic PHP interface</a></H2>
|
<H2><a name="Php_nn2">32.2 Basic PHP interface</a></H2>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1053,6 +1053,7 @@ PHP = @PHP@
|
||||||
PHP_INCLUDE = @PHPINC@
|
PHP_INCLUDE = @PHPINC@
|
||||||
PHP_SO = @PHP_SO@
|
PHP_SO = @PHP_SO@
|
||||||
PHP_SCRIPT = $(SRCDIR)$(RUNME).php
|
PHP_SCRIPT = $(SRCDIR)$(RUNME).php
|
||||||
|
PHP_EXTENSION = example$(PHP_SO)
|
||||||
|
|
||||||
# -------------------------------------------------------------------
|
# -------------------------------------------------------------------
|
||||||
# Build a PHP dynamically loadable module (C)
|
# Build a PHP dynamically loadable module (C)
|
||||||
|
|
@ -1077,7 +1078,7 @@ php_cpp: $(SRCDIR_SRCS)
|
||||||
# -----------------------------------------------------------------
|
# -----------------------------------------------------------------
|
||||||
|
|
||||||
php_run:
|
php_run:
|
||||||
$(RUNTOOL) $(PHP) -n -d extension_dir=. -d display_errors=stderr -r 'set_error_handler(function($$n,$$s,$$f,$$l){if($$f!==Null){print$$f;if($$l!==Null)print":$$l";print": ";}print"$$s\n";exit(1);});include($$argv[1]);' $(PHP_SCRIPT) $(RUNPIPE)
|
$(RUNTOOL) $(PHP) -n -d extension_dir=. -d extension=$(PHP_EXTENSION) -d display_errors=stderr -r 'set_error_handler(function($$n,$$s,$$f,$$l){if($$f!==Null){print$$f;if($$l!==Null)print":$$l";print": ";}print"$$s\n";exit(1);});include($$argv[1]);' $(PHP_SCRIPT) $(RUNPIPE)
|
||||||
|
|
||||||
# -----------------------------------------------------------------
|
# -----------------------------------------------------------------
|
||||||
# Version display
|
# Version display
|
||||||
|
|
|
||||||
|
|
@ -71,9 +71,9 @@ missingtests: missingcpptests missingctests
|
||||||
# found, runs testcase.php, except for multicpptests.
|
# found, runs testcase.php, except for multicpptests.
|
||||||
run_testcase = \
|
run_testcase = \
|
||||||
if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
|
if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
|
||||||
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) RUNTOOL='$(RUNTOOL)' php_run; \
|
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_EXTENSION=$(TARGETPREFIX)$*$(PHP_SO) PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) RUNTOOL='$(RUNTOOL)' php_run; \
|
||||||
elif [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php -a ! -f $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list ]; then \
|
elif [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php -a ! -f $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list ]; then \
|
||||||
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php RUNTOOL='$(RUNTOOL)' php_run; \
|
$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile PHP_EXTENSION=$(TARGETPREFIX)$*$(PHP_SO) PHP_SCRIPT=$(SCRIPTDIR)/$(SCRIPTPREFIX)$*.php RUNTOOL='$(RUNTOOL)' php_run; \
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Clean: remove the generated .php file
|
# Clean: remove the generated .php file
|
||||||
|
|
|
||||||
|
|
@ -175,7 +175,7 @@ class check {
|
||||||
$extra=array_flip(check::get_extra_globals());
|
$extra=array_flip(check::get_extra_globals());
|
||||||
foreach ($globals as $glob) {
|
foreach ($globals as $glob) {
|
||||||
if (self::GETSET) {
|
if (self::GETSET) {
|
||||||
if (! isset($extra[$glob])) $missing[]=$glob;
|
if (! function_exists($glob . "_get") && ! function_exists($glob . "_set")) $missing[]=$glob;
|
||||||
else unset($extra[$glob]);
|
else unset($extra[$glob]);
|
||||||
} else {
|
} else {
|
||||||
if (! isset($GLOBALS[$glob])) $missing[]=$glob;
|
if (! isset($GLOBALS[$glob])) $missing[]=$glob;
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,10 @@
|
||||||
zend_declare_class_constant_string(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, $value);
|
zend_declare_class_constant_string(SWIGTYPE_$class_ce, "$const_name", sizeof("$const_name") - 1, $value);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%typemap(classconsttab) SWIGTYPE *,
|
// This creates a zend_object to wrap the pointer, and we can't do that
|
||||||
|
// before the Zend runtime has been initialised so we delay it until
|
||||||
|
// RINIT. The downside is it then happens for every request.
|
||||||
|
%typemap(classconsttab,rinit=1) SWIGTYPE *,
|
||||||
SWIGTYPE &,
|
SWIGTYPE &,
|
||||||
SWIGTYPE &&,
|
SWIGTYPE &&,
|
||||||
SWIGTYPE [] %{
|
SWIGTYPE [] %{
|
||||||
|
|
@ -79,7 +82,10 @@
|
||||||
const char []
|
const char []
|
||||||
"SWIG_STRING_CONSTANT($symname, $value);";
|
"SWIG_STRING_CONSTANT($symname, $value);";
|
||||||
|
|
||||||
%typemap(consttab) SWIGTYPE *,
|
// This creates a zend_object to wrap the pointer, and we can't do that
|
||||||
|
// before the Zend runtime has been initialised so we delay it until
|
||||||
|
// RINIT. The downside is it then happens for every request.
|
||||||
|
%typemap(consttab,rinit=1) SWIGTYPE *,
|
||||||
SWIGTYPE &,
|
SWIGTYPE &,
|
||||||
SWIGTYPE &&,
|
SWIGTYPE &&,
|
||||||
SWIGTYPE [] {
|
SWIGTYPE [] {
|
||||||
|
|
|
||||||
|
|
@ -371,19 +371,6 @@ public:
|
||||||
Swig_banner(f_phpcode);
|
Swig_banner(f_phpcode);
|
||||||
|
|
||||||
Printf(f_phpcode, "\n");
|
Printf(f_phpcode, "\n");
|
||||||
Printf(f_phpcode, "// Try to load our extension if it's not already loaded.\n");
|
|
||||||
Printf(f_phpcode, "if (!extension_loaded('%s')) {\n", module);
|
|
||||||
Printf(f_phpcode, " if (strtolower(substr(PHP_OS, 0, 3)) === 'win') {\n");
|
|
||||||
Printf(f_phpcode, " if (!dl('php_%s.dll')) return;\n", module);
|
|
||||||
Printf(f_phpcode, " } else {\n");
|
|
||||||
Printf(f_phpcode, " // PHP_SHLIB_SUFFIX gives 'dylib' on MacOS X but modules are 'so'.\n");
|
|
||||||
Printf(f_phpcode, " if (PHP_SHLIB_SUFFIX === 'dylib') {\n");
|
|
||||||
Printf(f_phpcode, " if (!dl('%s.so')) return;\n", module);
|
|
||||||
Printf(f_phpcode, " } else {\n");
|
|
||||||
Printf(f_phpcode, " if (!dl('%s.'.PHP_SHLIB_SUFFIX)) return;\n", module);
|
|
||||||
Printf(f_phpcode, " }\n");
|
|
||||||
Printf(f_phpcode, " }\n");
|
|
||||||
Printf(f_phpcode, "}\n\n");
|
|
||||||
|
|
||||||
/* sub-sections of the php file */
|
/* sub-sections of the php file */
|
||||||
pragma_code = NewStringEmpty();
|
pragma_code = NewStringEmpty();
|
||||||
|
|
@ -1493,7 +1480,11 @@ public:
|
||||||
{
|
{
|
||||||
tm = Swig_typemap_lookup("consttab", n, name, 0);
|
tm = Swig_typemap_lookup("consttab", n, name, 0);
|
||||||
Replaceall(tm, "$value", value);
|
Replaceall(tm, "$value", value);
|
||||||
Printf(s_cinit, "%s\n", tm);
|
if (Getattr(n, "tmap:consttab:rinit")) {
|
||||||
|
Printf(r_init, "%s\n", tm);
|
||||||
|
} else {
|
||||||
|
Printf(s_cinit, "%s\n", tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
@ -1502,14 +1493,22 @@ public:
|
||||||
Replaceall(tm, "$class", fake_class_name());
|
Replaceall(tm, "$class", fake_class_name());
|
||||||
Replaceall(tm, "$const_name", iname);
|
Replaceall(tm, "$const_name", iname);
|
||||||
Replaceall(tm, "$value", value);
|
Replaceall(tm, "$value", value);
|
||||||
Printf(s_cinit, "%s\n", tm);
|
if (Getattr(n, "tmap:classconsttab:rinit")) {
|
||||||
|
Printf(r_init, "%s\n", tm);
|
||||||
|
} else {
|
||||||
|
Printf(s_cinit, "%s\n", tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
tm = Swig_typemap_lookup("classconsttab", n, name, 0);
|
tm = Swig_typemap_lookup("classconsttab", n, name, 0);
|
||||||
Replaceall(tm, "$class", class_name);
|
Replaceall(tm, "$class", class_name);
|
||||||
Replaceall(tm, "$const_name", wrapping_member_constant);
|
Replaceall(tm, "$const_name", wrapping_member_constant);
|
||||||
Replaceall(tm, "$value", value);
|
Replaceall(tm, "$value", value);
|
||||||
Printf(s_cinit, "%s\n", tm);
|
if (Getattr(n, "tmap:classconsttab:rinit")) {
|
||||||
|
Printf(r_init, "%s\n", tm);
|
||||||
|
} else {
|
||||||
|
Printf(s_cinit, "%s\n", tm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
wrapperType = standard;
|
wrapperType = standard;
|
||||||
|
|
@ -1653,6 +1652,9 @@ public:
|
||||||
String *interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0);
|
String *interfaces = Swig_typemap_lookup("phpinterfaces", node, "", 0);
|
||||||
Replaceall(interfaces, " ", "");
|
Replaceall(interfaces, " ", "");
|
||||||
if (interfaces) {
|
if (interfaces) {
|
||||||
|
// It seems we need to wait until RINIT time to look up classes.
|
||||||
|
// The downside is that this then happens for every request.
|
||||||
|
Printf(r_init, "{\n");
|
||||||
List *interface_list = Split(interfaces, ',', -1);
|
List *interface_list = Split(interfaces, ',', -1);
|
||||||
int num_interfaces = Len(interface_list);
|
int num_interfaces = Len(interface_list);
|
||||||
String *append_interface = NewStringEmpty();
|
String *append_interface = NewStringEmpty();
|
||||||
|
|
@ -1660,13 +1662,14 @@ public:
|
||||||
String *interface = Getitem(interface_list, Iterator-1);
|
String *interface = Getitem(interface_list, Iterator-1);
|
||||||
String *interface_ce = NewStringEmpty();
|
String *interface_ce = NewStringEmpty();
|
||||||
Printf(interface_ce, "php_%s_interface_ce_%d" , class_name , Iterator);
|
Printf(interface_ce, "php_%s_interface_ce_%d" , class_name , Iterator);
|
||||||
Printf(s_oinit, " zend_class_entry *%s = zend_lookup_class(zend_string_init(\"%s\", sizeof(\"%s\") - 1, 0));\n", interface_ce, interface, interface);
|
Printf(r_init, " zend_class_entry *%s = zend_lookup_class(zend_string_init(\"%s\", sizeof(\"%s\") - 1, 0));\n", interface_ce, interface, interface);
|
||||||
Append(append_interface, interface_ce);
|
Append(append_interface, interface_ce);
|
||||||
Append(append_interface, " ");
|
Append(append_interface, " ");
|
||||||
}
|
}
|
||||||
Chop(append_interface);
|
Chop(append_interface);
|
||||||
Replaceall(append_interface, " ", ",");
|
Replaceall(append_interface, " ", ",");
|
||||||
Printf(s_oinit, " zend_class_implements(SWIGTYPE_%s_ce, %d, %s);\n", class_name, num_interfaces, append_interface);
|
Printf(r_init, " zend_class_implements(SWIGTYPE_%s_ce, %d, %s);\n", class_name, num_interfaces, append_interface);
|
||||||
|
Printf(r_init, "}\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue