为什么使用 php_exec 启动 Glassfish 与在控制台中启动相比,字符集会发生变化?

为什么使用 php_exec 启动 Glassfish 与在控制台中启动相比,字符集会发生变化?

我创建了一个 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");

它非常有效!

相关内容