`
xieye
  • 浏览: 830387 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

    博客分类:
  • PHP
阅读更多

早先在做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
    
    /**
     * 该文件包含了一个输出到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."<br/>";
    }
    
    /**
     * 输出到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连接失败。 <br/> 原因: ($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

 

 

 

 

 

 

 

 

 

 

 

4
0
分享到:
评论
3 楼 xieye 2011-09-02  
to: j0117
:idea:

其实java我也不太懂,十分感谢。
2 楼 j0117 2011-09-02  
你的文章中思想挺不错,EC4P已经具体实现了出来,请具体参看http://club.topsage.com/thread-2450808-1-1.html
1 楼 zivpiggy 2009-05-15  
试了一下,感觉不错,暂时还没发现显示不一致的地方。每次都要开eclipse,很麻烦,改了一下,在cmd下输出。 

相关推荐

    PHP开发调试(debug)工具Eclipse Console for PHP(EC4P)

    下面是我释出的PHP eclipse控制台(console) 输出项目(Eclipse Console for PHP| EC4P )0.5版本,基本实现了在控制台(console)输出一些调试参数 的功能。 这样的功能对于小项目 ,PHP初学者 ,或者一些不方便页面...

    PHP开发调试(debug)工具Eclipse Console for PHP(EC4P) v0.6

    Eclipse Console for PHP (简称EC4P) 是一个专门针对PHP的Eclipse插件,其v0.6版本为开发者提供了强大的控制台调试功能,极大地提升了开发效率。 EC4P的核心特性包括: 1. **控制台输出**:EC4P允许开发者通过`...

    Eclipse入门教程PDF版

    7. **控制台(Console)**:显示程序的输出信息。 8. **大纲(Outline)**:展示当前打开文件的结构。 9. **资源管理器(Package Explorer)**:查看和管理项目中的文件和文件夹。 二、创建Java项目 在Eclipse中...

    eclipse学习资料

    启动Eclipse后,你会看到工作台(Workbench)由多个视图(View)组成,如项目探索器(Package Explorer)、大纲(Outline)、控制台(Console)、问题(Problems)等。这些视图可以自定义布局,以适应个人的工作习惯...

    eclipse RCP入门示例介绍

    通过使用 RCP,开发者可以利用 Eclipse 已有的界面元素(如菜单、工具栏等)和功能组件(如控制台 Console),极大地减少了重复开发的工作量。此外,RCP 支持高度定制化,允许开发者根据具体需求调整用户界面和功能...

    Eclipse 平台入门

    Eclipse界面由多个视图(View)组成,如项目探索器(Package Explorer)、代码编辑器(Editor)、问题视图(Problems)、控制台(Console)等。这些视图可以自由排列和隐藏,以满足个人工作习惯。 四、创建Java项目...

    eclipse 文档合集(英文版)

    6. **控制台(Console)**:显示程序输出和错误信息。 7. **问题视图(Problems View)**:列出代码中的错误和警告。 二、Eclipse RCP(Rich Client Platform) Eclipse RCP是一种框架,用于构建桌面应用程序。它...

    Eclipse平台Java开发入门.pdf

    5. 控制台(Console):显示程序的输出信息。 6. 透视图(Perspectives):一种预设的窗口布局,可以快速地切换到特定的开发活动,例如调试、编辑或数据库操作。 Eclipse支持多种插件,增强了其功能。插件可以安装...

    Eclipse安装Maven插件

    - **查看Maven控制台**:在Eclipse中,通过Window -&gt; Show View -&gt; Console打开控制台视图,切换至Maven的控制台Tab,可以监控Maven构建过程中的输出信息。 #### 六、总结 通过上述步骤,不仅能在Eclipse中成功...

    eclipse_guide

    - 工作台(Workbench):Eclipse的主界面,由多个视图(View)组成,如透视图(Perspective)、导航器(Navigator)、问题视图(Problems)、控制台(Console)等。 - 透视图(Perspective):不同类型的开发任务...

    eclipse 工具

    - **控制台(Console)**:显示程序运行时的输出信息。 - **问题视图(Problems)**:列出项目中的错误和警告。 3. **Eclipse Java开发** - **项目创建**:通过"File &gt; New &gt; Java Project"创建新的Java项目。 ...

    Eclipse 运行命令行参数大全

    4. **-debug**:开启调试模式,可以附加额外的调试信息,有助于问题定位。 5. **-nosplash**:禁止显示启动画面,加快启动速度。 6. **-nolazyregistrycacheloading**与**-noregistrycache**:这两个参数用于控制...

    Eclipse中文教程

    Eclipse的界面由多个视图(View)组成,包括透视图(Perspective)、编辑器(Editor)、导航器(Navigator)、控制台(Console)、问题视图(Problems)、包浏览器(Package Explorer)等。这些视图可以根据个人喜好...

    eclipse 使用技巧

    Eclipse 是一个功能强大且广泛使用的集成开发环境(IDE),它支持多种编程语言,包括 Java、Python、C++、PHP 等。下面是 Eclipse 的一些使用技巧和概念: 一、Eclipse 的相关介绍 Eclipse 是由 IBM 开发的一个...

    web开发调试方法

    在遇到复杂的问题时,使用“console.log()”语句输出变量值也是常见的调试手段。此外,利用Source Maps可以在编译后的代码上进行调试,这对于处理过压缩或者转换的源码非常有用。 对于后端,开发者通常会依赖于IDE...

Global site tag (gtag.js) - Google Analytics