Ubuntu-10.04
如果使用 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 並從中啟動域會導致同樣的問題。但是,如果我切換到 /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");
它就像一個魅力!