V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
OneAPM
V2EX  ›  PHP

让程序员不再苦逼的四大神器

  OneAPM · 2015-06-30 10:02:07 +08:00 · 17903 次点击
这是一个创建于 3463 天前的主题,其中的信息可能已经有所发展或是发生改变。

做程序猿「媛」是一个苦逼的活,大周六地早起在技术群里招呼,看到没有啥人响应,说了一句,「估计都没有醒」,然后一位哥们抛过来,「在加班」 !

做 Web 开发更是一个苦逼的活,不像是做 iOS,搞定客户端,基本上就万事大吉了。做 Web 开发不仅仅是要做后端,前端也需要了解和熟悉!

做前后端通吃的 DevOps 全栈工程师绝对是最苦逼的活,不但需要做开发,而且还要了解运维、优化,不会运维的工程师绝对不是一个好架构师!

但所幸的事,一个优秀的工程师尽管很忙,尽管要熟悉前后端、系统、运营、优化,但是在他的工具箱里,放着一大堆工具,让这种生活变得不那么苦逼。

这里就介绍四个让我们 DevOps 生活变得美好的神器。分别是 Xdebug、XHProf 、OneAPM 和 SocketLog。

Xdebug

作为开发人员,睡得最踏实的事是对自己写的代码了如指掌,无论是从功能层面,还是性能层面。而做 Web PHP 开发,比较棘手的一件事情就是代码的调试。作为脚本语言,在远程服务器端运行,客户端生成的全是 HTML 代码,一般认为我们无法准确地调试运行的情况,更不要说单步调试、变量监控等事情了。其实这是有误解的,有一个 PHP 扩展 Xdebug 能让方便地让我们调试远程服务器上运行的代码。

方法很简单,从 Xdebug 下载最新版的源代码。
wget 解压:

tar –zxvf xdebug-2.3.3.tgz
cd xdebug-2.3.3
phpize
./configure –with-php-config=/usr/bin/php-config
make
make install

再增加相应的配置到 php.ini ,需要注意有两点:

1. xdebug 是 zend_extension

2. 端口默认是 9000,和 php-fpm 的缺省端口冲突,所以这里换用 9100

[xdebug]
zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9100

这样就装好了,就是如此简单,下面我们可以开始使用了。以 ThinkPHP 应用开发做例子吧。ThinkPHP 典型的单入口应用,调用层次相对复杂。所以想要了解调用堆栈还是比较麻烦的。要想得到某一行的调用堆栈,可以使用 PHP 自带的 debug_backtrace 函数可以获得,但是不怎么形象,返回来一个数组而已。而 Xdebug 就能让这一切可视化起来。

配合 Xdebug 使用的是 Netbeans 自带的调试工具。首先通过首选项修改了一下 PHP 调试的端口,从9000改成9100,其他不用动。注意在第一行停止是选上的,这将在 PHP 程序调试时,运行到第一行 PHP 代码时停止,在 ThinkPHP 中,即入口文件 index.php 的第一行停止。

让程序员不再苦逼的四大神器

在本例中,笔者做了一个租车管理系统的示例,项目名为 zuches。将代码部署在 http://localhost/zuches 能访问的地方,索引文件是 index.php。

让程序员不再苦逼的四大神器

由于 index.php 是入口文件,所以在 index.php 上点击右键,选择调试。

让程序员不再苦逼的四大神器

然后 Netbeans 自动打开了如下地址,进入调试状态 :http://localhost/zuches/index.php?XDEBUG_SESSION_START=netbeans-xdebug
同时运行位置指示停留到了 index.php 的第一行。如下:

让程序员不再苦逼的四大神器

点击继续运行,由于在 IndexController.class.phpindex 方法中加上了断点,所以位置指示又停留在了相应的断点处。

让程序员不再苦逼的四大神器

这个时候,我们可以查看中断时候的调用堆栈和变量了。通过堆栈可以方便地定位到各定位的类和相应方法。

让程序员不再苦逼的四大神器

各种变量,无论是局部变量和实例属性,无论是 cookie,还是提交数据,都能在变量表中看到,一目了然。

让程序员不再苦逼的四大神器

总之,Xdebug 让我们即使做的是服务器端页面和 API 开发,也可以像桌面应用开发一样,调试每一行代码了。

Xdebug 除了使用来进行单步调试之外,还能收集请求中的执行日志,记录每一个函数的执行过程。这些日志可以用 wincachegrind 等工具进行分析,看到函数的调用栈和所花的时间。这里不再赘述,我们也不是很推荐,因为 XHProf 在这块要轻量级和强大的多,不用如此费劲地下载日志,分析日志。

XHProf

如前文所述,对于 PHP 中函数调用栈和性能分析,XHProf 将 Xdebug 开的先河继承并发扬光大。XHProf 也是 PHP 扩展,不过不建议从 http://pecl.php.net/package/xhprof 上下载,版本已有近2年没有更新了,最好从 https://github.com/phacility/xhprof 上下载。下载编译配置和使用过程都很简单。

配置只需要加上如下两行:

[xhprof]
extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xhprof.so

然后将要相应的 XHProf 代码配置到需要监控的页面中,即可以获得整个页面的执行中,各函数的调用报表。XHProf 提供了示例,配置成功运行如下:

让程序员不再苦逼的四大神器

如何看到上面图中的效果呢?将 examplesxhprof_htmlxhprof_lib 三个目录放到浏览器能访问到的地方,比如 localhost 的主目录内。修改 examples/sample.php 中的 <xhprof-ui-address> 换成 如:localhost/xhprof_html/。即可。

然后访问 http://localhost/examples/sample.php 即可以得到输出结果如下:

让程序员不再苦逼的四大神器

examples/sample.php 中可以看到,对于页面的监测分析,在页面顶部使用 xhprof_enable 开始,而性能的分析的结束,则是在页面底部使用 xhprof_disable 结束 。这样每次监控,都需要增加一段代码,所以为了规范起见。对 XHProf 相关的操作进行了封装。继续采用上例 ThinkPHP 版租车系统的例子,看看如何集成 XHProf 分析。

首先将对 XHProf 的操作封装成了一个类。

<?php
class XHProf
{

    private static $strNameSpace = "";
    public static function init($strNameSpace = "myhome")
    {
        if (!function_exists("xhprof_enable"))
        {
            return;
        }
        self::$strNameSpace = strval($strNameSpace);

        $param = XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY;

    $path = getcwd();
        require_once $path.'/../xhprof_lib/utils/xhprof_lib.php';
        require_once $path.'/../xhprof_lib/utils/xhprof_runs.php';
        xhprof_enable($param);

        register_shutdown_function("XHProf::genResult");
    }

    public static function genResult()
    {

        $profiler_namespace = self::$strNameSpace;
        $xhprof_data = xhprof_disable();
        $xhprof_runs = new XHProfRuns_Default();
        $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
        $profiler_url = sprintf('http://' . $_SERVER['HTTP_HOST'] . '/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
        echo '<p style="position:absolute; left:0; top:0; background:orange; padding:8px;">'
        . '<a href="' . $profiler_url . '" target="_blank">Profiler output</a></p>';
    }

}

在这个封装的类中,首先检测了 xhprof_enable 函数是否存在,这可以用于判断是否成功安装配置了 xhprof 扩展。其次设置了参数,特别值得一提的是使用函数 register_shutdown_function 来注册一个操作,这个操作在页面结束之前,会自动运行。

这样,在分析页面性能之时,只需要在 ThinkPHP 应用的 index.php 上加上两行,即可以了。

比如:

require_once "xhprof.php";
XHProf::init("zuches");

运行后,得到如下效果:

让程序员不再苦逼的四大神器

并且每一个页面,都有这样的输出。点击「Profiler output」即得到了报表。

让程序员不再苦逼的四大神器

在本例中,可以看到最后的集成方法,运行时间超过了2 S,是值得关注并优化了。从报表中,可以首先看到各个方法或者函数的调用次数,运行时间,以及可以层层点进去看到父子层级的调用关系 。

需要注意的是,在线上,如上使用 XHProf 要慎重,即使打开,也要有限制条件地打开,比如当前用户是某些调试开发者用户时才打开。否则,普通用户看到这样的输出,则不明所以,给用户带来困惑,当然,我们也可以不输出,而将数据直接存储,在后台系统中查看,这样用户就感受不到了。有一个工具,可以完全消除这些纠结。那就是 OneAPM,在第四部分我们再介绍。

SocketLog

作为程序员,除了新功能开发之外,最常见的一个工作就是查错,尤其是远程用户的查错,还是一个很痛苦的过程。当前又加上了微信开发,API 开发等操作。对于微信内、API 由远程用户所调用的时候,情况多变,查错也更加地麻烦。这个时候,我们的第三个神器登场了。那就是 SocketLog。

SocketLog 是国内知名 PHP 开发者罗飞的作品,罗飞是 ThinkPHP 的核心开发者,也是优才学院全栈工程师主力讲师。现任三生社群 CTO。SocketLog 的 github 地址为:https://github.com/luofei614/SocketLog ,在项目的主页上,详细地介绍了用法和所用的技术。这里简单地汇总讲解一下。

SocketLog 的使用,主要要分成三个步骤,第一步是安装 Chrome 插件。可以从 github 下载的安装包中去安装,或者可以从 Chrome 应用商店下载。

第二步是需要启动 Socket 服务,Socket 服务是 WebSocket 协议的,早期版本是 PHP 编写的服务器,新的版本已经使用 Node.js 来实现了。启动方法很简单,进入解压后的目录。

执行 node server/index.js 即可。

安装好插件之后,就在 Chrome 上看到如下图标。灰色表示没有连接上。

让程序员不再苦逼的四大神器

同时启动了服务器,做好设置,就会看到图标变成蓝色了。

让程序员不再苦逼的四大神器

需要注意的是,尽管我们这里监听地址配置成了本地地址,其实也可以配置远程地址。不过远程地址的话记得打开服务器上的防火墙,因为一般1229端口在防火墙中是关闭的。

SocketLog 的原理,是在服务器端,往 WebSocket 服务器上写数据,作为客户端的 Chrome 插件,即能收到数据。所以不管是远程 API 调用,还是网页访问,只要在程序中往这个 WebSocket 服务器写了数据,只要监听了这个 Websocket 服务的客户端都能收到相应的调试日志。

第三步是埋代码。使用方法也很简单。比如我们在上面的 ThinkPHP 的 index.php 加入两行代码。会看到如下输出 。

让程序员不再苦逼的四大神器

然后我们在其他终端上也访问一下这台机器的这个页面地址,看看是否能得到输出呢?开始没有任何输出效果。因为缺省情况下是不记录普通用户所调用的 slog 的。

在 slog 之上的语句加上这一行,就有了。

slog(array('force_client_id'=>'test'),'set_config');

Test 这个插件的用户,收到了所有的 slog 消息。如下图所示:

让程序员不再苦逼的四大神器

并且这种输出 ,无论是别的用户触发,而还后台服务程序,均可以输出 。所以非常地方便,开发人员在自己的机器上就收集到了想要收集的用户所触发的调试信息。

然后为了体现对 SQL 语句的监听。我们在 ThinkPHP/Library/Think/Db/Driver.class.php 的第1139行加上 slog($str),然后再访问页面,就得到了如下输出 ,可见实现了对 SQL 日志的监控。

SocketLog 的功能看起来虽然简单,但是却非常有用、好用,是不可多得的开发神器。有关 SocketLog 的更多介绍和使用说明,建议现在就立刻下载,并且进入 github 主页好好地研究吧!

OneAPM

从上面的使用来看,SocketLog 和 XHProf 都有两个不足之处,一是需要埋代码,二是只是基于单独一个页面会话的。而 OneAPM 相对来讲,就更强大了,可以理解为云端 SaaS 版的 XHProf 和更强大的 SocketLog。不过有着更为强大的优势。比如:

  1. OneAPM 的 PHP 探针,安装完成之后,并不需要在代码中埋入任何代码。

  2. 在数据收集的过程中,不需要开发和运维的参与,探针全自动收集,并提交到远程服务器。

  3. 由于数据累积,所以支持历史报表,以及比 XHProf 和 SocketLog 更丰富的功能。

  4. PHP 只是 OneAPM 所支持的一种语言,它可以支持多种语言,HTML5、iOSAndroidJava.NETpythonNode.jsPHPruby等。

OneAPM 的安装过程也比较简单,不过由于是 SaaS 服务,所以得上官网注册一个账号。登录了之后,在应用程序里,点击添加,再选中 PHP,就进入了安装探针的说明。

让程序员不再苦逼的四大神器
分为如下几步:

1. 获取授权编号

OneAPM 授权凭证,用于配置和身份识别。

2. 下载 OneAPM PHP agent 安装程序

3. 解压 OneAPM PHP Agent

tar -xzf OneAPM_php_Agent_2.3.11.tar.gz

4. 安装 OneAPM PHP Agent

  • 定位路径至您的安装包所在文件夹
cd oneapm-php5-linux-install-script
  • 执行安装命令
sudo ./oneapm-install install

5. 输入 License Key

请点击步骤1中的「生成授权编号按钮」成功安装,界面如下:
让程序员不再苦逼的四大神器

若出现以下信息,则代表安装成功。

OneAPM is now installed on your system. Congratulations!

当页面出现以下提示时,启动 Daemon

And then start php-agent in /usr/bin/oneapm-daemon

运行以下指令来启动 Daemon

sudo /usr/bin/oneapm-daemon

重启 Apache 或你使用的 web 调度程序 「如 php-fpm 」

6. 静候5分钟,开启 OneAPM 之旅

静候5分钟,等待应用程序向 OneAPM 发送应用程序性能数据,即可开始使用 OneAPM 应用性能管理。

OneAPM 收集的数据很丰富。将收集的响应时间数据,分为四个大块:

  • Web 事务,就是页面业务逻辑本身

  • 数据库,数据库的连接和数据读取

  • 错误统计,对所有类型的错误做了归类统计

  • 外部服务,即外部 API 等的设备

以笔者的站点为例,12小时的数据如下图:

让程序员不再苦逼的四大神器

从上面这个图,我们看到响应时间,慢的达到了600 ms 以上,那是什么导致的呢?我们可以分别查看:

让程序员不再苦逼的四大神器

可见 Web 事务比较稳定,可以比较清楚地看到平均的响应时间在 50ms-75ms之间。

让程序员不再苦逼的四大神器

数据库响应时间也很短,在几 ms 这个级别。而外部服务就明显在几百 ms 这个级别,还有的高达 600 ms 。

让程序员不再苦逼的四大神器

不说别的,就通过这简单的报表,从目前看,就可以定位到,想要做优化,从外部服务的响应时间上下手优化,带来的效果是最大的。

下面我们再来看看三个细化一层的报表 ,在 Web 事务统计中,尽管平均数很低,但是也列出了响应时间最长的5个请求。如下:

让程序员不再苦逼的四大神器

从上面的数据可以看出,响应时间最长的几个,主要突出在 bind.php,这个是负责 QQ 登录的请求,需要向腾讯请求数据。

而在数据库一栏中,可以看到最慢的5个表格的情况。

让程序员不再苦逼的四大神器

在外部的服务中,果不出所料,是对微博、微信、QQ 登录、七牛上传、支付宝通知等外部服务,所占时间最长。如下图所示。

让程序员不再苦逼的四大神器

这只是普通的统计报表,对于具体的某一个慢的页面,更有详细的调用分析。

比如上面的 bind.php ,果真最慢的是从网络上获取数据。也就是说,第三方登录时,从第三方网站取数据花了绝大部分时间。 去查看详情,有两个不足之处,一是需要埋代码,二是只是基于单独一个页面会话的。而 OneAPM 称为慢事务追踪,拉到页面的最底部就能看到。

让程序员不再苦逼的四大神器

让程序员不再苦逼的四大神器

在后台报表中,我们同样也能看到是哪些 SQL 语句慢。比如如下是 bind.php 中慢的 SQL 语句。

让程序员不再苦逼的四大神器

更为重要的是,还有所有错误信息的收集,也一目了然。

让程序员不再苦逼的四大神器

所以无论从功能之强大,还是易用之方便,有两个不足之处,一是需要埋代码,二是只是基于单独一个页面会话的。而 OneAPM 不愧是商业化的 SaaS 服务,比 XHProf 胜去了不少。在笔者的项目中,已经大量使用。并取得了好的效果。

以上四个项目,让我们对自己所写的代码,更加成竹在胸,无论是执行过程还是调优着手了都有了充分的把握。特意对比,汇总整理的这四大神器,希望它们能改善每一位 PHP 开发者的生活,让我们的 PHP 开发不再那么地苦逼!

第 1 条附言  ·  2015-06-30 14:43:35 +08:00
因为评论有问到关于安全性和性能的问题,所以统一回复下:

OneAPM 从如下几方面确保安全性:

1.过滤 URL 中的敏感信息:通过配置关键字进行过滤,如 password、credit,对于需要过滤的内容可以自行增加关键字;

2.过滤 SQL 语句中的参数:默认是用“ ? ” 号代替,如果定位问题需要可以打开此项配置即可;

3.探针与 Server 端使用 https 加密传输数据:杜绝被抓包分析;

4.提供审计模式:打开审计模式可以看到所有传出数据;

性能影响:

简单介绍一下 PHP 探针原理吧,通过插件方式完成数据采集,在 Transaction 相关过程进行埋点,过程的出入打时间戳,收集性能数据,没有特别消耗 CPU 的逻辑,假设一个应用 Server 每分钟处理 100w 并发,对 OneAPM 来说只是最终是某个 Transaction 的吞吐量( cpm )值为100w,数据量也不会增加很多。数据采集过程中采用的是国际通用的采样策略,在高负载的时候会降低采样频率,确保不会影响用户的业务代码的执行,因此探针不会占用很多内存和CPU。
70 条回复    2015-07-11 18:52:54 +08:00
patosky
    1
patosky  
   2015-06-30 10:07:59 +08:00
点赞。
RyuZheng
    2
RyuZheng  
   2015-06-30 10:10:03 +08:00
虽然我也挺喜欢OneAPM,也很支持,但是最好不要全文转载-_-#
yakczh
    3
yakczh  
   2015-06-30 10:10:35 +08:00
http://www.oschina.net/question/2395949_241426
这些相对tp来说都是毛毛雨, tp才是真正的神器
ruchee
    4
ruchee  
   2015-06-30 10:11:29 +08:00   ❤️ 1
v2ex的软文越来越有技术含量了,写的不错,支持
tini22
    5
tini22  
   2015-06-30 10:16:20 +08:00
身为phper,何来不苦逼只说?
q84629462
    6
q84629462  
   2015-06-30 10:16:27 +08:00 via Android
现在做广告也是幸苦
owei
    7
owei  
   2015-06-30 10:19:21 +08:00
点赞,很好的解说
49
    8
49  
   2015-06-30 10:19:27 +08:00 via iPad
软得不错!
pingplusplus开了v2ex软文先河呀,软得越来越有意思了。
stevenhu888
    9
stevenhu888  
   2015-06-30 10:20:40 +08:00
@q84629462 哈哈,我刚才反应过来
sunyang
    10
sunyang  
   2015-06-30 10:24:57 +08:00
第一次看到写的这么好的软文,软文都这么写多好。点赞
imn1
    11
imn1  
   2015-06-30 10:35:12 +08:00   ❤️ 1
还以为是充气娃娃、抱枕、撸具、伟哥……
silvernoo
    12
silvernoo  
   2015-06-30 10:40:21 +08:00
这软文写得真不容易
Kilerd
    13
Kilerd  
   2015-06-30 10:41:59 +08:00
然而 Win 用户 哭死在厕所
laoyur
    14
laoyur  
   2015-06-30 10:43:32 +08:00
广告真的越来越难做了
guesskiss
    15
guesskiss  
   2015-06-30 10:50:25 +08:00 via Android
为了一篇硬广,码这么多字,就为了把自己的产品混进去,也蛮辛苦的,好多人没那么多心思去看完整篇文章,还没看到oneapm就关了页面,建议楼主把自己产品排到首位
yingluck
    16
yingluck  
   2015-06-30 10:51:57 +08:00
请把标题改成 《使使用世界上最好的语言的程序员不再苦逼的四大神器》
realpg
    17
realpg  
   2015-06-30 10:53:05 +08:00   ❤️ 1
这软文真软,是一个很软很软的软妹子写的吧,口水ing
BuilderQiu
    18
BuilderQiu  
   2015-06-30 11:25:27 +08:00
1.昨天还是早上在车上貌似在那儿看到过了
2.没细看,貌似是针对PHP吧
3.日完
MarineLv
    19
MarineLv  
   2015-06-30 11:33:14 +08:00   ❤️ 1
这年头写软文不来点干货都没法出来混了。
干货确实不错,点赞
josephok
    20
josephok  
   2015-06-30 13:07:30 +08:00
说的都是最好的语言。
Axurez
    21
Axurez  
   2015-06-30 13:08:57 +08:00
"做程序猿「媛」"是啥意思?
xieren58
    22
xieren58  
   2015-06-30 13:10:40 +08:00
到后面才发现,软文。。
lijinma
    23
lijinma  
   2015-06-30 13:12:57 +08:00
@OneAPM

使用 OneAPM 或者 NewRelic,我有两个担心的地方,麻烦解答。

(1)安全吗?

(2)数据量上去了,如果所有数据都搜集,会不会占用很多内存?
OneAPM
    24
OneAPM  
OP
   2015-06-30 13:22:56 +08:00
@lijinma

(1)答:Agent 只收集性能数据,非性能数据在本地就过滤掉的。

(2)答:不会占用很多内存,现在采用的是国际通用的采样策略,在高负载的时候会降低采样频率,保证不会影响业务代码的执行。
crossmaya
    25
crossmaya  
   2015-06-30 14:32:36 +08:00
软文越来越。。。。
sumhat
    26
sumhat  
   2015-06-30 15:04:23 +08:00   ❤️ 1
让程序员不再苦逼的最大神器:不用 PHP

:doge:
vibbow
    27
vibbow  
   2015-06-30 15:25:21 +08:00
OneAPM的网站好慢...
打了一分钟愣是没打开...
光加载出来了个Title,连页面都加载不出来...
g8287694
    28
g8287694  
   2015-06-30 15:57:07 +08:00
Xdebug 一直调教不好 每次都用不了
iichenbf
    29
iichenbf  
   2015-06-30 17:17:58 +08:00
你们程序员很苦逼吗
cxl008
    30
cxl008  
   2015-06-30 17:35:05 +08:00
PHP 是最好的语言?
都是PHP的。。。能讲的别的不?
duoglas
    31
duoglas  
   2015-06-30 17:37:09 +08:00
why php?
quericy
    32
quericy  
   2015-06-30 18:25:27 +08:00
我竟然按了两次空格键翻页才发现这是软文。。。
OneAPM
    33
OneAPM  
OP
   2015-06-30 18:29:34 +08:00
@quericy ╮(╯▽╰)╭
POP
    34
POP  
   2015-06-30 18:30:53 +08:00
神器啊
hellokittyer
    35
hellokittyer  
   2015-06-30 18:34:32 +08:00 via Android
功能不错,但是看到第三方就不想用
young
    36
young  
   2015-06-30 18:38:40 +08:00
赞啊!!!
TangMonk
    37
TangMonk  
   2015-06-30 18:59:09 +08:00
和NewRelic有啥优势呢
lazyyz
    38
lazyyz  
   2015-06-30 19:27:08 +08:00
软的不行啊,没看完……
lijinma
    39
lijinma  
   2015-06-30 19:54:13 +08:00
@OneAPM 多谢
sobigfish
    40
sobigfish  
   2015-06-30 20:00:27 +08:00
居然还要Daemon不能像NewRelic一样不侵入系统么
msg7086
    41
msg7086  
   2015-06-30 21:56:20 +08:00
是是程序员都只写PHP。
initdrv
    42
initdrv  
   2015-06-30 22:09:59 +08:00   ❤️ 1
大神啊,我不知道说的什么……
不明觉厉,点赞!
lu18887
    43
lu18887  
   2015-06-30 23:11:49 +08:00
干货多!可惜我不是搞WEB的……
Yien
    44
Yien  
   2015-07-01 00:14:48 +08:00 via iPhone
哇哦!感谢🙏
bdbai
    45
bdbai  
   2015-07-01 00:18:02 +08:00 via iPhone
@quericy 按住也能发现
biggun
    46
biggun  
   2015-07-01 05:48:39 +08:00 via iPhone
TL;DR
放下php,珍惜绳命
vibbow
    47
vibbow  
   2015-07-01 05:52:13 +08:00
居然不支持Windows!
dslwind
    48
dslwind  
   2015-07-01 08:23:18 +08:00 via Android
这广告做得好,我选择rails
Anybfans
    49
Anybfans  
   2015-07-01 08:39:35 +08:00
看了半天全是PHP、、、、、、、、
yuankui
    50
yuankui  
   2015-07-01 09:33:40 +08:00
好软...
niancode
    51
niancode  
   2015-07-01 09:48:30 +08:00
@g8287694
@iichenbf
程序员是可以改变世界的!
niancode
    52
niancode  
   2015-07-01 09:55:19 +08:00
php是最好的语言。 @Anybfans
Andrewliu
    53
Andrewliu  
   2015-07-01 09:57:53 +08:00
PHP是世界最好的语言!
breeswish
    54
breeswish  
   2015-07-01 10:00:11 +08:00
喜欢这种有干货的软文 :-)
niancode
    55
niancode  
   2015-07-01 10:05:22 +08:00
@v2ex 这个软文真好!
niancode
    56
niancode  
   2015-07-01 10:05:55 +08:00
@1000010 这个软文真好!
qinglangee
    57
qinglangee  
   2015-07-01 10:12:11 +08:00
@OneAPM oneapm 有提供本地保存统计数据的接口吗
OneAPM
    58
OneAPM  
OP
   2015-07-01 10:21:01 +08:00
@qinglangee 我们暂时没有提供本地存储,可以详细描述下您的需求吗?
iam36
    59
iam36  
   2015-07-01 11:34:12 +08:00
兄弟是买软件的吗?:D
OneAPM
    60
OneAPM  
OP
   2015-07-01 11:35:36 +08:00
@iam36 😂 算是吧。。。其实是卖服务的。
cyanhu
    61
cyanhu  
   2015-07-01 11:37:19 +08:00
PHP是世界最好的语言!
cyanhu
    62
cyanhu  
   2015-07-01 11:37:34 +08:00
PHP是世界上最好的语言!
cyanhu
    63
cyanhu  
   2015-07-01 11:37:51 +08:00
JAVA是世界上最好的语言!
anubiskong
    64
anubiskong  
   2015-07-01 11:38:06 +08:00
xdebug都成神器了....是我起床的姿势不对吗
cyanhu
    65
cyanhu  
   2015-07-01 11:38:08 +08:00
Python是世界上最好的语言!
es0ramme
    66
es0ramme  
   2015-07-01 13:10:22 +08:00
PHP是世界上最好的语言(づ ̄ 3 ̄)づ
cys
    67
cys  
   2015-07-01 13:44:38 +08:00
qi guai de shi, juran mei you ren ti PhpStorm.
Pacer
    68
Pacer  
   2015-07-01 15:57:49 +08:00
原来真的是是认真介绍工具~
jamlee
    69
jamlee  
   2015-07-02 14:38:34 +08:00
blackfire 在国外用的比较多,和onepam一样
hjkl0001
    70
hjkl0001  
   2015-07-11 18:52:54 +08:00
学习了。。。谢谢!!!
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 18:09 · PVG 02:09 · LAX 10:09 · JFK 13:09
Developed with CodeLauncher
♥ Do have faith in what you're doing.