Site Overlay

谈谈 Easyswoole 使用感受

最近几天试用了一下 Easyswoole。就目前版本,先说说缺点吧:

ORM 非常简陋

用过 Hibernate 之类的都知道,ORM 的核心在于“映射”、“持久化”等,而 Easyswoole 的 ORM 好像仅仅是把 MySQL 语句套了个 Model 的皮。例如查询语句,Easyswoole 是这样的:

$res = UserModel::create()->get([
  'u_id'    => 1,
  'u_state' => 0,
  'is_vip'  => 1
]);

Medoo 是这样的:

$res = $db->get(self::table, "*",[
  'u_id'    => 1,
  'u_state' => 0,
  'is_vip'  => 1
]);

然后一些基本的功能也没有,比如 has ,我需要手动写一个函数,对 count 判断。

缺少事件监听,造成入口类臃肿

这个倒是可以通过另外抽离类,然后调用类方法解决。

不过如果直接内置一个发布订阅模式,可能会更好。

文档和代码规范问题

首先是文档不太规范,比如中文夹杂英文,英文两边要不要空格没有统一。一段话后面有没有句号,也没有统一。

然后是设计不太符合 HTTP 协议规范。比如 RFC 2616 规范规定 HTTP Header 是大小写不敏感的,但是官方设计是大小写敏感的,也就是你用 getHeader("host")getHeader("Host") 获取的结果是不同的。这一点我向他们提出了建议,不过遭到了拒绝。

在代码中,我看到很多多层 if 的情况:

protected function stop()
{
    $pidFile = Config::getInstance()->getConf("MAIN_SERVER.SETTING.pid_file");
    $msg = '';
    if (file_exists($pidFile)) {
        $pid = intval(file_get_contents($pidFile));
        if (!\Swoole\Process::kill($pid, 0)) {
            $msg = Color::danger("pid :{$pid} not exist ");
            unlink($pidFile);
        } else {
            $force = CommandManager::getInstance()->issetOpt('force');
            if ($force) {
                \Swoole\Process::kill($pid, SIGKILL);
            } else {
                \Swoole\Process::kill($pid);
            }
            //等待5秒
            $time = time();
            while (true) {
                usleep(1000);
                if (!\Swoole\Process::kill($pid, 0)) {
                    if (is_file($pidFile)) {
                        unlink($pidFile);
                    }
                    $msg = "server stop for pid {$pid} at " . date("Y-m-d H:i:s");
                    $msg = Color::success($msg);
                    break;
                } else {
                    if (time() - $time > 15) {
                        $msg = Color::danger("stop server fail for pid:{$pid} , try [php easyswoole server stop -force] again");
                        break;
                    }
                }
            }
        }
    } else {
        $msg = Color::danger("pid file does not exist, please check whether to run in the daemon mode!");
    }
    return $msg;
}

这让人感觉很不专业,因为稍有经验的程序员都明白一个短路原则,能提前 return / continue 的判断分支,就尽量提前 return / continue。

开源社区的包容问题

Easyswoole 似乎不太喜欢接受组外开发者的 PR。我看到一个很好的建议,那人提出把 require 前的 file_exists 改成 is_file,可以提高性能并且避免 require 目录的情况。然而 Easyswoole 的作者没有进行任何回复,直接关闭了这个 PR。我认为拒绝 PR 是很正常的,不过或许起码可以说明一下原因。大家也是希望这个框架更好才来贡献代码,不是吗?

下面再说说优点:

稳定和高性能

Easyswoole 是历史比较久的基于 swoole 的框架。不断优化,现在的稳定性和性能都非常好。

对小白友好的文档

Easyswoole 在文档中不胜其烦地回答和预警各种小白问题,对于初学者是比较友好的。

持久的更新

看得出来 Easyswoole 的作者对 PHP 是热爱的,即使他曾经被 swoole 的作者恶心过,也一直在保持更新。

其他优点就不多吹了,官网上都有。

发表评论

电子邮件地址不会被公开。 必填项已用*标注