Как я могу выполнить PHP-скрипт с Java?
У меня есть php-скрипт, который выполняется по URL-адресу. (например, www.something.com/myscript?param=xy)
Когда этот скрипт выполняется в браузере, он выдает закодированный результат, отрицательное или положительное число.
Я хочу выполнить этот скрипт из кода Java(J2EE) и сохранить этот результат в каком-либо объекте.
Я пытаюсь использовать httpURLConnection
для этого.
Я устанавливаю соединение, но не могу получить результат. Я не уверен, что я вообще выполняю сценарий.
6 answers
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.yahoo.com/");
URLConnection yc = yahoo.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
Этот фрагмент взят из официального руководства по Java (http://java.sun.com/docs/books/tutorial/networking/urls/readingWriting.html ). Это должно вам помочь.
Если ваше приложение J2EE развернуто на том же сервере, на котором находится PHP-скрипт, вы также можете выполнить его напрямую как независимый процесс, например:
public String execPHP(String scriptName, String param) {
try {
String line;
StringBuilder output = new StringBuilder();
Process p = Runtime.getRuntime().exec("php " + scriptName + " " + param);
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
output.append(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
return output.toString();
}
Вы будете оплачивать накладные расходы на создание и выполнение процесса, но вы не будете создавать сетевое подключение каждый раз, когда вам нужно выполнить сценарий. Я думаю, что в зависимости от размера вашего вывода один будет работать лучше, чем другой.
Если вы пытаетесь запустить его через HTTP, я бы рекомендовал HTTP-клиент Apache Commons библиотеки. Они делают невероятно легким выполнение такого рода задач. Например:
HttpClient http = new HttpClient();
http.setParams(new HttpClientParams());
http.setState(new HttpState());
//For Get
GetMethod get = new GetMethod("http://www.something.com/myscript?param="+paramVar);
http.executeMethod(get);
// For Post
PostMethod post = new PostMethod("http://www.something.com/myscript");
post.addParameter("param", paramVar);
http.executeMethod(post);
В соответствующем примечании, если вы пытаетесь выполнить php-скрипт из программы java, вы можете сослаться на следующий код
Process p = Runtime.getRuntime().exec("php foo.php");
p.waitFor();
String line;
BufferedReader error = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while((line = error.readLine()) != null){
System.out.println(line);
}
error.close();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line=input.readLine()) != null){
System.out.println(line);
}
input.close();
OutputStream outputStream = p.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
Сегодня я столкнулся с точно такой же проблемой. Для меня то, что сработало, - это URL-кодирование параметров PHP-скрипта с использованием java.net .URLEncoder.метод кодирования.
String sURL = "myURL";
String sParam="myparameters";
String sParam=java.net.URLEncoder.encode(sParam,"UTF-8");
String urlString=sURL + sParam;
HttpClient http = new HttpClient();
try {
http.getHttpResponse(urlString);
} catch (AutomationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
http=null;
Я столкнулся с аналогичной ситуацией, когда мне нужно вызвать функцию PHP из кода java, и я использовал приведенный ниже код для достижения этой цели. В приведенном ниже коде"/var/www/html/demo/demo.php " - это имя файла PHP, а callToThisFunction() - имя функции PHP. Надеюсь, это кому-то поможет.
public static void execPHP() {
Process process = null;
try {
process = Runtime.getRuntime().exec(new String[]{"php", "-r", "require '/var/www/html/demo/demo.php'; callToThisFunction();"});
process.waitFor();
String line;
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while ((line = errorReader.readLine()) != null) {
System.out.println(line);
}
errorReader.close();
BufferedReader outputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = outputReader.readLine()) != null) {
System.out.println(line);
}
outputReader.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
OutputStream outputStream = process.getOutputStream();
PrintStream printStream = new PrintStream(outputStream);
printStream.println();
printStream.flush();
printStream.close();
}