簡體   English   中英

如何在php腳本中執行Java程序?

[英]How can I execute a Java program within a php script?

我正在寫一個簡單的網絡上傳腳本。 目標是使用php上傳文件,然后調用java程序來處理該文件。
我已經完成了上傳文件的工作,但是我無法在php腳本中成功運行java程序。
我嘗試過沒有結果的exec()shell_exec()system()
對於命令,我使用了“ java Test ”,“ java < directory >/Test ”,“ /usr/bin/java < directory >/Test ”,我甚至將應用程序設置為jar文件而沒有結果。 我使用的實際代碼行是:

echo shell_exec("java Test");

通常沒有輸出。 但是,如果我只有shell_exec("java") ,那么將show splash screen with specified image java的幫助的最后一行(“ show splash screen with specified image ”),這表明該命令已被執行。 如果我使用,例如,s hell_exec("whoami")我會返回“nobody”,這是正確的。 java文件唯一要做的就是創建一個文件,以便我可以看到應用程序已成功運行(如果我在命令行上運行它,應用程序就會成功運行)。 我已將java文件的權限設置為777,以排除任何權限錯誤的可能性。 我一直在努力嘗試各種各樣的選項而沒有結果 - 文件永遠不會被創建(文件是用絕對路徑創建的,所以它沒有被創建,我只是找不到文件)。 有沒有人有任何想法?

謝謝。

我一直在努力嘗試各種各樣的選項而沒有結果 - 文件永遠不會被創建(文件是用絕對路徑創建的,所以它沒有被創建,我只是找不到文件)。 有沒有人有任何想法?

我認為問題是什么。 Apache運行為“nobody”組(apache user ??),它將執行java腳本,該腳本將嘗試在某處創建光盤上的文件。 我認為它沒有寫入該位置的權限。 你應該chown該文件夾,以便apache用戶可以寫入該文件夾。

==

首先,我想向您指出,從腳本調用exec()可能會真正炸毀您的服務器。 我會建議你使用像redis這樣的東西(見下文)。

==

其次我想我知道問題是什么。 你應該首先嘗試運行下面對我來說很好的簡單示例。

==

首先要確保權限設置正確。 因為apache作為無人運行(大多數時候)。

我在ubuntu上嘗試了這個簡單的測試,從repo安裝了php。

test.java

class test {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

test.php的

echo exec('java test');

跑test.php

$ php test.php
Hello World!

==

或者您可以嘗試以下解決方案之一(這甚至是更好的解決方案):

  1. 將您的java程序編寫為web服務,例如在atmosphere-spade-server(簡單/嵌入式jar)之上。 這可能是瘋狂寫的。 但是在高負荷下,這不是我猜的最佳選擇。 我認為這對你來說還不夠快。 即使這樣,執行它也會快得多,因為你不會有運行JVM的開銷。 可能炸毀你的服務器,不如exec()快
  2. redis (* nix)列表結構執行阻止彈出/推送 這將非常容易在* nux上編寫,因為有兩個java / php的客戶端庫。 速度最好我猜,因為redis是用C語言編寫的。我自己使用redis。
  3. 使用JMS ,例如activemq 也很容易寫,因為良好的庫支持。 我自己沒有用過JMS。 我使用redis解決方案。 我猜的速度會比使用redis解決方案少一點。

我真的不知道,但我來了一個跨PHP-JAVA橋可能它可以幫助

http://php-java-bridge.sourceforge.net/pjb/

更新:

我用Jasper Reports測試了它,它的工作非常好。 它將允許您使用PHP擴展Java類,或者只使用Java類,而不是PHP。

use java\lang\String as JString;
require_once("javabridge/java/Java.inc");

class String extends JString {
    function toString () {
        return "hello " . parent::toString();
    }
}
$str = new String("Java");
echo $str->toString();

要么

$temp = new Java('java.sql.Timestamp');
$javaObject = $temp->valueOf('2007-12-31 0:0:0');


$params = new Java("java.util.HashMap");
$params->put("text", "This is a test string");
$params->put("date",$javaObject);

更多示例: http//php-java-bridge.sourceforge.net/pjb/FAQ.html

它可能與exec默認的路徑有關。 在調用java時,您可能需要使用.class或jar文件的絕對路徑顯式定義類路徑。

<?php
$PATH="C:\Program Files\Java\jdk1.7.0_09\bin";

echo exec("javac theNameOfYourJavaProgram.java 2>&1");//shows # of errors
echo "<br />";
echo exec("java theNameOfYourJavaProgram 2>&1");//this line executes it
echo "<br />";
echo shell_exec("javac theNameOfYourJavaProgram.java 2>&1 ");//compiles it 

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM