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

来自:

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

 

 

 

**********************************************************************************************
        项目名称:Eclipse Console for PHP
        项目简称:EC4P
        项目地址:http://sourceforge.net/projects/econsole4php/
        SVN:svn co https://econsole4php.svn.sourceforge.net/svnroot/econsole4php econsole4php

更新进度:v0.5 v0.6 v0.7

**********************************************************************************************
        使用eclipse(PDT PHP Development Tools Project)类型的开发工具做PHP开发或者二次开发时,非寻常郁闷的就是调试(debug)的时候不能像其他语言一样在控制台(console)输出消息,必须得打开网页使用echo或者var_dump等,非常的不方便。
        在网上找了半天,得到一个小半成品,但是存在输出顺序混乱等问题。另外,PHP debug扩展Xdebug虽然改写了var_dump函数,但是还是同样的问题,不能在控制台(console)输出。
        下面是我释出的PHP eclipse控制台(console)输出项目(Eclipse Console for PHP|EC4P)0.5版本,基本实现了在控制台(console)输出一些调试参数的功能。
        这样的功能对于小项目,PHP初学者,或者一些不方便页面输出的调试非常有用,欢迎大家使用并反馈意见,不胜荣幸。
        下面的代码为最初的形态,最新的请寻找 EC4P下载版本

        CSND下载地址:EC4P

 [java] 代码:在eclipse里 建个工程console4php,新建java文件,名字为:Console4PHPServe.java,编译运行,控制台输出: "PHP控制台启动",java接收端OK。

  1. import java.io.*;
  2. import java.net.*;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. /**
  7. * edit soolly
  8. * vision:0.5
  9. * eclipse 插件端代码
  10. * 网络上的代码,完善了线程锁,现在接收数据流打印的时候顺序不会乱了
  11. * 一段时间以后计划做成eclipse插件
  12. * 代码发布在http://club.topsage.com/thread-2450808-1-1.html
  13. *
  14. * 该文件来源:《java编程思想(第2版)》,作者Bruce Eckel
  15. * 被修改了输出的几句话。,还有编码等 现成的php 的 eclipse 的控制台,
  16. *
  17. * 使php 在pdt环境下 本机调试更加方便 发表评论,请http://xieye.javaeye.com/ xieye 20081122
  18. */
  19. class Console4PHPOperate extends Thread {
  20.         private Socket socket;
  21.         private BufferedReader in;
  22.         private Console4PHPServe obj;
  23.  
  24.         public Console4PHPOperate(Socket s,Object o) throws IOException {
  25.                 socket = s;
  26.                 obj = (Console4PHPServe)o;
  27.                 in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
  28.         }
  29.  
  30.         public void run() {
  31.                 try {
  32.                                 SimpleDateFormat sdf = new SimpleDateFormat(
  33.                                                 "[HH:mm:ss]");
  34.                                                 //"yyyy-MM-dd HH:mm:ss");
  35.                                 System.out.print(sdf.format(new Date()) + " ");
  36.                                 while (true) {
  37.                                         String str = in.readLine();
  38.                                         if (str.equals(Console4PHPServe.S_EOF))
  39.                                                 break;
  40.                                         if(str.equals("//"+Console4PHPServe.S_EOF)){
  41.                                                 str=Console4PHPServe.S_EOF;
  42.                                         }
  43.                                         System.out.println(str);
  44.                                 }
  45.                 } catch (IOException e) {
  46.                         System.err.println("== 客户端强行关闭 ==");
  47.                 } finally {
  48.                         try {
  49.                                 socket.close();
  50.                                 obj.waitForAll(true, this);
  51.                         } catch (IOException e) {
  52.                                 System.err.println("Socket not closed");
  53.                         }
  54.                 }
  55.         }
  56. }
  57.  
  58. public class Console4PHPServe {
  59.         static final int PORT = 8281; // 监听端口,请保持php一致
  60.         static final String S_EOF = "END"; // 停止字符串,和php一致
  61.  
  62.         public static void main(String[] args) throws IOException {
  63.                 Console4PHPServe c = new Console4PHPServe();
  64.                 c.waitForAll(false,c);
  65.         }
  66.                
  67.         public synchronized void waitForAll(boolean flag,Object o)  throws IOException {
  68.                 if(flag){
  69.                         notifyAll();
  70.                 }else{
  71.                         ServerSocket s = null;
  72.                         try{
  73.                         s = new ServerSocket(PORT);
  74.                         System.out.println("PHP控制台启动。");
  75.                         }catch(Exception e){
  76.                                 System.out.println("端口"+PORT+"被占用!");
  77.                         }
  78.                         try {
  79.                                 while (true) {
  80.                                         Socket socket = s.accept();
  81.                                         try {
  82.                                                 new Console4PHPOperate(socket,o).start();
  83.                                                 try {
  84.                                         wait();
  85.                                     } catch (Exception e) {}
  86.         
  87.                                         } catch (IOException e) {
  88.                                                 socket.close();
  89.                                         }
  90.                                 }
  91.                         } finally {
  92.                                 System.out.println("PHP控制台关闭。");
  93.                                 s.close();
  94.                         }
  95.                 }
  96.     }
  97.         
  98.         protected void finalize()   
  99.         {   
  100.                 System.out.println("PHP控制台关闭。");
  101.         }
  102. }
复制代码

[PHP] 代码: 存为PHP文件,名字为:e4phpconsole.php,工程的哪个文件需要控制台(console)功能,直接引用(include_once('e4phpconsole.php');),然后使用printout()或者println()等方法就可以看到控制台(console)的输出了

  1. <?php
  2.     header('Content-Type:text/html; charset=utf-8');
  3.    
  4. /**
  5. * edit soolly
  6. * vision:0.5
  7. * php程序引入代码
  8. * 有机会看看怎样写PHP程序的扩展
  9. * 网络上的代码,完善了线程锁,现在接收数据流打印的时候顺序不会乱了
  10. * 一段时间以后计划做成eclipse插件
  11. * 代码发布在http://club.topsage.com/thread-2450808-1-1.html
  12. */
  13.    
  14.     /**
  15.      *
  16.      * 给字符串添加'<br />'
  17.      * @param $s
  18.      */
  19.     function echobr($s)
  20.     {
  21.         echo $s.'<br />';
  22.     }
  23.         
  24.     /**
  25.      *
  26.      * 返回socket对象
  27.      */
  28.     function getSocket(){
  29.         $service_port = '8281';
  30.  
  31.         $address = '127.0.0.1';
  32.  
  33.         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  34.         
  35.         if ($socket === false) {
  36.             echobr( "socket创建失败: 原因: " . socket_strerror(socket_last_error()) );
  37.             return false;
  38.         } else {
  39.             //echobr( " socket 创建OK.");
  40.         }
  41.         
  42.         $result = socket_connect($socket, $address, $service_port);
  43.         if ($result === false) {
  44.             echobr( "socket连接失败。 <br/> 原因: ($result) " . socket_strerror(socket_last_error($socket)) );
  45.             return false;
  46.         } else {
  47.             //echobr( "socket 连接 OK.");
  48.         }
  49.         return $socket;
  50.     }
  51.    
  52.     //关闭socket
  53.     function closeSocket($socket){
  54.             //var_dump(socket_get_option($socket, SOL_SOCKET, SO_SNDBUF));
  55.             socket_close($socket);
  56.             //echobr( "socket 关闭 OK.");
  57.     }
  58.    
  59.     /**
  60.      *
  61.      * 向控制台监听的端口输出
  62.      * @param $s
  63.      */
  64.     function printconsole($s){
  65.             $S_EOF = "END";
  66.             if(preg_match("/(.*/n)($S_EOF)(/n.*)/", $s)){
  67.                     $s=preg_replace("/(.*/n)($S_EOF)(/n.*)/","$1//$S_EOF$3", $s);
  68.             }
  69.         $s .= ' -- '.$_SERVER['SCRIPT_FILENAME'];
  70.         $in = $s . "/n" . $S_EOF;
  71.              $socket = getSocket();
  72.         socket_write($socket, $in, strlen($in));
  73.         closeSocket($socket);
  74.         //echobr($s.'------------------------------------- : '.date('h:i:s').'<hr />');
  75.     }
  76.     /**
  77.      *
  78.      * 页面输出不换行,控制台每个输出都换行
  79.      * @param $s
  80.      */
  81.     function printout($s){
  82.             echo $s;
  83.             printconsole($s);
  84.     }
  85.    
  86.     /**
  87.      *
  88.      * 页面输出换行,控制台每个输出换行
  89.      * @param $s
  90.      */
  91.     function println($s){
  92.             echobr($s);
  93.             printconsole($s);
  94.     }
  95. ?>
复制代码

[PHP]示例:

  1. include_once('e4phpconsole.php');
  2.  
  3. println("0asa/nEND/nsda");
  4. println("1");
  5. println("2");
  6. printout("3");
  7. printout("4");
  8. printout("5");
  9. printout("6");
  10. printout("7");
  11. printout("8");
  12. printout("9");
复制代码

以下的下载地址更新比较慢,想用最新的版本请到EC4P SVN下载。不用安装svn客户端也可以,上面放的是zip的,直接选择相应的版本就可以了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值