Ubuntu-10.04

如果使用 php_exec 啟動 Glassfish 與在控制台中啟動它相比,為什麼字元集會發生變化?

  • October 10, 2019

我創建了一個 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 並從中啟動域會導致同樣的問題。但是,如果我切換到 /bin/bash,那麼它可以工作。

有誰知道可能有什麼區別?

任何有關這方面的資訊將不勝感激!

顯然,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");

它就像一個魅力!

引用自:https://serverfault.com/questions/987422