轉自:http://blog.csdn.net/ricky1217/article/details/6934202
參考:http://www.byreach.com/m/node/1439
同樣的代碼,發現通過 localhost/index.php 訪問,和在 shell 中通過 php ./index.php 運行結果卻不一樣。
在程式中需要通過 shell_exec 來執行一個 linux 程式,而它的輸入來自 echo ,即:
shell_exec('echo '.escapeshellarg($str).' | some_cmd 2>&1');
而這個 $str 中可能包含中文的。一開始我還以為是 some_cmd 自己把中文濾掉,後來發現是 escapeshellarg 的問題。
貌似出現這個問題的不多,好不容易才搜到一篇文章:http://byreach.com/m/node/1439。原來是 shell 和 apache php-cgi 的運行環境不同引起的。
在 php 中加入:
setlocale(LC_CTYPE, "UTF8", "en_US.UTF-8");
正常了!
------------------------------------------------------------------------------------------------------------
原來使用solr的服務,把solr伺服器放在另外一台機器上跑,可以運行java的。現在那台機器的效能不穩定了。。。服務跑不了,而dream host的機器又不讓運行後台服務程式。於是改造一下,使用php的exec命令直接運行java程式來維護本站的索引,成功了!現在本站搜尋可以獨立運 作了。值得注意的是php在運行java虛擬機器的時候,會報一個錯,說記憶體空間不足,需要實際測試一下,使用Xmx的選項來控制虛擬機器分配的記憶體大小,經 過實測,這台DH機器上,使用256M沒有太大問題。
從php向java的程式傳遞參數挺講究的,比如要索引的字串,因為是通過參數來傳遞,所以有個escape的問題,另外也不能太長。在使用php 的函數escapeshellarg()時,意外發現它會把所有中文字元都去掉,而同樣的代碼,在命令列下執行卻是正確的。想來想去,應該是LANG這個 環境變數沒有設定好的問題吧,網上查到有人提到同樣的問題:
http://bonsai.php.net/bug.php?id=44945&edit=1
看來和shell打交道,不處理這個環境變數不行,還是用它提到的方法:
setlocale(LC_CTYPE, "UTF8", "en_US.UTF-8");
把系統預設的 C 改了過來,這樣才成功傳遞參數過去。