最近几天试用了一下 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 的作者恶心过,也一直在保持更新。
其他优点就不多吹了,官网上都有。