php中escapeshellarg中文被過濾

來源:互聯網
上載者:User

轉自: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 改了過來,這樣才成功傳遞參數過去。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.