php调试 输出到控制台,php在eclipse的控制台console输出调试信息功能实现

早先在做PHP时就觉得有个地方不太爽,还发表文章表示不满。

jsp中用system.out.print如果是在eclipse中调试的话,eclipse会自动拦截系统输出流,

然后输出在控制台中,而http输出流则不受影响,php好像无此功能,

有一个syslog()函数,在windows下要到事件管理器里查看,实在用处不大。

所以只好输出到文件查看bug,也是除了debug模式,单元测试之外的最常用调试手段

然后构思了一个解决方案,共享之。

思路:建一个java程序并使之运行,其监听本地机器的某个端口。只要有输入就直接输出,

java程序的关闭,最好是改一下程序,让特别的请求正常关闭。

但现在简单的办法就是 点击控制台的红色按钮(表示jvm在启动)

点击控制台的clear按钮可以清空控制台。注意还可能有多个控制台。

只要程序开着,就可以接受调试信息,赶快试一试吧。

浏览器是外部的还是eclipse内部的无所谓。

条件,使用eclipse,打开php的socket扩展,

编写一个java程序

//: c15:MultiJabberServer.java

// From 'Thinking in Java, 2nd ed.' by Bruce Eckel

// www.BruceEckel.com. See copyright notice in CopyRight.txt.

// A server that uses multithreading

// to handle any number of clients.

import java.io.*;

import java.net.*;

import java.text.SimpleDateFormat;

import java.util.Date;

/**

* 该文件来源:《java编程思想(第2版)》,作者Bruce Eckel

* 被修改了输出的几句话。,还有编码等 现成的php 的 eclipse 的控制台,

*

* 使php 在pdt环境下 本机调试更加方便 发表评论,请http://xieye.iteye.com/

* xieye 20081122

*/

class ServeOneJabber extends Thread {

private Socket socket;

private BufferedReader in;

private PrintWriter out;

public ServeOneJabber(Socket s) throws IOException {

socket = s;

in = new BufferedReader(new InputStreamReader(socket.getInputStream(),

"UTF-8")); // 重要啊

// Enable auto-flush:

out = new PrintWriter( // 其实out没有用到

new BufferedWriter(new OutputStreamWriter(socket

.getOutputStream())), true);

// If any of the above calls throw an

// exception, the caller is responsible for

// closing the socket. Otherwise the thread

// will close it.

start(); // Calls run()

}

public void run() {

try {

synchronized (MultiJabberServer.lock1) { // lock1 是公用同步锁

// ,如果这个锁不加更糟

// 可以自己修改格式字符串

SimpleDateFormat sdf = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");

System.out.print(sdf.format(new Date()) + " [debug] ");

while (true) {

String str = in.readLine();

if (str.equals(MultiJabberServer.S_EOF))

break;

System.out.println(str);

}

}

} catch (IOException e) {

System.err.println("== 客户端强行关闭 ==");

} finally {

try {

// System.err.println("==");

socket.close();

} catch (IOException e) {

System.err.println("Socket not closed");

}

}

}

}

public class MultiJabberServer {

static final int PORT = 8080; // 这就是端口,请保持与php代码一致

static final String S_EOF = "END"; // 这是停止字符串,要和php一致

public static final Object lock1 = new Object(); // 增加同步机制

public static void main(String[] args) throws IOException {

ServerSocket s = new ServerSocket(PORT);

System.out.println("PHP控制台启动。");

try {

while (true) {

// Blocks until a connection occurs:

Socket socket = s.accept();

try {

// synchronized(lock1){ // lock1 是公用同步锁

// 需要同步,但我不会

new ServeOneJabber(socket);

// }

} catch (IOException e) {

// If it fails, close the socket,

// otherwise the thread will close it:

socket.close();

}

}

} finally {

System.out.println("PHP控制台关闭。"); // 怎样才能让这句话执行呢?

s.close();

}

}

} // /:~

在eclipse里建一个java工程,然后放进去,文件名为MultiJabberServer.java

右键,Run_as --> Java Application, 视图是php还是java都无所谓

于是下方控制台打开,显示php控制台启动

新建一个php项目或者直接拷贝到原有的php项目里,把一个php文件

/**

* 该文件包含了一个输出到php控制台的函数, 并演示了如何使用该函数

* 需要有一个java程序MultiJabberServer.java配合

* 需要eclipse开发环境pdt

* 需要把php.ini 大约648行 的;extension=php_sockets.dll 前分号去掉

* php文件需要utf-8编码,或者使用utf8_encode 函数

* java文件编码应该是不限制的

* 唯一的遗憾是输出顺序不能控制,java高手快来改啊

*

* 操作系统:我目前是windowsXP,其实linux应该一样用

* 我的php当前版本是php5.2.6,其实只要能用socket扩展即可

* java版本随便,只要eclipse能开即可

* eclipse版本随便,只要是pdt

*

* xieye 20081122

*/

header('Content-Type:text/html; charset=utf-8');

/**

* 加一个换行符

*

* @param string $s

*/

function echobr($s)

{

echo $s."
";

}

/**

* 输出到eclipse控制台的函数,使用前提见文件说明

*

* 另外,想要输出的字符串不要有单独的一行是“END”,因为被保留用来判断,

* 也可以自己修改,但要同时改java类

*

* 我用java多线程,只是为了防止服务端的socket自动关闭

*

* @param string $s 想要显示在eclipse控制台的字符

*/

function s($s)

{

/* 指定调试输出的端口, 可以换掉 */

$service_port = '8080';

/* 指定本机IP */

$address = '127.0.0.1';

/* 停止字符串设置 */

$s_eof = "END";

/* 创建一个 TCP/IP socket对象.还是静态的 */

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false) {

echobr( "socket创建失败: 原因: " . socket_strerror(socket_last_error()) );

return false;

} else {

echobr( " socket创建 OK.");

}

/* socket连接 */

$result = socket_connect($socket, $address, $service_port);

if ($result === false) {

echobr( "socket连接失败。
原因: ($result) " . socket_strerror(socket_last_error($socket)) );

return false;

} else {

echobr( "socket 连接 OK.");

}

//把停止字符串附加上去

$in = $s . "\n" . $s_eof;

socket_write($socket, $in, strlen($in));

//关闭socket;

socket_close($socket);

// sleep(1);

}

// 以下是演示,应该会在eclipse的console输出,注意:在控制台的顺序可能颠倒,要改java,不会

// 或者把上面的sleep(1)注释取消。

s('你好!');

$temp = var_export(array(1 => '红色', 2 => '蓝色'), true);

s($temp);

?>

文件名随意,然后到浏览器里访问该php文件,会发现eclipse的console里的调试信息。

很不错吧,

有java高手请一定指教,如何确保显示的顺序和php里顺序相同。

非常感激!

xieye

20081123

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值