![为什么使用 php_exec 启动 Glassfish 与在控制台中启动相比,字符集会发生变化?](https://linux22.com/image/743711/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%20php_exec%20%E5%90%AF%E5%8A%A8%20Glassfish%20%E4%B8%8E%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%AD%E5%90%AF%E5%8A%A8%E7%9B%B8%E6%AF%94%EF%BC%8C%E5%AD%97%E7%AC%A6%E9%9B%86%E4%BC%9A%E5%8F%91%E7%94%9F%E5%8F%98%E5%8C%96%EF%BC%9F.png)
我创建了一个 PHP 脚本来启动/停止 GlassFish 服务器。在 PHP 中,我使用shell_exec方法来执行start-domain和stop-domain命令。
启动服务器
shell_exec("sudo -u root /usr/local/glassfish3/bin/asadmin start-domain domain1");
停止服务器
shell_exec("sudo -u root /usr/local/glassfish3/bin/asadmin stop-domain domain1");
虽然脚本确实可以启动和停止服务器,但有一个我无法解决的问题。字符编码更改为其他内容,并且来自客户端请求的特殊字符不再正确格式化。
具有正确字符集的字符
字符集不正确的字符
似乎 UTF-8 的设置被忽略了,并且它恢复为不同的字符集,我认为是“ISO-8859-1”。
域名.xml
<jdbc-connection-pool connection-validation-method="auto-commit" ...>
<property name="characterEncoding" value="UTF-8"></property>
</jdbc-connection-pool>
sun-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app error-url="">
<context-root>/some-directory-war</context-root>
<class-loader delegate="true"/>
<jsp-config>
<property name="keepgenerated" value="true">
<description>Keep a copy of the generated servlet class java code.</description>
</property>
</jsp-config>
<!-- Change the default character encoding from ISO-8859-1 to UTF-8 -->
<parameter-encoding default-charset="UTF-8"/>
</sun-web-app>
在我调查的过程中,我发现许多文章指出要在 sun-web.xml(旧版本的glassfish - 我的情况)中定义字符集,但没有帮助。
经过一些测试,我注意到,如果我在控制台中使用 www-data 登录,则使用的默认 shell 是 /bin/sh,从该 shell 启动域会导致同样的问题。但是,如果我切换到 /bin/bash,那么它就可以正常工作。
有人知道会有什么区别吗?
任何有关此的信息都将非常感激!
答案1
显然,shell 语言环境会影响 GlassFish 服务器解释请求的方式。我认为这不合逻辑,因为域有自己的设置文件...
以下用户评论确实有帮助:shell_exec
$locale = "en_US.UTF-8";
setlocale(LC_CTYPE, $locale);
putenv('LC_CTYPE=' . $locale);
shell_exec("sudo -u root /usr/local/glassfish3/bin/asadmin start-domain domain1");
它非常有效!