以deb包安裝的php-java-bridge會產生一隻java.ini在php的conf.d目錄,裏面也只是開啟extension = java.so而已,但是用phpinfo看到的卻是一堆資訊,不知java command是從那裏來的? 而且java status是not running:

用ps aufx來查看,發現多出了一個apache2 process(root身份執行),java server是在這個多出的apache2下(root身份執行)。因為apache2 process多佔用3.3MB常駐記憶體,若是不想浪費記憶體,可以使用java servlet,這樣每次調用jasperreports時就不必再啟動java;另外基於安全考量,不希望java servlet用root身份執行(產生的輸出檔無法用unlink()刪除),方法如下:
修改/etc/php5/conf.d/java.ini,指定java.hosts及開啟java.servlet:
[java]
extension = java.so
java.hosts = 127.0.0.1:8080
java.servlet = On
執行JavaBridge:
LD_LIBRARY_PATH=/usr/lib/php5/20060613+lfs: java -Djava.library.path=/usr/lib/php5/20060613+lfs -Djava.class.path=/usr/lib/php5/20060613+lfs/JavaBridge.jar -Djava.awt.headless=true -Dphp.java.bridge.base=/usr/lib/php5/20060613+lfs
-jar /usr/lib/php5/20060613+lfs/JavaBridge.jar
3 /var/log/JavaBridge.log
再看看phpinfo()裏的java:

最後是安全問題,如果我是手動執行JavaBridge那麼servlet的身份是henry,產生的檔案owner也是henry, 那麼php執行unlink()是用www-data身份還是刪不掉它。若是用www-data執行,必須開放www-data的shell權限,這又是犯了安全大忌。必須想一個安全的辦法(不是chmod 777)讓servlet以www-data身份執行,而不必給www-data shell權限。
瀛洲用c寫了一隻suex程序,以Exec System Call跳過shell的限制,用法:
sudo suex
www-data
/usr/bin/java
-jar /usr/lib/php5/20060613+lfs/JavaBridge.jar
3 /var/log/JavaBridge.log
此文章還沒有 Pingbacks
Comments are not allowed from anonymous visitors.